目录
首页 笔记 详情

WordPress注册自定义类型register post type


创建或修改文章类型,register_post_type只能通过'init'动作调用,您可以在主题和插件中使用此功能。

保留的文章类型

以下帖子类型已由WordPress保留和使用,意味着你不能使用以下命名注册新的自定义类型

  • post
  • page
  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset
  • oembed_cache
  • user_request

此外,不应使用以下帖子类型,因为它们会干扰其他WordPress功能。

  • action
  • author
  • order
  • theme

通常,您应该始终为帖子类型添加前缀,或者指定自定义query_var,以避免与现有的WordPress查询变量冲突。

更多信息查看: Post Types.

使用

<?php register_post_type( $post_type, $args ); ?>

参数

  • $post_type(字符串)(必填)帖子类型。(最多20个字符,不能包含大写字母,下划线或空格)默认值:无
  • $args(array)(可选)参数数组。默认值:无

更多参数直接看文档。

注册自定义类型示例

add_action( 'init', 'codex_book_init' );
/**
 * Register a book post type.
 */
function codex_book_init() {
 $labels = array(
 'name'               => _x( 'Books', 'post type general name', 'your-plugin-textdomain' ),
 'singular_name'      => _x( 'Book', 'post type singular name', 'your-plugin-textdomain' ),
 'menu_name'          => _x( 'Books', 'admin menu', 'your-plugin-textdomain' ),
 'name_admin_bar'     => _x( 'Book', 'add new on admin bar', 'your-plugin-textdomain' ),
 'add_new'            => _x( 'Add New', 'book', 'your-plugin-textdomain' ),
 'add_new_item'       => __( 'Add New Book', 'your-plugin-textdomain' ),
 'new_item'           => __( 'New Book', 'your-plugin-textdomain' ),
 'edit_item'          => __( 'Edit Book', 'your-plugin-textdomain' ),
 'view_item'          => __( 'View Book', 'your-plugin-textdomain' ),
 'all_items'          => __( 'All Books', 'your-plugin-textdomain' ),
 'search_items'       => __( 'Search Books', 'your-plugin-textdomain' ),
 'parent_item_colon'  => __( 'Parent Books:', 'your-plugin-textdomain' ),
 'not_found'          => __( 'No books found.', 'your-plugin-textdomain' ),
 'not_found_in_trash' => __( 'No books found in Trash.', 'your-plugin-textdomain' )
 );
 
 $args = array(
 'labels'             => $labels,
 'description'        => __( 'Description.', 'your-plugin-textdomain' ),
 'public'             => true,
 'publicly_queryable' => true,
 'show_ui'            => true,
 'show_in_menu'       => true,
 'query_var'          => true,
 'rewrite'            => array( 'slug' => 'book' ),
 'capability_type'    => 'post',
 'has_archive'        => true,
 'hierarchical'       => false,
 'menu_position'      => null,
 'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
 );
 
 register_post_type( 'book', $args );
}

通过以上,你注册了一个以book命名的自定义类型。之后,你可能还需要重写永久连接Rewrite,这样做是让你的新类型和整体固定连接更一致,如:

add_action( 'init', 'book_rewrites_init' );
function movie_bt_rewrites_init() {
 add_rewrite_rule( 'book/([0-9]+)$', 'index.php?post_type=book&p=$matches[1]', 'top' );
 add_rewrite_rule( 'book/([0-9]+)/comment-page-([0-9]{1,})$', 'index.php?post_type=book&p=$matches[1]&cpage=$matches[2]', 'top' );
}

完成以上,你已经完成了WordPress自定义类型的注册,但这还不够,你可能需要为自定义类型添加自定义分类(Taxonomies)筛选?

WordPress注册自定义分类法register taxonomy

添加或覆盖分类法register taxonomy,使用init操作来调用此函数。

应谨慎选择分类名称,以使其不与其他分类法,类型和保留的WordPress公共和私有查询变量冲突。

使用

 <?php register_taxonomy( $taxonomy, $object_type, $args ); ?> 

参数

参数较多,看官方文档

演示

为名为“book”的文章类型注册两个分类法,类型和作者的示例。您可以在themes的functions.php模板文件中定义自定义分类法:

<?php
// hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_book_taxonomies', 0 );
 
// create two taxonomies, genres and writers for the post type "book"
function create_book_taxonomies() {
 // Add new taxonomy, make it hierarchical (like categories)
 $labels = array(
 'name'              => _x( 'Genres', 'taxonomy general name', 'textdomain' ),
 'singular_name'     => _x( 'Genre', 'taxonomy singular name', 'textdomain' ),
 'search_items'      => __( 'Search Genres', 'textdomain' ),
 'all_items'         => __( 'All Genres', 'textdomain' ),
 'parent_item'       => __( 'Parent Genre', 'textdomain' ),
 'parent_item_colon' => __( 'Parent Genre:', 'textdomain' ),
 'edit_item'         => __( 'Edit Genre', 'textdomain' ),
 'update_item'       => __( 'Update Genre', 'textdomain' ),
 'add_new_item'      => __( 'Add New Genre', 'textdomain' ),
 'new_item_name'     => __( 'New Genre Name', 'textdomain' ),
 'menu_name'         => __( 'Genre', 'textdomain' ),
 );
 
 $args = array(
 'hierarchical'      => true,
 'labels'            => $labels,
 'show_ui'           => true,
 'show_admin_column' => true,
 'query_var'         => true,
 'rewrite'           => array( 'slug' => 'genre' ),
 );
 
 register_taxonomy( 'genre', array( 'book' ), $args );
 
 // Add new taxonomy, NOT hierarchical (like tags)
 $labels = array(
 'name'                       => _x( 'Writers', 'taxonomy general name', 'textdomain' ),
 'singular_name'              => _x( 'Writer', 'taxonomy singular name', 'textdomain' ),
 'search_items'               => __( 'Search Writers', 'textdomain' ),
 'popular_items'              => __( 'Popular Writers', 'textdomain' ),
 'all_items'                  => __( 'All Writers', 'textdomain' ),
 'parent_item'                => null,
 'parent_item_colon'          => null,
 'edit_item'                  => __( 'Edit Writer', 'textdomain' ),
 'update_item'                => __( 'Update Writer', 'textdomain' ),
 'add_new_item'               => __( 'Add New Writer', 'textdomain' ),
 'new_item_name'              => __( 'New Writer Name', 'textdomain' ),
 'separate_items_with_commas' => __( 'Separate writers with commas', 'textdomain' ),
 'add_or_remove_items'        => __( 'Add or remove writers', 'textdomain' ),
 'choose_from_most_used'      => __( 'Choose from the most used writers', 'textdomain' ),
 'not_found'                  => __( 'No writers found.', 'textdomain' ),
 'menu_name'                  => __( 'Writers', 'textdomain' ),
 );
 
 $args = array(
 'hierarchical'          => false,
 'labels'                => $labels,
 'show_ui'               => true,
 'show_admin_column'     => true,
 'update_count_callback' => '_update_post_term_count',
 'query_var'             => true,
 'rewrite'               => array( 'slug' => 'writer' ),
 );
 
 register_taxonomy( 'writer', 'book', $args );
}
?>

私人分类法示例

如果您不希望公开公开您的分类法,可以使用“public(公共)”和“rewrite(重写)”参数来抑制它。它可以在您的插件或主题内部使用,但不会生成它自己的URL。

<?php
add_action( 'init', 'create_private_book_tax' );
 
function create_private_book_tax() {
    register_taxonomy(
        'genre',
        'book',
        array(
            'label' => __( 'Genre' ),
            'public' => false,
            'rewrite' => false,
            'hierarchical' => true,
        )
    );
}
?>

保留的分类法

要注意不要引起冲突和404错误

  • attachment
  • attachment_id
  • author
  • author_name
  • calendar
  • cat
  • category
  • category__and
  • category__in
  • category__not_in
  • category_name
  • comments_per_page
  • comments_popup
  • customize_messenger_channel
  • customized
  • cpage
  • day
  • debug
  • error
  • exact
  • feed
  • fields
  • hour
  • link_category
  • m
  • minute
  • monthnum
  • more
  • name
  • nav_menu
  • nonce
  • nopaging
  • offset
  • order
  • orderby
  • p
  • page
  • page_id
  • paged
  • pagename
  • pb
  • perm
  • post
  • post__in
  • post__not_in
  • post_format
  • post_mime_type
  • post_status
  • post_tag
  • post_type
  • posts
  • posts_per_archive_page
  • posts_per_page
  • preview
  • robots
  • s
  • search
  • second
  • sentence
  • showposts
  • static
  • subpost
  • subpost_id
  • tag
  • tag__and
  • tag__in
  • tag__not_in
  • tag_id
  • tag_slug__and
  • tag_slug__in
  • taxonomy
  • tb
  • term
  • theme
  • type
  • w
  • withcomments
  • withoutcomments
  • year

通过以上,WordPress自定义类型和自定义分类法就完成了。

划重点

WordPress自定义文章类型和WordPress自定义分类法整体来说操作很直观,但你需要注意以下几点:

  • 自定义类型是注册全新的一个类型
  • 注册自定义分类法是可能在原有的类型中注册,也可在新的类型中注册
  • 自定义类型和自定义分类法中关于固定链接的处理两者都有rewrite参数,rewrite参数可接收上下响应或上下一致相同的父类命名,这样就可以将自定义文章类型与自定义分类法的URL统一起来

在实际开发中,应仔细看官方文档。

相关阅读


写笔记

咨询

您的电子邮箱地址不会被公开。 必填项已用*标注