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.

使用

<?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统一起来

在实际开发中,我遇到了很多不知名的困惑,在搜索引擎中查阅后发现大量的复制转发,造成了我时间的浪费,焦点的浪费,甚至有时候把我引向了错误的方向。最终我选择仔细看官方文档,问题才得以解决。

相关阅读