PHP开发Tribe Events月导航栏重复三月、缺失二月问题求助
问题分析与修复方案
你的Tribe Events月导航栏出现二月消失、三月重复显示的问题,根源在于strtotime("+$i months")的相对日期计算逻辑——当当前日期是某个月份的最后一天,而目标月份的天数少于当前日期时,strtotime会自动跳转到下一个月的对应日期,导致月份计算错误(比如2020年1月31日加1个月会变成3月2日,直接跳过了二月,进而出现两次三月的显示)。
下面是修复后的代码,我替换了错误的相对日期计算方式,改用基于当前年月的数值递推来生成每个月份,彻底避免strtotime的这个陷阱:
<?php // 获取当前域名和请求URL $domain = $_SERVER['HTTP_HOST']; $url = "http://" . $domain . $_SERVER['REQUEST_URI']; // 获取当前年月(用数值格式避免本地化干扰) $current_year = (int)date_i18n('Y'); $current_month = (int)date_i18n('n'); // 获取1-12的月份数值 echo "<ul id='my-month-bar'>"; // 循环生成12个连续月份 for ($i = 0; $i <= 11; $i++) { // 计算当前循环的年月:处理跨年度的情况 $target_month = $current_month + $i; $target_year = $current_year; if ($target_month > 12) { $target_month -= 12; $target_year += 1; } // 生成本地化的月份缩写、标题等 $m = date_i18n('M', mktime(0, 0, 0, $target_month, 1, $target_year)); $title = sprintf('%04d-%02d-01', $target_year, $target_month); $current_ym = sprintf('%04d-%02d', $target_year, $target_month); // 构建查询URL $my_mo = get_query_var('tribe-bar-date'); $new_query = add_query_arg( array('tribe-bar-date' => $title), $url ); // 输出导航项(区分当前选中月份) if ($my_mo == $current_ym) { echo "<li><a title='Veranstaltungen im $m' rel='nofollow' id='my-monthbar-act' href='$new_query'> $m </a></li>"; } else { echo "<li><a title='Veranstaltungen im $m' rel='nofollow' id='my-monthbar' href='$new_query'> $m </a></li>"; } } echo "</ul>"; ?>
修复要点说明:
- 改用数值化的年月计算:直接基于当前月份的数值进行递推,处理跨年度的情况(比如12月加1个月变为次年1月),完全避免strtotime的相对日期陷阱。
- 使用
mktime生成可靠日期:通过指定每月1号来生成日期,确保每个月份的计算都准确无误,不会因为当月天数导致跳转。 - 保留原有功能:维持了本地化月份显示、当前月份高亮、Tribe Events查询参数传递等原有功能。
你可以直接替换原有代码,清除缓存后测试,二月应该会正常显示,三月重复的问题也会解决。
内容的提问来源于stack exchange,提问作者Benedikt Sahlmüller
相关产品推荐
相关产品推荐

