Example #1
0
/**
 * Register a connection between two post types.
 *
 * This creates the appropriate meta box in the admin edit screen.
 *
 * Takes the following parameters, as an associative array:
 *
 * - 'name' - string A unique identifier for this connection type.
 *
 * - 'from' - string|array The first end of the connection.
 *
 * - 'from_query_vars' - array Additional query vars to pass to WP_Query. Default: none.
 *
 * - 'to' - string|array The second end of the connection.
 *
 * - 'to_query_vars' - array Additional query vars to pass to WP_Query. Default: none.
 *
 * - 'fields' - array( key => Title ) Metadata fields editable by the user. Default: none.
 *
 * - 'cardinality' - string How many connection can each post have: 'one-to-many', 'many-to-one' or 'many-to-many'. Default: 'many-to-many'
 *
 * - 'prevent_duplicates' - bool Whether to disallow duplicate connections between the same two posts. Default: true.
 *
 * - 'sortable' - bool|string Whether to allow connections to be ordered via drag-and-drop. Can be 'from', 'to', 'any' or false. Default: false.
 *
 * - 'title' - string|array The box's title. Default: 'Connected {$post_type}s'
 *
 * - 'from_labels' - array Additional labels for the admin box (optional)
 *
 * - 'to_labels' - array Additional labels for the admin box (optional)
 *
 * - 'reciprocal' - bool For indeterminate connections: True means all connections are displayed in a single box. False means 'from' connections are shown in one box and 'to' connections are shown in another box. Default: false.
 *
 * - 'admin_box' - bool|string|array Whether and where to show the admin connections box.
 *
 * - 'can_create_post' - bool Whether to allow post creation via the connection box. Default: true.
 *
 * @param array $args
 *
 * @return bool|object False on failure, P2P_Connection_Type instance on success.
 */
function p2p_register_connection_type($args)
{
    if (!did_action('init')) {
        trigger_error("Connection types should not be registered before the 'init' hook.");
    }
    $argv = func_get_args();
    $args = _p2p_back_compat_args($argv);
    if (isset($args['name'])) {
        if (strlen($args['name']) > 32) {
            trigger_error(sprintf("Connection name '%s' is longer than 32 characters.", $args['name']), E_USER_WARNING);
            return false;
        }
    } else {
        trigger_error("Connection types without a 'name' parameter are deprecated.", E_USER_WARNING);
    }
    // Box args
    if (isset($args['admin_box'])) {
        $metabox_args = _p2p_pluck($args, 'admin_box');
        if (!is_array($metabox_args)) {
            $metabox_args = array('show' => $metabox_args);
        }
    } else {
        $metabox_args = array();
    }
    foreach (array('fields', 'can_create_post') as $key) {
        if (isset($args[$key])) {
            $metabox_args[$key] = _p2p_pluck($args, $key);
        }
    }
    // Column args
    if (isset($args['admin_column'])) {
        $column_args = _p2p_pluck($args, 'admin_column');
    } else {
        $column_args = false;
    }
    $ctype = P2P_Connection_Type_Factory::register($args);
    if (is_admin()) {
        P2P_Box_Factory::register($ctype->name, $metabox_args);
        P2P_Column_Factory::register($ctype->name, $column_args);
    }
    return $ctype;
}
            }
        }
    }
    /**
     * Controller for all box ajax requests.
     */
    static function wp_ajax_p2p_box()
    {
        check_ajax_referer(P2P_BOX_NONCE, 'nonce');
        $ctype = p2p_type($_REQUEST['p2p_type']);
        if (!$ctype || !isset(self::$box_args[$ctype->name])) {
            die(0);
        }
        $post_type = get_post_type($_REQUEST['from']);
        if (!$post_type) {
            die(0);
        }
        $directed = $ctype->set_direction($_REQUEST['direction']);
        if (!$directed) {
            die(0);
        }
        $box = new P2P_Box(self::$box_args[$ctype->name], $directed, $post_type);
        if (!$box->check_capability()) {
            die(-1);
        }
        $method = 'ajax_' . $_REQUEST['subaction'];
        $box->{$method}();
    }
}
P2P_Box_Factory::init();