You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress循环仅显一次分类名及获取子分类名的技术问询

解答你的两个WordPress问题

一、在循环内仅为第一篇文章显示分类名

完全可以在循环内实现!WP_Query对象自带一个current_post属性,它会从0开始记录当前循环到第几篇文章(第一篇对应的值就是0)。我们只需要给显示分类名的代码加个条件判断,只有当$catg->current_post == 0时才输出即可。

修改你的现有代码如下:

<?php 
$args = array( 
    'post_type' => 'post', 
    'orderby' => 'date', 
    'order' => 'ASC', 
    'cat' => 19 
); 
$catg = new WP_Query($args); 
?> 
<?php if($catg->have_posts()) : ?> 
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 lock"> 
    <?php while($catg->have_posts()) : $catg->the_post() ?> 
    <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 lock"> 
        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
            <?php 
            // 仅第一篇文章显示分类名
            if($catg->current_post === 0) {
                $categories = get_the_category(); 
                if(!empty($categories)) {
                    // 这里会用下面优化后的逻辑获取子分类
                    $subcategory = '';
                    foreach($categories as $cat) {
                        if($cat->parent !== 0) {
                            $subcategory = $cat;
                            break;
                        }
                    }
                    if($subcategory) {
                        ?>
                        <h2 style="text-transform: uppercase;"><?php echo $subcategory->cat_name; ?></h2>
                        <?php
                    }
                }
            }
            ?>
        </div> 
        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 lock"> 
            <a href="<?php echo get_permalink( $post->ID ); ?>" class="topico1-link-c"> 
                <div class="topico3-col2-c cursos-margem-direita col-xs-12 col-sm-12 col-md-12 col-lg-12" style="padding-left: 0px;"> 
                    <div class="topico1-img col-xs-12 col-sm-12 col-md-12 col-lg-12 lock"> 
                        <img src="<?php echo wp_get_attachment_url(get_post_thumbnail_id($post->ID)); ?>"> 
                        <div class="imagem-pelicula"></div> 
                    </div> 
                    <div class="topico1-title col-xs-12 col-sm-12 col-md-12 col-lg-12"> 
                        <h3 class="h3-low-c"><?php echo get_the_title(); ?></h3> 
                    </div> 
                </div> 
            </a> 
        </div> 
    </div> 
    <?php endwhile ?> 
<?php endif ?> 
</div>

二、准确获取子分类名

你之前通过$category[1]获取的方式不可靠,因为get_the_category()返回的分类顺序是由分类ID或后台自定义排序决定的,父分类随时可能排在前面。正确的做法是遍历分类数组,找到parent属性不为0的分类——子分类的parent值是其父分类的ID,而顶级分类的parent始终是0。

如果你只需要第一个子分类,用这段逻辑就够了:

<?php
$categories = get_the_category();
$subcategory = '';
if(!empty($categories)) {
    foreach($categories as $cat) {
        // 筛选出父ID不为0的分类(即子分类)
        if($cat->parent !== 0) {
            $subcategory = $cat;
            break; // 找到第一个子分类就停止遍历
        }
    }
    // 有子分类就输出名称
    if($subcategory) {
        echo '<h2 style="text-transform: uppercase;">' . $subcategory->cat_name . '</h2>';
    }
}
?>

如果文章可能属于多个子分类,想要显示所有子分类,只需要去掉break,改成循环输出每个子分类的名称即可。这样不管分类排序怎么变,都能精准拿到子分类,不会误取到父分类啦!

内容的提问来源于stack exchange,提问作者BlaTimba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:58