WordPress 3.+ 的自定义分类功能
in IT互联网 | 2 条评论WordPress 3.+ 的CMS功能真是很完善了,上篇说到WordPress3+的自定义内容类型功能详解,创建自定义内容类型之后就可以在后台看到你的左侧菜单多出来了一组独立的选项,但是这组选项中却不包含分类选项,这么看来怎么都不像是CMS。现在就倒腾一下这个分类的功能怎么实现,具体效果见下图:
在这篇教程中,我们将讲解wordpress一个空前强大的功能:自定义分类法(taxonomy),wordpress自定义分类法可以让你强有力地将网站内容按自己需要的方式整理分类。虽然wordpress的分类法在2.3版本的时候就引入了,但是在3.0版本里,又被进一步改进了。
之前我们已经讲解过如何在wordpress内自定义文章类型,配合本教程的wordpress自定义分类法,就可以更好地用wordpress进行站点和主题开发。
1.什么是wordpress的分类法(Taxonomy)?
分类法是组织数据的一种简单形式,同样,wordpress的分类法也是组织网站内容的一种方式。可能你没有意识到这个概念,但其实你至少已经熟悉wordpress分类法中的一种,那就是标签(Tag)。标签就是wordpress分类法中的一种,文章可以通过标签联系起来,也可以通过标签查看和组织起来,另一个wordpress自带的分类法是分类目录(post categories)。
分类法让wordpress变得更强大,因为它可以让用户去帅选出他们需要的文章。自定义分类法,顾名思义就是让我们自己定义网站内容的组织形式,自定义分类法既可以运用在自定义的文章类型里,也可以运用在一般的文章和页面中。
下面举一些自定义分类法的例子:
- 用电影的放映年份来分类
- 用省份、邮政编码、等地名来分类
- 用优先级的高低来分类
从上面可以看到,你完全可以根据你的需要来对网站的内容进行自定义分类,如果你阅读过自定义文章类型,你会对之前的例子Event比较熟悉了。下面我们也将继续使用这个例子进行讲解。
我们将在Event这个自定义的文章类型里添加一个自定义的分类法:按事件地点(location)分类,这样我们就可以通过地点来查看事件文章了。这里为了统一代码,还是使用wordpress3.0的默认主题,并且假设你已经按照之前的例子制作出Event的文章类型了。
2.创建一个自定义分类法
和创建自定义文章类型一样,在wordpress创建自定义分类法也非常简单。下面是具体的代码:
[php]
add_action( ‘init’, ‘create_locations’ ); function create_locations() { $labels = array( ‘name’ => _x( ‘Locations’, ‘taxonomy general name’ ), ‘singular_name’ => _x( ‘Location’, ‘taxonomy singular name’ ), ‘search_items’ => __( ‘Search Locations’ ), ‘all_items’ => __( ‘All Locations’ ), ‘parent_item’ => __( ‘Parent Location’ ), ‘parent_item_colon’ => __( ‘Parent Location:’ ), ‘edit_item’ => __( ‘Edit Location’ ), ‘update_item’ => __( ‘Update Location’ ), ‘add_new_item’ => __( ‘Add New Location’ ), ‘new_item_name’ => __( ‘New Location Name’ ), ); register_taxonomy(‘location’,’event’,array( ‘hierarchical’ => true, ‘labels’ => $labels )); }
[/php]
把上面的代码粘贴到主题文件夹的functions.php中。register_taxonomy这个wordpress函数就是用来创建一个分类法,先解释一下传递给这个函数的参数。
location是这个分类法的内部名
event告诉wordpress哪个文章类型将使用这个分类法,在这个例子里,我们用的是之前创建的event的文章类型,你也可以将它替换成post或page,这样就可以将分类法用在一般的文章和页面上。也可以同时运用在多个文章类型上(通过数组)。
array(…)是传递给register_taxonomy的最后一个参数,它告诉wordpress分类法如何运行。具体来解释一下array里面的内容:
hierarchical是一个布尔值,用来确定分类法是否有等级,即是否有子分类。对于地点(location)分类这个例子而言,我们的父分类是楼号(Buliding),子分类是房间号(Room)。
labels是输出这个分类法的一些相关信息(由create_locations函数的$labels来定义)。
add_action( ‘init’, ‘create_locations’ )是指wordpress初始化时,会调用create_locations这个函数。
3.将自定义分类法添加到文章
地点(location)这个分类法已经创建完成了,现在登陆到wordpress的后台,在自定义的文章类型Event里创建一些地点。在Events的目录下,可以看到一个新的链接Locations,点击它就可以进入如下图的页面,你可以在此进行新增、编辑、删除地点等操作。
下面来创建一些地点:
1.Building1(父分类)
2.Conference Room A(子分类)
3.Conference Room B(子分类)
完成之后,你可以看到一张地点的表格,如下图:
这样,当你创建一个新的Event文章时,你会在创建页面的右边看到一个新的地点(location)选项(如下图),因为我们在创建wordpress自定义分类法location时,已经把它传递给了自定义文章类型Event。
选择一个地点,然后点击发布就可以了,整个界面操作和wordpress的选择分类目录很接近,如果是使用没有等级的分类法,那就和标签的方法有些类似。
我们已经创建完地点分类法,并且新建了一些地点,现在我们要在前台页面上显示这些地点,以便让用户看到。
4.在前台页面显示分类法信息
当打开一个单独的事件文章的页面时,我们要在这个页面上看到事件的地点。在之前的文章里,主题文件夹里创建过一个命名为single-event.php的文件,这是用来显示单独事件文章的页面模板。我们要把相关的地点信息加入到这个文件里。如果你要把地点信息加入到一般的文章和页面中,只需要编辑single.php或者page.php文件。
下图是还没有加入地点信息的前台页面样式:
我们可以用get_the_term_list这个wordpress函数来将地点信息加入到页面中,代码如下:
[php]
get_the_term_list( $id, $taxonomy, $before, $sep, $after )
[/php]
- $id – 事件文章的ID号
- $taxonomy – 想要显示的分类法 (如’tag’, ‘location’等)
- $before –列表之前的html标签
- $sep – 列表项目间的分隔
- $after –列表之后的html标签
下面我们用get_the_term_list来显示事件文章的所有地点:
[php]
<?php echo get_the_term_list( get_the_ID(), ‘location’, "Location: " ) ?>
[/php]
这段代码中, get_the_ID()告诉wordpress使用当前页面的文章ID,使用location这个分类法,并在地点信息前加入文本“Location:”。
默认的分隔符号是分号,你也可以用“-”或者“|”来代替默认分隔符。同样地点信息会有一个超链接,点击这个超链接可以进入所有和这个地点有关的事件文章。(随后我们会讲解如何自定义这个页面模板)。
single-events.php文件中的参考代码如下:
[php]<div class="entry-meta">
<?php twentyten_posted_on(); ?>
</div><!– .entry-meta –>
<div class="entry-meta">
<?php echo get_the_term_list( get_the_ID(), ‘location’, "Location: " ) ?>
</div><!– .entry-meta –>
[/php]
现在在浏览器中刷新页面,你会看到如下效果:
5.通过自定义分类法来查看文章
现在我们已经在每一个事件文章页面里显示了地点分类法的相关信息,下面我们要制作一个页面模板用来显示和特定地点相关的所有事件文章。例如点击Conference Room A,就会进入一个页面,这个页面显示出所有和Room A有关的事件文章。
在还没开始之前,点击这个链接,会弹出如下错误提示:
了解这个错误原因,你可能需要具备一些WordPress模板等级的知识,当wordpress载入页面时,它会查找你的主题文件夹并根据命名载入正确的模板页面,当载入一个分类法页面时,wordpress的查找顺序如下:
taxonomy-[your_taxonomy_term].php > taxonomy-taxonomy.php > taxonomy.php > archive.php > index.php
wordpress会从左到右开始查找这些文件,如果文件不存在就跳到下一个文件。在wordpress3.0的默认主题TwentyTen中,第一个符合的文件是archive.php,因为前面三个文件在这个主题文件夹中都是不存在的,所以我们就会看到上面的错误页面。
因此如果我们要正确显示分类法页面,就要建立一个新文件,把它命名为taxonomy-location.php。这样wordpress在载入分类法页面时,就会启用这个模板。因为我们的分类法页面和标签(Tags)页面外观比较像,为了方便起见,把tag.php中的内容复制到刚刚建立的文件中。
先将下面的代码复制到get_header()的下面。
[php]
<?php $term = get_term_by( ‘slug’, get_query_var( ‘term’ ), get_query_var( ‘taxonomy’ ) ); ?>[/php]
这样,和分类法有关的信息(ID,名称等)都存储在变量$term中,我们就可以将它输出到任何地方了。在这里,我们想把这些信息放置在页面的顶部,所以将tag.php文件的代码替换掉。
原代码:
[php]
<h1 class="page-title"><?php
printf( __( ‘Tag Archives: %s’, ‘twentyten’ ), ‘<span>’ . single_tag_title( ”, false ) . ‘</span>’ );
?></h1>
[/php]
新代码:
[php]
<h1 class="page-title"><?phpprintf( __( ‘Events in Location: %s’, ‘twentyten’ ), ‘<span>’ . $term->name . ‘</span>’ ); ?></h1>
[/php]
完成后,当我们再次点击Conference Room A这个链接时,就可以看到如下显示地点分类的页面:
但是这个页面还没有任何的事件文章,我们要通过修改WordPress loop代码来查找自定义文章类型Events的文章,而不是一般的文章。添加下面的代码,用来进行自定义的wordpress查询:
[php]
<?php query_posts(array( ‘post_type’=>’event’, ‘location’=>$term->slug)); ?>
[/php]
query_posts用来查询和当前locoation相关的所有事件文章。但是当前Wordpress有一个bug(不知截至发稿前是否修正),任何和这个location有关的文章类型的文章都会显示出来。现在刷新页面会发现和Conference Room A相关的事件文章都列在页面上了,如下图:
如果你想在页面显示和Conference Room A的相关描述(Description)的话也非常简单,只需要把下面的代码复制到h1的标签下面即可。
[php]
<strong>Description:</strong><?php echo term_description( ”, get_query_var( ‘taxonomy’ ) ); ?>
[/php]
完成后页面如下:
6.总结
通过这个例子,你应该已经学会了如何在wordpress自定义分类法,我们再把流程总结一下:
- 创建一个自定义的分类法(地点分类法)
- 将自定义分类法加入到文章中
- 在文章中显示自定义分类的信息
- 通过自定义分类来查看和组织文章
- 为自定义分类法创建一个页面模板
通过结合自定义文章类型(Custom post type)和自定义分类法(Custom taxonomy),wordpress在内容管理方面已经非常强大了。
从这边文章中收益匪浅,在sixrevisions看了半天没弄明白,谢了