
在wordpress开发中,我们经常需要获取并显示文章所属的分类。然而,当需要按照特定顺序(例如,在后台菜单中定义的“菜单顺序”)来展示这些分类,并可能需要排除某些分类时,一些常用的函数可能无法满足需求。本文将深入探讨如何优雅地解决这一问题。
理解get_the_category()的局限性
get_the_category()是WordPress中一个非常常用的函数,用于获取当前文章所属的所有分类。它返回一个分类对象数组,包含了分类的ID、名称、别名等信息。然而,该函数的一个主要局限性在于它不提供直接的排序参数。这意味着你无法通过它来控制分类的显示顺序,它通常会按照默认的ID或名称顺序返回结果。
考虑以下常见的代码片段:
<?php
$categories = get_the_category();
foreach($categories as $category) {
// 假设用户希望排除ID为14的分类,并按菜单顺序显示
if($category->cat_ID !== 14){
echo esc_html($category->cat_name);
}
}
?>这段代码能够获取分类并排除特定ID,但它无法实现“菜单顺序”的排序。如果你的分类在后台菜单中经过了拖拽排序,get_the_category()无法感知并应用这种顺序。
wp_get_post_terms():实现自定义排序与排除的核心
为了克服get_the_category()的局限性,WordPress提供了更强大、更灵活的函数:wp_get_post_terms()。这个函数设计用于获取与文章关联的任何分类法术语(包括分类、标签、自定义分类法等),并支持丰富的查询参数,包括排序方式和排除项。
使用wp_get_post_terms()来按菜单顺序显示分类并排除特定项的核心代码如下:
<?php
$terms = wp_get_post_terms( get_the_id(), 'category', array(
'orderby' => 'term_order', // 按菜单顺序排序
'exclude' => array(14) // 排除ID为14的分类
));
?>详细参数解析与应用
wp_get_post_terms()函数接受三个主要参数:
-
$post_id:
- 此参数指定要获取其分类术语的文章ID。通常,我们会使用get_the_id()来动态获取当前循环中文章的ID。
-
$taxonomy:
- 此参数指定要查询的分类法。对于文章的默认分类,我们使用字符串'category'。如果你在使用自定义分类法,则应替换为该分类法的名称。
-
$args (数组):
完整示例代码
结合上述参数,以下是一个完整的代码示例,演示如何获取、遍历并显示按菜单顺序排序且排除特定分类的文章分类:
<?php
// 确保在WordPress循环或有文章ID可用的上下文中运行
if ( have_posts() ) : the_post();
$post_id = get_the_id(); // 获取当前文章ID
// 使用 wp_get_post_terms 获取按菜单顺序排序并排除特定分类的术语
$categories = wp_get_post_terms( $post_id, 'category', array(
'orderby' => 'term_order', // 按菜单顺序排序
'exclude' => array(14) // 排除ID为14的分类
));
// 检查结果是否为空或是否存在错误
if ( ! empty( $categories ) && ! is_wp_error( $categories ) ) {
echo '<h4>文章分类:</h4>';
echo '<ul class="post-categories-menu-ordered">';
foreach ( $categories as $category ) {
// 生成分类链接并安全输出名称
echo '<li><a href="' . esc_url( get_term_link( $category->term_id, 'category' ) ) . '">' . esc_html( $category->name ) . '</a></li>';
}
echo '</ul>';
} else {
echo '<p>当前文章没有符合条件的分类。</p>';
}
endif; // 结束文章循环
?>注意事项与扩展思考
- 错误处理与空结果: 始终建议在使用wp_get_post_terms()的结果之前,通过! empty()和! is_wp_error()进行检查。这可以防止在没有分类或查询失败时出现PHP错误。
- 输出格式: 示例代码中将分类显示为带有链接的无序列表。你可以根据网站的设计和需求,自由调整输出的HTML结构和样式。
-
其他排序选项: orderby参数非常灵活,除了'term_order',还支持其他值,如:
- 'name':按分类名称字母顺序。
- 'slug':按分类别名字母顺序。
- 'id':按分类ID。
- 'count':按分类下文章数量。
- 'none':不排序。
- 包含特定分类: 如果你只想显示特定的几个分类,可以使用'include' => array(2, 5, 8)参数,它会覆盖exclude参数。
- 性能考量: 对于大多数网站而言,wp_get_post_terms()的性能开销可以忽略不计。但在处理大量分类或在极高流量的场景下,可以考虑使用WordPress的转瞬缓存(Transients API)来缓存查询结果,以进一步优化性能。
总结
通过本文的介绍,我们了解到get_the_category()在处理分类排序方面的局限性,并掌握了使用wp_get_post_terms()函数及其orderby和exclude参数来精确控制WordPress文章分类显示的方法。利用'orderby' => 'term_order',开发者能够轻松实现按后台菜单顺序排列分类的需求,同时通过'exclude'参数灵活排除不需要的分类。这种方法不仅提升了分类显示的灵活性,也使得网站内容的组织和呈现更加符合设计预期。










