
本文讲解如何正确获取自定义文章类型(如 blog)所属的全部分类(taxonomy)的 slug,并合并为逗号分隔的字符串,用于 CSS 类名或 data 属性,避免只显示单个分类的常见错误。
本文讲解如何正确获取自定义文章类型(如 `blog`)所属的全部分类(taxonomy)的 slug,并合并为逗号分隔的字符串,用于 css 类名或 data 属性,避免只显示单个分类的常见错误。
在 WordPress 开发中,当使用 get_the_terms() 获取文章所属的多个分类(例如自定义分类法 blog_categories)时,直接在循环中反复赋值 $slug = $category->slug 会导致仅保留最后一个分类的 slug——这正是原代码无法显示全部分类的根本原因。
正确的做法是:先将所有分类 slug 收集到一个数组中,再用 implode() 合并为逗号分隔的字符串。以下是优化后的完整实现:
<?php $mi_args = array(
'post_status' => 'publish',
'posts_per_page' => -1, // 推荐使用 -1 替代 '99999',语义更清晰且性能更优
'post_type' => 'blog',
);
$mi_query = new WP_Query($mi_args);
if ($mi_query->have_posts()) :
while ($mi_query->have_posts()) : $mi_query->the_post();
$portfolio_url = get_post_meta(get_the_ID(), 'portfolio_url_portfolio-url', true);
$hover_color = get_post_meta(get_the_ID(), 'hove_color_hover-color', true);
// 获取当前文章在 'blog_categories' 分类法下的所有术语对象
$work_category = get_the_terms(get_the_ID(), 'blog_categories');
$slug_array = array();
// 安全遍历:需判断 $work_category 是否为有效数组(避免 PHP 警告)
if (!is_wp_error($work_category) && !empty($work_category)) {
foreach ($work_category as $category) {
$slug_array[] = $category->slug;
}
}
// 合并为逗号分隔字符串(如:'cate1,cate2,cate3')
$slug_list = implode(',', $slug_array);
// 输出 HTML:务必使用 esc_attr() 转义输出,防止 XSS 漏洞
?>
<div class="portfolio-item <?php echo esc_attr($slug_list); ?>" data-category="<?php echo esc_attr($slug_list); ?>">
<!-- 此处插入文章内容,如 the_title(), the_excerpt() 等 -->
</div>
<?php endwhile;
wp_reset_postdata(); // 重置全局 $post 对象,必不可少
endif;
?>
✅ 关键改进说明:
- 数组收集 + implode():取代覆盖式赋值,确保所有分类 slug 均被保留;
- 错误与空值防护:通过 !is_wp_error() 和 !empty() 避免在无分类或查询失败时触发警告;
- 安全输出:esc_attr() 对输出到 HTML 属性中的动态内容进行转义,符合 WordPress 安全规范;
- 性能优化:posts_per_page => -1 比 '99999' 更标准,且语义明确(获取全部);
- 必要清理:wp_reset_postdata() 在循环结束后调用,防止后续模板逻辑受干扰。
⚠️ 注意事项:
- 若分类法 blog_categories 未正确注册或文章未分配任何该分类,get_the_terms() 将返回 false 或 WP_Error,务必校验;
- 如需显示中文分类名称(非 slug),可改用 $category->name,但注意 URL 友好性与 CSS 类名限制(建议 slug 更稳妥);
- 多分类场景下,data-category 值为逗号字符串,前端 JS 解析时可用 element.dataset.category.split(',') 转为数组。
掌握这一模式后,你不仅能准确渲染多分类标识,还可轻松扩展至标签(tags)、自定义术语等其他上下文,是 WordPress 主题与插件开发中的基础实用技能。











