register_post_type [ WordPress Function ]
| Parameters: |
|
| Uses: |
|
| Returns: |
|
| Defined at: |
|
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.
Optional $args contents:
- label - Name of the post type shown in the menu. Usually plural. If not set, labels['name'] will be used.
- 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.
- You can see accepted values in {@link get_post_type_labels()}.
- description - A short descriptive summary of what the post type is. Defaults to blank.
- public - Whether a post type is intended for use publicly either via the admin interface or by front-end users.
- Defaults to false.
- 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.
- exclude_from_search - Whether to exclude posts with this post type from front end search results.
- If not set, the the opposite of public's current value is used.
- publicly_queryable - Whether queries can be performed on the front end for the post type as part of parse_request().
- ?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.
- show_ui - Whether to generate a default UI for managing this post type in the admin.
- If not set, the default is inherited from public.
- show_in_nav_menus - Makes this post type available for selection in navigation menus.
- If not set, the default is inherited from public.
- show_in_menu - Where to show the post type in the admin menu.
- 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.
- show_ui must be true.
- If not set, the default is inherited from show_ui
- show_in_admin_bar - Makes this post type available via the admin bar.
- If not set, the default is inherited from show_in_menu
- menu_position - The position in the menu order the post type should appear.
- show_in_menu must be true
- Defaults to null, which places it at the bottom of its area.
- menu_icon - The url to the icon to be used for this menu. Defaults to use the posts icon.
- capability_type - The string to use to build the read, edit, and delete capabilities. Defaults to 'post'.
- 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').
- capabilities - Array of capabilities for this post type.
- By default the capability_type is used as a base to construct capabilities.
- You can see accepted values in {@link get_post_type_capabilities()}.
- map_meta_cap - Whether to use the internal default meta capability handling. Defaults to false.
- hierarchical - Whether the post type is hierarchical (e.g. page). Defaults to false.
- supports - An alias for calling add_post_type_support() directly. Defaults to title and editor.
- See {@link add_post_type_support()} for documentation.
- register_meta_box_cb - Provide a callback function that will be called when setting up the meta boxes for the edit form. Do remove_meta_box() and add_meta_box() calls in the callback.
- taxonomies - An array of taxonomy identifiers that will be registered for the post type.
- Default is no taxonomies.
- Taxonomies can be registered later with register_taxonomy() or register_taxonomy_for_object_type().
- has_archive - True to enable post type archives. Default is false.
- Will generate the proper rewrite rules if rewrite is enabled.
- rewrite - Triggers the handling of rewrites for this post type. Defaults to true, using $post_type as slug.
- To prevent rewrite, set to false.
- To specify rewrite rules, an array can be passed with any of these keys
- 'slug' => string Customize the permastruct slug. Defaults to $post_type key
- 'with_front' => bool Should the permastruct be prepended with WP_Rewrite::$front. Defaults to true.
- 'feeds' => bool Should a feed permastruct be built for this post type. Inherits default from has_archive.
- 'pages' => bool Should the permastruct provide for pagination. Defaults to true.
- 'ep_mask' => const Assign an endpoint mask.
- 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
- 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.
- can_export - Allows this post type to be exported. Defaults to true.
- 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.
- _builtin - true if this post type is a native or "built-in" post_type. THIS IS FOR INTERNAL USE ONLY!
- _edit_link - URL segement to use for edit link of this post type. THIS IS FOR INTERNAL USE ONLY!
Source
<?php
function register_post_type( $post_type, $args = array() ) {
global $wp_post_types, $wp_rewrite, $wp;
if ( !is_array($wp_post_types) )
$wp_post_types = array();
// Args prefixed with an underscore are reserved for internal use.
$defaults = array(
'labels' => array(), 'description' => '', 'publicly_queryable' => null, 'exclude_from_search' => null,
'capability_type' => 'post', 'capabilities' => array(), 'map_meta_cap' => null,
'_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false,
'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true,
'supports' => array(), 'register_meta_box_cb' => null,
'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null,
'can_export' => true,
'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null,
'delete_with_user' => null,
);
$args = wp_parse_args($args, $defaults);
$args = (object) $args;
$post_type = sanitize_key($post_type);
$args->name = $post_type;
if ( strlen( $post_type ) > 20 )
return new WP_Error( 'post_type_too_long', __( 'Post types cannot exceed 20 characters in length' ) );
// If not set, default to the setting for public.
if ( null === $args->publicly_queryable )
$args->publicly_queryable = $args->public;
// If not set, default to the setting for public.
if ( null === $args->show_ui )
$args->show_ui = $args->public;
// If not set, default to the setting for show_ui.
if ( null === $args->show_in_menu || ! $args->show_ui )
$args->show_in_menu = $args->show_ui;
// If not set, default to the whether the full UI is shown.
if ( null === $args->show_in_admin_bar )
$args->show_in_admin_bar = true === $args->show_in_menu;
// Whether to show this type in nav-menus.php. Defaults to the setting for public.
if ( null === $args->show_in_nav_menus )
$args->show_in_nav_menus = $args->public;
// If not set, default to true if not public, false if public.
if ( null === $args->exclude_from_search )
$args->exclude_from_search = !$args->public;
// Back compat with quirky handling in version 3.0. #14122
if ( empty( $args->capabilities ) && null === $args->map_meta_cap && in_array( $args->capability_type, array( 'post', 'page' ) ) )
$args->map_meta_cap = true;
if ( null === $args->map_meta_cap )
$args->map_meta_cap = false;
$args->cap = get_post_type_capabilities( $args );
unset($args->capabilities);
if ( is_array( $args->capability_type ) )
$args->capability_type = $args->capability_type[0];
if ( ! empty($args->supports) ) {
add_post_type_support($post_type, $args->supports);
unset($args->supports);
} else {
// Add default features
add_post_type_support($post_type, array('title', 'editor'));
}
if ( false !== $args->query_var && !empty($wp) ) {
if ( true === $args->query_var )
$args->query_var = $post_type;
$args->query_var = sanitize_title_with_dashes($args->query_var);
$wp->add_query_var($args->query_var);
}
if ( false !== $args->rewrite && ( is_admin() || '' != get_option('permalink_structure') ) ) {
if ( ! is_array( $args->rewrite ) )
$args->rewrite = array();
if ( empty( $args->rewrite['slug'] ) )
$args->rewrite['slug'] = $post_type;
if ( ! isset( $args->rewrite['with_front'] ) )
$args->rewrite['with_front'] = true;
if ( ! isset( $args->rewrite['pages'] ) )
$args->rewrite['pages'] = true;
if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
$args->rewrite['feeds'] = (bool) $args->has_archive;
if ( ! isset( $args->rewrite['ep_mask'] ) ) {
if ( isset( $args->permalink_epmask ) )
$args->rewrite['ep_mask'] = $args->permalink_epmask;
else
$args->rewrite['ep_mask'] = EP_PERMALINK;
}
if ( $args->hierarchical )
add_rewrite_tag("%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
else
add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=");
if ( $args->has_archive ) {
$archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
if ( $args->rewrite['with_front'] )
$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
else
$archive_slug = $wp_rewrite->root . $archive_slug;
add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
}
if ( $args->rewrite['pages'] )
add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
}
add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite );
}
if ( $args->register_meta_box_cb )
add_action('add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1);
$args->labels = get_post_type_labels( $args );
$args->label = $args->labels->name;
$wp_post_types[$post_type] = $args;
add_action( 'future_' . $post_type, '_future_post_hook', 5, 2 );
foreach ( $args->taxonomies as $taxonomy ) {
register_taxonomy_for_object_type( $taxonomy, $post_type );
}
do_action( 'registered_post_type', $post_type, $args );
return $args;
}
?>
Examples [ wp-snippets.com ]
Top Google Search Results
- register_post_type - WordPress Codex
Description. Create or modify a post type. Do not use register_post_type before init. Usage. <?php register_post_type( $post_type, $args ) ?> Parameters ...
codex.wordpress.org - register_post_type « Functions - Watch of the Web Warlocks
Description of the function register_post_type located in the file wp-includes ... <? php register_post_type( $post_type, $args = array( 'labels' => array(), ...
www.web-warlocks.net - register_post_type - Create or Modify WordPress Post Type
Feb 28, 2011 ... Create or modify WordPress post type based on the parameters given. The function will accept an array, along with a string for the post type ...
w4dev.com - Adding Categories And Post Tags Boxes For Custom Post Type In ...
Jul 4, 2010 ... And this can be done easily with argument taxonomies of register_post_type() function when registering new custom post type. In this example ...
www.deluxeblogtips.com
User discussions [ wordpress.org ]
- jnhghy on "Query posts by custom post type and category id"
- oneside on "Query posts by custom post type and category id"
- Ipstenu on "Query posts by custom post type and category id"
- oneside on "Query posts by custom post type and category id"
- Ipstenu on "Query posts by custom post type and category id"
- oneside on "Query posts by custom post type and category id"
- Måns Jonasson on "Custom post type receives no trackbacks?"
- dhechler on "Posts are saved but uneditable. Using wp_insert_post() for custom post type."
- ryanve on "Remove base slug on Custom Post Type?"
- colmsjo on "Error calling register_post_type() when installing theme"