使用自定义分类

WordPress允许开发人员创建自定义分类。当想要创建不同的命名系统并使它们以可预测的方式在幕后被访问时,自定义分类是有用的。

分类法,简单来说就是对具有一定相同特征的项目的分组。WordPress 默认的文章提供了两种分类法,分别为“分类”和“标签”。这两种分类法可以帮助你给你的文章进行分类和分组,这样对网站主来说可以让网站逻辑更加清晰,而且更加利于 SEO 的优化;对于网站的读者而言,可以帮他们更快的熟悉网站,迅速找到仔细需要的内容。

分类和标签都是自带的分类法,但有时候,自带的分类法无法满足我们的需要,这个时候我们通常会选择注册一个自定义文章类型和自定义分类法来保存文章,比如商品类型的文章。注册新的文章类型和新的分类法很简单,如下:

register_taxonomy($taxonomy,$object_type,$args);
  1. $taxonomy:分类法的名称。这个名称不应包含中文,因为它不是给用户看的,而是类似于 ID 的作用;
  2. $object_type:分类法用于哪些文章类型。WordPress 的文章(post)默认已经有了两个分类法(分类和标签),你可以把这个分类法用于自带的文章类型(post、page、attachment、revision 和 nav_menu_item)和自定义文章类型,有三种填法:
    • 只用于一个文章类型,列如:$object_type = ‘post’
    • 用于多个文章类型,例如:$object_type = array( ‘post’, ‘page’ )
    • 不应用给任何文章类型,例如:$object_type = null
  3. $args:分类法的细节设置,是一个数组,里边所有的参数都是选填的(WordPress 会自动补全缺少的设置),下边介绍所有可用的参数:
    • label:分类法显示给用户的名字,可用使用中文和其它字符
    • labels:显示给用户的名词。这个数组用来设置显示给用户的关键文字,如果不填 WordPress 会自动给你设置好,下边是所有可用参数
      • name:分类法显示给用户的名字,可用使用中文和其它字符(事实上,这个和上边的 label 参数是一样的)
      • singular_name:分类法的别名
      • menu_name:分类法在管理后台菜单处显示的文字
      • all_items:查看全部条款
      • view_item:浏览单个条款
      • update_item:更新条款
      • add_new_item:新建条款
      • parent_item:父级条款
      • parent_item_colon:同上,但结尾要加冒号
      • search_items:搜索条款
      • popular_items:热门条款
      • separate_items_with_commas:多个条款的提示
      • add_or_remove_items:删除和添加条款的提示,只在禁用 JavaScript 的时候显示
      • choose_from_most_used:“从常用的条款中选择” 的文字提示
      • not_found:没有条款的提示
    • public:是否公开,如果公开会生成前台存档页面
    • show_ui:是否在后台的侧边管理菜单显示
    • show_in_nav_menus:是否在菜单页面里添加一个条款
    • show_tagcloud:分类法是否显示标签云的部件
    • meta_box_cb:显示在文章编辑器的分类法选择板块是什么形式
    • show_admin_column:是否显示在后台文章列表的数据列上
    • hierarchical:显示在文章编辑器的分类法选择板块是什么形式。设置成 True 则为分类形式(多选框),False 则为标签形式(文本框和添加按钮)
    • update_count_callback:分类法发生变化时的回调函数
    • query_var:查询存档页面的关键字,默认是分类法名(ID)。最好保持默认
    • rewrite:伪静态规则。设置成 False 将禁用伪静态;还可以设置一些元素,比如 “slug”
    • capabilities:分类法权限设置。最好保持默认
    • sort:查询分类法文章时的排序
    • _builtin:这是内置的分类法还是自定义分类法。最好保持默认或设置成 False。这个参数只有 WordPress 核心才有用

注意,第一个参数 $taxonomy 因为文章查询的关系,有一些保留关键词,也就是说不能用以下的词来做 $taxonomy,否则会冲突:

  • 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
  • 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

创建你的自定义分类法

我们以电影分享网站做演示,创建一个名为电影国家的自定义分类法给默认已经存在的文章文章类型。

创建一个简单的自定义分类法需要使用 register_taxonomy() 函数,在使用的时候需要挂到 init 钩子上,否则可能会出现一些错误。

//创建一个操作函数,用来注册自定义分类法
functionBing_register_custom_taxonomy(){
    //自定义分类法名
    $name='country';
    //自定义分类法的文章类型
    $post_type='post';
    //设置关键文本
    $labels=array(
        'name'                  => '电影国家',
        'singular_name'         => 'country',
        'search_items'          => '搜索国家',
        'opular_items'          => '热门国家',
        'all_items'             => '全部国家',
        'parent_item'           => '父级国家',
        'parent_item_colon'     => '父级国家:',
        'edit_item'             => '编辑国家',
        'update_item'           => '更新国家',
        'add_new_item'          => '新建国家',
        'new_item_name'         => '国家名称',
        'add_or_remove_items'   => '添加或删除国家',
        'choose_from_most_used'=> '从经常使用的国家中选择',
        'menu_name'             => '国家'
    );
    //详细配置自定义分类法
    $args=array(
        'labels'            =>$labels,
        'public'            =>true,
        'show_in_nav_menus'=>true,
        'hierarchical'      =>true,
        'show_ui'           =>true,
        'query_var'         =>true,
        'rewrite'           =>true,
        'show_admin_column'=>true
    );
    //使用 register_taxonomy() 函数注册自定义分类法
    register_taxonomy($name,$post_type,$args);
}
add_action('init', 'Bing_register_custom_taxonomy');//必须把操作函数挂载到 init 钩子上

执行上面的代码,就能看到后台侧边管理菜单的 “文章” 下出现了一个 “国家”,点击这个 “国家” 菜单,就能进入到我们创建的自定义分类法的管理界面了。

分类法的管理界面像 “分类” 还是 “标签” 取决于你的 hierarchical 参数,下边是我们创建的 “电影国家” 分类法。

自定义分类法开发

一旦你创建了自定义分类法,并把文章添加到里面,你可能会需要更改主题或插件,来利用这个分类法。

WordPress 的自定义分类法功能是非常强大的,其中就包括利用它进行扩展,所以,可以用很多方面的东西来定制自定义分类法。

单独的存档页

WordPress 默认的存档页模板是主题根目录的 archive.php 文件,所以,自定义分类法的存档页面默认也会调用这个文件。

比 archive.php 优先级高的是叫做 taxonomy.php 的文件,如果存在 taxonomy.php 会优先使用,这个 taxonomy.php 只对自定义分类法有用,自带的分类法不会调用 taxonomy.php 文件。

如果你想给创建的自定义分类法设置一个单独的存档模板文件的话,可以使用 taxonomy-{$taxonomy}.php 文件({$taxonomy} 为分类法的名称),比如我放在 taxonomy-country.php,在你访问 “电影国家” 分类法的存档页时,就会使用这个文件作为模板。

文章列表显示自定义分类法

正如在文章列表显示文章的分类和标签一样,很多时候会需要在文章列表显示自定义分类法,下边我用上边创建的 “电影国家” 自定义分类法来演示一下。

首先打开你的 functions.php(了解更多),然后在里边添加下边的代码:

//封装一个获取电影国家的函数
functionBing_the_country($post_ID=false){
    //如果不设置 ID 则默认为循环中的当前文章
    if($post_ID===false)$post_ID=get_the_ID();
    //获取到这个文章有关电影国家分类法的信息
    $terms=get_the_terms($post_ID,‘country’);
    //如果文章有添加相关分类法则输出
    if(!empty($terms)){
        echo '<p > 电影国家:';
            //循环输出
            foreach($termsas$term){
                //获取分类法项目的名字
                $name=$term->name;
                //获取链接
                $link=esc_url(get_term_link($term, 'country'));
                //输出一个分类法项目
                echo“<span ><a href='$link'>$name</a></span>”;
            }
        echo '</p>';
    }
}

然后在文章循环里调用 `` 这样,在前台的文章列表处,就能显示当前介绍的电影来自哪个国家了。