WordPress自定义文章类型+自定义分类法+自定义字段

文章类型是什么

文章类型,对应wp_posts表中的post_type字段。之前的文章中说过几次,WordPress自带了post(文章)、page(页面)、attachment(附件)、nav_menu_item(菜单项)、revision(关闭或者自动保存的版本、草稿)这五种文章类型。然而对我们发表文章真正有用的只有post(内容相对动态)和page(内容相对表态的)这两个类型。要是动态内容多,都在post文章里边,可能管理不太方便。这时候,我们可以增加自定义的文章类型。

增加文章类型

增加文章类型,使用函数register_post_type。假如我们要添加一个小说(novel)的文章类型,方法如下。

//添加一个“小说”post_type
function lzgl_novel_post_type()
{
    $labels = array(
            'name' => '小说列表',
            'singular_name' => '小说',
            'add_new' => '添加小说',
            'add_new_item' => '添加小说',
            'edit_item' => '编辑小说',
            'new_item' => '新的小说',
            'view_item' => '查看小说',
            'search_items' => '搜索小说',
            'not_found' => '没有发现小说',
            'not_found_in_trash' => '回收站中没有小说',
            'parent_item_colon' => '',
            'menu_name' => '小说',
    );
    $args = array(
            'labels' => $labels,
            'description' => '热门小说,及时分享',
            'public' => true,
            'menu_position' => 5,
            'supports' => array('title', 'editor', 'thumbnail', 'except', 'custom-fields', 'comments', 'revisions'),
            'has_archive' => true,
            'taxonomies' => array('category', 'post_tag'),//支持的分类法
    );
    register_post_type('novel', $args);
}
 
add_action('init', 'lzgl_novel_post_type');

这时候的后台,会在文章下多一个小说的按钮,列表页、添加页跟文章其实是基本一致的,分类、标签都是跟文章的共享,只是换了个名字。

这样子肯定不行,文章的分类使用category分类法跟小说的分类显然不同,比如小说独有的爱情、校园、奇幻之类的分类,跟category混在一起就非常不好了。这时候,需要添加自定义分类法。

分类法是什么

分类法对应WP中关键字taxonomy,对应wp_term_taxonomy表中的taxonomy字段。之前文章也说过,WP自带了category(post文章用)、link_category(link链接用)、post_tag(post文章用)、post_format(post文章用)、nav_menu(nav菜单用)这五种分类法。现在的小说其实还也是post,大意义上说也是“文章”,现在不想使用category分类法,希望新增一个分类法供post_type为novel的“文章”使用。

增加分类法

添加自定义分类法使用函数register_taxonomy()。我们为小说添加一个分类法novel_category:

//添加一个分类法novel_catgegory
function lzgl_novel_taxonomy()
{
    $labels = array(
            'name' => '小说分类',
            'singular_name' => '小说',
            'search_items' => '搜索',
            'popular_items' => '常用小说分类',
            'all_items' => '所有小说分类',
            'parent_item' => '小说父分类',
            'parent_item_colon' => '小说父分类colon',
            'edit_item' => '编辑小说分类',
            'update_item' => '更新小说分类',
            'add_new_item' => '添加小说分类',
            'new_item_name' => '新的小说分类',
    );
    $args = array(
            'labels' => $labels,
            'hierarchical' => true,//分层级
    );
    register_taxonomy('novel_category', 'novel', $args);
}
add_action('init', 'lzgl_novel_taxonomy');

这两个函数参数基本一致的,其中一些字段的意思或许意思写得不准确,这得多次试验才清楚了。有了这个之后,上边register_post_type()中args中的taxonomies就不要添加category分类法了,否则将会有两个。至于post_tag分类法,还是可以有的。

自定义分类法novel-category——添加页面

自定义文章类型novel——写文章界面

新的文章类型,新的分类法,或许还是感觉不够,想为小说多添加些信息,比如它的原著作者是谁,WP自带的作者指的是这篇文章的作者,也就是目前这小说的发布者,并不是它的创作者。为文章添加自定义字段,英文就是custom field。

添加文章字段

为文章添加固定可视化的自定义字段,可以使用add_meta_box()函数。

//添加额外字段“原著作者”
function lzgl_add_custom_field_original_author()
{
    add_meta_box('original_author', '原著作者', 'lzgl_custom_field_original_author_html_callback', 'novel', 'advanced', 'high');
}
function lzgl_custom_field_original_author_html_callback($post)
{
    wp_nonce_field('original_author', 'original_author_nonce');
    $value = get_post_meta($post->ID, '_original_author', true);
    echo '<label for="original_author">原著作者</label>';
    echo '<input type="text" id="original_author_input" name="original_author" value="'.$value.'" size="25" />';
}
add_action('add_meta_boxes', 'lzgl_add_custom_field_original_author');

具体使用方法点进去看都有。这样子添加后发现新字段是出现在最底端,其实这些块都是可以拖动的,将它拖到喜欢的地方就得了。

当然,这只是界面上有而已,要在文章保存时能存到数据库、删除文章时能将额外数年删除,还需要一些操作,参考add_meta_box()函数说明文档以及之前评论一文,不再赘述。

如果想要在小说列表页也显示这个“原著作者”,也是可以的,参见参考链接。如果还想在管理列表页对这个原著作者进行排序、分类筛选之类,可能就不太好实现了。暂时没研究,有需要时再看吧。再者要为原著作者增加存档页,估计也是可以,查询参数众多,有需求再试,实在不行自己写sql语句,但这时标签函数可能就不好搞了。需求太多的时候,或许就不适合用WP来鼓捣了。

至于显示,需要创建archive-novel.php来显示存存档页和single-novel.php来显示详情页。如何查询这个post_type的数据?看首页那篇文章自定义查询,有详细说明,一一略过。

# 更多WordPress技巧,请关注「WordPress专题

方法来源:xiaomlove