WordPress自定义文章类型和自定义分类法
- 发表于
- WordPress
其实这么多年来,一直动摇要不要继续用WordPress,它即灵活又臃肿。对于新博客程序自己陆续已经写过两个版本(一个ThinkPHP5版本,一个Node.js+Vue.js版本)。两个版本都写到了90%后就忙工作了,好吧,索性继续用它。
体验盒子昨天花了一天时间写了个新栏目影视,真是整整一天。新栏目会以人工精编的方式继续分享影视资源,内容主要有值得你收藏观看的电影,电视剧;同时有网络安全电影,网络安全视频,黑客电影,黑客纪录片等特色类别。
新栏目的计划功能是这样的
- 简约,仅展示有用的电影信息(资料介绍/下载/观看)
- 能自动采集豆瓣和IMDb的影片资料(它们专业)
- 能自动采集影片的下载资源
- 能自动解析适配目前各大视频站点影片播放节点
- 能自动适配并转换传统播放节点为HTML5播放(体验+节能)
- 带有独立的影片筛选功能
要使用WordPress完成以上功能就必须进行文章类型自定义(register post type),同时开发爬虫功能,解析规则库,但今天我们只讲自定义文章类型。
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.
使用
1 |
<?php register_post_type( $post_type, $args ); ?> |
参数
- $post_type(字符串)(必填)帖子类型。(最多20个字符,不能包含大写字母,下划线或空格)默认值:无
- $args(array)(可选)参数数组。默认值:无
更多参数直接看文档。
注册自定义类型示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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,这样做是让你的新类型和整体固定连接更一致,如:
1 2 3 4 5 |
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公共和私有查询变量冲突。
使用
1 |
<?php register_taxonomy( $taxonomy, $object_type, $args ); ?> |
参数
参数较多,看官方文档
演示
为名为“book”的文章类型注册两个分类法,类型和作者的示例。您可以在themes的functions.php模板文件中定义自定义分类法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<?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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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统一起来
在实际开发中,我遇到了很多不知名的困惑,在搜索引擎中查阅后发现大量的复制转发,造成了我时间的浪费,焦点的浪费,甚至有时候把我引向了错误的方向。最终我选择仔细看官方文档,问题才得以解决。
相关阅读
原文连接
的情况下转载,若非则不得使用我方内容。