实战WordPress自定义文章类型(2) – 自定义分类

最近WordPress自定义文章类型相关的开发做得比较多,对此多做了一些小研究,笔记一下。之前写过一篇实战Wordpress自定义文章类型(1),本文就作为这篇文章的后续。

WordPress给默认的文章功能赋予了分类目录(Categories)的功能:
WordPress默认的文章分类功能

也就是说文章Posts拥有Cagegories,而自定义文章类型默认是没有这个功能的。但WordPress给自定义文章开放了term(分类)这个功能,在后台的操作方式和Cagegory是一样的。每一种term都有一个名称,叫做taxonomy(翻译为分类法)。也可以把cagegory理解为一种名称叫做Cagegory的term。

下面是程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add_action( 'init', 'create_hotel_taxonomies', 0 );//Hotel自定义分类
function create_hotel_taxonomies() {
	register_taxonomy(
		'hotel_category', //后续要用到的分类法名称
		'hotels',
		array(
			'labels' => array(
				'name' => 'Hotel Location',
				'add_new_item' => 'Add New Hotel Location',
				'new_item_name' => "New Hotel Location"
			),
			'show_ui' => true,
			'show_tagcloud' => false,
			'hierarchical' => true
		)
	);
}

这段代码添加到functions.php中,刷新后台,就能看到在我的自定义文章类型Hotels下,有了一个叫做‘Hotel Location’的分类法
自定义分类法添加完毕
我的分类法在程序里面的name叫’hotel_category’,在后台显示出来的label name是‘Hotel Location’,在后续的开发中要用到的name只有’hotel_category’这一个。

为了管理方便,在后台的Hotels列表里面,我希望也能把这个分类法体现出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add_filter( 'manage_edit-hotels_columns', 'hotel_columns' );//在后台的Hotels列表中添加分类的列
function hotel_columns( $columns ) {
	$columns['hotel_category'] = 'Category'; //添加‘hotel_category’的列
	$columns['hotel_id'] = 'Hotel Id'; //把hotel的ID也作为一列添加
	return $columns;
}
add_action( 'manage_posts_custom_column', 'hotel_populate_columns' );//在后台的Hotels列表中添加分类列和ID列的数据
function hotel_populate_columns( $column ) {
	if ( 'hotel_category' == $column ) {
		$hotel_category =  get_the_term_list(get_the_ID(), 'hotel_category', '','<br/>') ;//显示所属自定义分类的list,用回车分隔
		echo $hotel_category;
	}
	if ( 'hotel_id' == $column ) {
		$hotel_id =  get_the_ID() ;
		echo $hotel_id;
	}
}

在后台添加几条hotel的数据,列表里显示出分类和ID这两列:
后台添加的自定义列

接下来需要在主题中调用这些分类了,主要有这几种方法:

1. 用get_posts()函数调用指定的自定义分类文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<ul>
<?php
$myposts = get_posts( array( 
	'numberposts'=>50, 
	'post_type' => 'hotels', 
	'orderby' => 'post_title', 
	'order' => 'ASC',
	'hotel_category' => 'China' //在此直接设置分类法名称和值,get_posts()函数就会调用对应的文章内容
) );
foreach( $myposts as $post ) {
	$content = $post->post_content;
	if ( ! $content ) // Check for empty page
	continue;
	$content = apply_filters( 'the_content', $content );
?>
	<li><a href="<?php the_permalink(); ?>">
		<?php the_title(); ?><br/>
		<?php the_terms( $post->ID, 'hotel_category' ); ?>
	</a></li>
<?php }; ?>
</ul>

2. 用the_terms()函数调用当前文章所属的分类链接列表

the_terms()函数在上面已经用过,详细列举它的具体用法

1
2
3
the_terms( get_the_ID(), 'hotel_category' ); //调用指定ID文章的自定义分类列表
the_terms( $post->ID, 'hotel_category' ); //调用当前文章的自定义分类列表
the_terms( $post->ID, 'Hotel Location:', 'hotel_category: ', ' / ' ); //添加前缀,分隔符等,输出结果变成:Hotel Location: China / Thailand / Japan

the_terms()函数的官方文档:http://codex.wordpress.org/Function_Reference/the_terms

3. 用get_the_terms()函数调出当前文章的所有term信息

这个函数非常有用,有时候我们需要用到当前文章的自定义分类名称,ID,别名,描述,甚至于这个分类下有多少其他文章等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$terms=get_the_terms( $post->ID, 'hotel_category');
$termNames = array();
$termIDs = array();
$termSlugs = array();
$termDescs = array();
$termCounts = array();
$termStrings = array();
foreach ( $terms as $term ) {
	$termNames[] = $term->name; //把分类值的名称加入到数组
	$termIDs[] = $term->term_id; //把分类的ID加入到数组
	$termSlugs[] = $term->slug; //把分类的别名加入到数组
	$termDescs[] = $term->description; //把分类的描述加入到数组
	$termCounts[] = $term->count; //把分类的文章数量统计加入到数组
	$termStrings[] = $term->name."(".$term->count.")";
}				
$termString = join( ", ", $termStrings ); //把名称用逗号连起来组成这样的字符串:China(3), Thailand(1), Japan(2)

get_the_terms()函数的官方文档:http://codex.wordpress.org/Function_Reference/get_the_terms

4. 便捷的get_the_term_list(),直接输出带链接的分类列表

1
2
3
echo '<ul>';
echo get_the_term_list( $post->ID, 'hotel_category', '<li>', '', '</li>' );
echo '</ul>';

get_the_term_list()函数的官方文档:http://codex.wordpress.org/Function_Reference/get_the_term_list

5. 用get_terms()函数,在任何地方输出某个自定义分类的列表

1
2
3
4
5
6
7
8
9
10
$terms = get_terms( 'hotel_category' );
$termsCount = 0;
if ( $terms && !is_wp_error( $terms ) ) {
	echo '<ul class="archive-list">';
	foreach ( $terms as $term ) {
		echo '<li><a href="'.get_term_link( $term, $term->taxonomy ) . '">' . $term->name . '</a><span>('.$term->count.')</span></li>';
		$termsCount += $term->count;
	}
	echo '</ul>';
}

get_terms()函数的官方文档:http://codex.wordpress.org/Function_Reference/get_terms

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/731.html。百度不可信,搜索请谨慎。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以获取本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注