如何实现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
相关产品推荐
相关产品推荐

