最近在用wordpress建站。要求对某个分类下的文章再进行筛选,普通的标签功能已经满足不了这个需求。查阅了很多,最终找到用wordpress的自定义分类法来实现对文章的筛选功能。下面详细讲解。
先看图:这个图是我想要实现的功能,即对文章除了分类,标签外,增加一个按颜色来筛选的功能。
Step 1:创建一个自定义分类法
在functions.php中添加如下代码:
//自定义分类法 add_action( 'init', 'create_color' ); function create_color() { $labels = array( 'name' => _x( 'color', 'taxonomy general name' ), 'singular_name' => _x( 'color', 'taxonomy singular name' ), 'search_items' => __( 'Search color' ), 'all_items' => __( 'All colors' ), 'parent_item' => __( 'Parent color' ), 'parent_item_colon' => __( 'Parent color:' ), 'edit_item' => __( 'Edit color' ), 'update_item' => __( 'Update color' ), 'add_new_item' => __( 'Add New color' ), 'new_item_name' => __( 'New color Name' ), ); register_taxonomy('color','post',array( 'hierarchical' => false, 'labels' => $labels )); }
register_taxonom
y这个wordpress函数就是用来创建一个分类法,先解释一下传递给这个函数的参数。
color
是这个分类法的内部名(这个可以自己命名)
post
告诉wordpress哪个文章类型将使用这个分类法,在这个例子里,我们用的是wordpress默认的post
文章类型,你也可以将它替换成page
或者你自定义的文章类型,这样就可以将分类法用在一般的文章和页面上。也可以同时运用在多个文章类型上(通过数组)。
array(…)
是传递给register_taxonomy的最后一个参数,它告诉wordpress分类法如何运行。具体来解释一下array里面的内容:
hierarchical
是一个布尔值,用来确定分类法是否有等级,即是否有子分类。对于颜色(color)分类这个例子而言,我没有设置子分类,所以我设置false
。
labels
是输出这个分类法的一些相关信息(由create_color
函数的$labels
来定义)。
add_action( ‘init’, ‘create_color’ )
是指wordpress初始化时,会调用create_color
这个函数。
Step 2:将自定义分类法添加到文章
颜色(color)这个分类法已经创建完成了,现在登陆到wordpress的后台,在文章下(之前用的是post类型,所以默认会在文章下),可以看到一个新的链接color,点击它就可以进入如下图的页面,你可以在此进行新增、编辑、删除color等操作。
下图是我添加的颜色分类,由于展示的特殊性,名称处我直接用的颜色代码
发布新文章的时候,在标签的下方,就会出现你自定义的分类目录,如下图
Step 3:调用方法
不带链接,直接输出自定义分类名称
<?php //sort是分类法别名 $terms = get_terms("sort"); $count = count($terms); if ( $count > 0 ){ echo "<ul>"; foreach ( $terms as $term ) { echo "<li>" . $term->name . "</li>"; } echo "</ul>"; } ?>
带链接和描述的分类法分类列表
<?php $terms = get_terms("sort");//sort是分类法别名 $count = count($terms); if ( $count > 0 ){ echo '<ul>'; foreach ( $terms as $term ) { echo '<li>'; echo '<h2><a href="' . get_term_link( $term ) . '" >' . $term->name . '</a></h2>'; //判断分类描述,非空则输出描述 if (!empty($term->description)) { echo '<p>' . $term->description . '</p>'; } echo '</li>'; } echo '</ul>'; } ?>
带文章列表的分类法所有分类
很多时候我们在调用所有分类的时候也希望每个分类后都能显示最近的几篇文章,以下这个案例就实现调用自定义分类法所有分类的时候同时显示每个分类10篇文章。
<?php //自定义分类法名称 $taxonomy = 'sort'; // 得到自定义分类法所有分类列表 $terms = get_terms($taxonomy); // 循环自定义分类法所有分类 foreach ($terms as $cat) { // 得到自定义分类法分类ID $catid = $cat->term_id; $args = array( 'showposts' => 10, //输出的文章数量 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'terms' => $catid ) ) ); $query = new WP_Query($args); if( $query->have_posts() ) { ?> <ul> <li><h2><a href="<?php echo get_term_link( $cat ); ?>" ><?php echo $cat->name; ?></a></h2> <ul> <?php while ($query->have_posts()) : $query->the_post();?> <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> </li> </ul> <?php } wp_reset_query(); //重置query查询?> <?php } ?>
如果想用http://www.w3cways.com/color/black
这种形式的链接来显示,那就需要重新制作一个对应自定义分类的页面来展示。
这里我们使用tag的展现方式(这里以twentytwelve为例)
首先我们复制一份tag.php
文件,重新命名为taxonomy-color.php
(color为我们之前命名的分类名)。
在get_header(); ?>
下方添加代码
<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>
把
<h1 class="archive-title"><?php printf( __( 'Tag Archives: %s', 'twentytwelve' ), '<span>' . single_tag_title( '', false ) . '</span>' ); ?></h1>
替换成
<h1 class="archive-title"><?php printf( __( 'Tag Archives: %s', 'twentytwelve' ), '<span>' . $term->name . '</span>' ); ?></h1>
在
while ( have_posts() ) : the_post();
下方添加
query_posts(array( 'post_type'=>'post', 'color'=>$term->slug));
保存,再到前台你调用的地方,点击,就会出来以这种链接http://www.w3cways.com/color/black
形式的页面(类似tag.php
)。