2020-12-01 21:33

Default Argument Standardization in register_post_type()

When a new custom post type is registered via register_post_type, there's a default argument array that we can manipulate:

    $defaults = array(
        'labels'               => array(),
        'description'          => '',
        'public'               => false,
        'hierarchical'         => false,
        'exclude_from_search'  => null,
        'publicly_queryable'   => null,
        'show_ui'              => null,
        'show_in_menu'         => null,
        'show_in_nav_menus'    => null,
        'show_in_admin_bar'    => null,
        'menu_position'        => null,
        'menu_icon'            => null,
        'capability_type'      => 'post',
        'capabilities'         => array(),
        'map_meta_cap'         => null,
        'supports'             => array(),
        'register_meta_box_cb' => null,
        'taxonomies'           => array(),
        'has_archive'          => false,
        'rewrite'              => true,
        'query_var'            => true,
        'can_export'           => true,
        'delete_with_user'     => null,
        '_builtin'             => false,
        '_edit_link'           => 'post.php?post=%d',

Which of these do we want to take into account when we discuss standardization for all of the custom post types that we've been chatting about recently? For the lazy, here's what each of these arguments is for:

 * Register a post type. Do not use before init.
 * A function for creating or modifying a post type based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post type name.
 *  2.9.0
 *  array      $wp_post_types List of post types.
 *  WP_Rewrite $wp_rewrite    Used for default feeds.
 *  WP         $wp            Used to add query vars.
 *  string $post_type Post type key, must not exceed 20 characters.
 *  array|string $args {
 *     Array or string of arguments for registering a post type.
 *      string      $label                Name of the post type shown in the menu. Usually plural.
 *                                             Default is value of $labels['name'].
 *      array       $labels               An array of labels for this post type. If not set, post
 *                                             labels are inherited for non-hierarchical types and page
 *                                             labels for hierarchical ones. { get_post_type_labels()}.
 *      string      $description          A short descriptive summary of what the post type is.
 *                                             Default empty.
 *      bool        $public               Whether a post type is intended for use publicly either via
 *                                             the admin interface or by front-end users. While the default
 *                                             settings of $exclude_from_search, $publicly_queryable, $show_ui,
 *                                             and $show_in_nav_menus are inherited from public, each does not
 *                                             rely on this relationship and controls a very specific intention.
 *                                             Default false.
 *      bool        $hierarchical         Whether the post type is hierarchical (e.g. page). Default false.
 *      bool        $exclude_from_search  Whether to exclude posts with this post type from front end search
 *                                             results. Default is the opposite value of $public.
 *      bool        $publicly_queryable   Whether queries can be performed on the front end for the post type
 *                                             as part of { parse_request()}. Endpoints would include:
 *                                             * ?post_type={post_type_key}
 *                                             * ?{post_type_key}={single_post_slug}
 *                                             * ?{post_type_query_var}={single_post_slug}
 *                                             If not set, the default is inherited from $public.
 *      bool        $show_ui              Whether to generate a default UI for managing this post type in the
 *                                             admin. Default is value of $public.
 *      bool        $show_in_menu         Where to show the post type in the admin menu. To work, $show_ui
 *                                             must be true. If true, the post type is shown in its own top level
 *                                             menu. If false, no menu is shown. If a string of an existing top
 *                                             level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post
 *                                             type will be placed as a sub-menu of that.
 *                                             Default is value of $show_ui.
 *      bool        $show_in_nav_menus    Makes this post type available for selection in navigation menus.
 *                                             Default is value $public.
 *      bool        $show_in_admin_bar    Makes this post type available via the admin bar. Default is value
 *                                             of $show_in_menu.
 *      int         $menu_position        The position in the menu order the post type should appear. To work,
 *                                             $show_in_menu must be true. Default null (at the bottom).
 *      string      $menu_icon            The url to the icon to be used for this menu. Pass a base64-encoded
 *                                             SVG using a data URI, which will be colored to match the color scheme
 *                                             -- this should begin with 'data:image/svg+xml;base64,'. Pass the name
 *                                             of a Dashicons helper class to use a font icon, e.g.
 *                                             'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty
 *                                             so an icon can be added via CSS. Defaults to use the posts icon.
 *      string      $capability_type      The string to use to build the read, edit, and delete capabilities.
 *                                             May be passed as an array to allow for alternative plurals when using
 *                                             this argument as a base to construct the capabilities, e.g.
 *                                             array('story', 'stories'). Default 'post'.
 *      array       $capabilities         Array of capabilities for this post type. $capability_type is used
 *                                             as a base to construct capabilities by default.
 *                                             { get_post_type_capabilities()}.
 *      bool        $map_meta_cap         Whether to use the internal default meta capability handling.
 *                                             Default false.
 *      array       $supports             An alias for calling { add_post_type_support()} directly.
 *                                             Defaults to array containing 'title' & 'editor'.
 *      callback    $register_meta_box_cb Provide a callback function that sets up the meta boxes for the
 *                                             edit form. Do remove_meta_box() and add_meta_box() calls in the
 *                                             callback. Default null.
 *      array       $taxonomies           An array of taxonomy identifiers that will be registered for the
 *                                             post type. Taxonomies can be registered later with
 *                                             { register_taxonomy()} or { register_taxonomy_for_object_type()}.
 *                                             Default empty array.
 *      bool|string $has_archive          Whether there should be post type archives, or if a string, the
 *                                             archive slug to use. Will generate the proper rewrite rules if
 *                                             $rewrite is enabled. Default false.
 *      bool|array  $rewrite              {
 *         Triggers the handling of rewrites for this post type. To prevent rewrite, set to false.
 *         Defaults to true, using $post_type as slug. To specify rewrite rules, an array can be
 *         passed with any of these keys:
 *          string $slug       Customize the permastruct slug. Defaults to $post_type key.
 *          bool   $with_front Whether the permastruct should be prepended with WP_Rewrite::$front.
 *                                  Default true.
 *          bool   $feeds      Whether the feed permastruct should be built for this post type.
 *                                  Default is value of $has_archive.
 *          bool   $pages      Whether the permastruct should provide for pagination. Default true.
 *          const  $ep_mask    Endpoint mask to assign. If not specified and permalink_epmask is set,
 *                                  inherits from $permalink_epmask. If not specified and permalink_epmask
 *                                  is not set, defaults to EP_PERMALINK.
 *     }
 *      string|bool $query_var            Sets the query_var key for this post type. Defaults to $post_type
 *                                             key. If false, a post type cannot be loaded at
 *                                             ?{query_var}={post_slug}. If specified as a string, the query
 *                                             ?{query_var_string}={post_slug} will be valid.
 *      bool        $can_export           Whether to allow this post type to be exported. Default true.
 *      bool        $delete_with_user     Whether to delete posts of this type when deleting a user. If true,
 *                                             posts of this type belonging to the user will be moved to trash
 *                                             when then user is deleted. If false, posts of this type belonging
 *                                             to the user will *not* be trashed or deleted. If not set (the default),
 *                                             posts are trashed if post_type_supports('author'). Otherwise posts
 *                                             are not trashed or deleted. Default null.
 *      bool        $_builtin             FOR INTERNAL USE ONLY! True if this post type is a native or
 *                                             "built-in" post_type. Default false.
 *      string      $_edit_link           FOR INTERNAL USE ONLY! URL segment to use for edit link of
 *                                             this post type. Default 'post.php?post=%d'.
 * }
 *  object|WP_Error The registered post type object, or an error object.

brought up query_var as something that we might need to explicitly note with each standardization effort. Are there any others above that we should be taking into account with each new CPT thread that we're kicking off?


  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答


  • weixin_39743722 weixin_39743722 5月前

    I think that $query_var and even $rewrite['slug'] should both be discussed in CPT standardization. They could probably be nothing more than "don't override the default", but without explicitly mentioning them, we run the risk of making some of the other standardization somewhat pointless.

    点赞 评论 复制链接分享
  • weixin_39605296 weixin_39605296 5月前

    don't. The point of CPT and meta standards is to provide some portability between plugins, what is the point for url standards?

    点赞 评论 复制链接分享
  • weixin_39743722 weixin_39743722 5月前

    standardization also provides a great benefit to theme developers in not having to explicitly support one plugin vs. another in custom queries, and to users in not perceiving to have lost their content on the front-end or back-end if they chose to switch from one plugin to another.

    I believe that setting a custom $query_var prevents a theme from querying the standardized $post_type as it was originally registered. For users, setting a custom $rewrite['slug'] will create the need for redirects if switching between two plugins that specify different slugs.

    点赞 评论 复制链接分享
  • weixin_39614831 weixin_39614831 5月前

    My intention when creating this project was not to take things this far. The biggest things we need to worry about are standardizing how data is saved. That's where the real issue has been.

    The only two I might look at for standardization purposes are: - $args['hierarchical'] - Kind of goes without saying, I think. - $args['query_var'] - This will make things more portable.

    I don't think we need to get into standardizing $args['rewrite'] because plugins are going to do much different things with this. Some plugins may even allow the user to choose the permalink settings they want. Also, if you even look at the Events standard discussion, you should be able to see why this will be impossible to standardize with some post types.

    The best course of action will probably be to provide this stuff in the sample code for each post type.

    点赞 评论 复制链接分享
  • weixin_39743722 weixin_39743722 5月前


    点赞 评论 复制链接分享
  • weixin_39688378 weixin_39688378 5月前

    The best course of action will probably be to provide this stuff in the sample code for each post type.


    点赞 评论 复制链接分享