阅读数:2908 时间:14/10/2022 来源:解决方案、技术分享 标签:Wordpress技术文档
WordPress给默认的文章功能赋予了分类目录(Categories)的功能:
也就是说文章Posts拥有Cagegories,而自定义文章类型默认是没有这个功能的。但WordPress给自定义文章开放了term(分类)这个功能,在后台的操作方式和Cagegory是一样的。每一种term都有一个名称,叫做taxonomy(翻译为分类法)。也可以把cagegory理解为一种名称叫做Cagegory的term。
下面是程序:
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列表里面,我希望也能把这个分类法体现出来:
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这两列:
接下来需要在主题中调用这些分类了,主要有这几种方法:
文章大纲
<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>
the_terms()函数在上面已经用过,详细列举它的具体用法
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
这个函数非常有用,有时候我们需要用到当前文章的自定义分类名称,ID,别名,描述,甚至于这个分类下有多少其他文章等
$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
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
$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