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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:32:53