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

如何实现WordPress文章按年份分组后再按次级月份层级展示

问题解决

你现有代码的问题在于只对「年+月」的组合做了分组判断,每次检测到新的年月组合时,都会同时关闭上一个月份和年份容器,再重新生成新的年份+月份结构,才导致同一年的不同月份被放在了独立的年份容器中。

修正思路

  • 拆分年份和月份的判断逻辑,单独记录上一次遍历的年份和月份值
  • 年份发生变化时,先关闭前一个年份内打开的月份容器,再关闭前一个年份容器,生成新的年份容器
  • 年份不变但月份发生变化时,只关闭前一个月份容器,生成新的月份容器即可

修正后代码

global $post;

$posts = get_posts( array(
    'post_type' => 'history',
    'orderby'   => 'date',
    'order'     => 'DESC' // 按时间倒序排列,和你示例的展示顺序一致
) );

$_prev_year = '';
$_prev_month = '';
$has_open_month = false;
$has_open_year = false;

foreach ( $posts as $post ) {
    setup_postdata( $post );

    $time = strtotime( $post->post_date );
    $current_year = date( 'Y', $time );
    $current_month = date( 'F', $time );

    // 处理年份变更逻辑
    if ( $current_year !== $_prev_year ) {
        // 先关闭上一层遗留的月份、年份容器
        if ( $has_open_month ) {
            echo '</div>';
            $has_open_month = false;
        }
        if ( $has_open_year ) {
            echo '</div>';
        }

        // 新建年份容器
        echo '<div class="year">';
        echo "<span>$current_year</span>";
        $has_open_year = true;

        // 重置月份记录,换年后月份需要重新生成
        $_prev_month = '';
    }

    // 处理月份变更逻辑
    if ( $current_month !== $_prev_month ) {
        // 关闭上一个月份容器
        if ( $has_open_month ) {
            echo '</div>';
        }

        // 新建月份容器
        echo '<div class="month">';
        echo "<span>$current_month</span>";
        $has_open_month = true;
    }

    // 输出文章标题
    if ( $title = get_the_title() ) {
        echo "<div>$title</div>";
    } else {
        echo "<div>#{$post->ID}</div>";
    }

    // 更新上一次遍历的年月标识
    $_prev_year = $current_year;
    $_prev_month = $current_month;
}

// 遍历结束后关闭剩余打开的容器
if ( $has_open_month ) {
    echo '</div>';
}
if ( $has_open_year ) {
    echo '</div>';
}

wp_reset_postdata();

调整后代码生成的结构就会和你要求的层级一致,同一年的所有月份都会被包裹在同一个.year容器内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:06:00