WordPress如何按标签展示自定义文章类型文章并隐藏空标签
问题根因
你现在的写法有两个核心错误:
get_tags()本身不接受你传入的文章查询参数,你定义的$args是用来查询自定义文章类型的,对标签查询完全不生效,所以会拿到全站所有post_tag标签,包括没有关联目标文章的Tag 3- 你先输出了标签标题才判断有没有关联文章,自然会把空标签的标题也渲染出来
修复方案
不需要改动整体逻辑,仅调整判断顺序,空标签直接跳过不渲染即可,修复后的完整代码如下:
// 这三个变量根据页面slug动态变化 $cpt = 'houses'; // 注意字符串要加引号,原写法属于语法错误 $tax = 'type'; $term = 'small'; $args = array( 'posts_per_page' => -1, 'orderby' => 'name', 'order' => 'ASC', 'post_type' => $cpt, 'tax_query' => array( array( 'taxonomy' => $tax, 'field' => 'name', 'terms' => $term ) ) ); $tags = get_tags(); // 不需要传入无效的$args $posts = get_posts($args); foreach($tags as $tag) { // 先统计当前标签下匹配的文章 $tag_posts = []; foreach($posts as $post) { if(has_tag($tag, $post)) { // 明确传$post参数,避免默认调用全局post导致判断错误 $tag_posts[] = $post; } } // 没有匹配文章直接跳过,不渲染标签和后续内容 if(empty($tag_posts)) continue; ?> <h5><?php echo $tag->name.' (Tag)'; ?></h5> <?php foreach($tag_posts as $p) { setup_postdata($p); // 初始化post数据,保证the_permalink/the_title等模板标签输出正确 ?> <a href="<?php echo get_the_permalink($p); ?>"><?php echo get_the_title($p).' (Post)'; ?></a><br> <?php } wp_reset_postdata(); // 重置post数据,避免污染后续查询 ?> <hr> <?php } ?>
额外优化说明
如果你的标签不是WordPress默认的post_tag,而是自定义分类法,只需要把get_tags()替换为get_terms('你的自定义标签分类法别名')即可。
内容的提问来源于stack exchange,提问作者juunichiro
相关产品推荐
相关产品推荐

