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

WordPress中修改代码使the_modified_time转换为波斯历

解决WordPress文章修改日期无法转为波斯历的问题

问题说明

已在主题的functions.php中添加公历转波斯历的代码片段,使用<?php the_time('Y/m/d'); ?>显示文章发布日期时,能正常完成公历到波斯历的转换;但使用<?php the_modified_time('Y/m/d'); ?>显示文章修改日期时,转换代码无效,仍显示公历日期。

问题根源

  1. 原代码仅为the_time钩子添加了转换过滤器,未对the_modified_time钩子做处理,导致修改日期的输出未经过转换逻辑。
  2. 转换函数硬编码调用get_the_time()获取发布时间,即使挂到the_modified_time钩子上,也会错误地转换发布时间而非修改时间。

修改后的完整代码

替换functions.php中原有的日期转换代码为以下内容:

// 同时为发布日期和修改日期的输出添加转换过滤器
add_filter('the_time', 'convert_to_persian_date', 10, 3);
add_filter('the_modified_time', 'convert_to_persian_date', 10, 3);

function convert_to_persian_date($formatted_date, $format, $post) {
    // 仅处理Y/m/d格式的日期,避免影响其他格式的输出
    if ($format !== 'Y/m/d') {
        return $formatted_date;
    }

    // 根据当前钩子判断要获取的日期类型
    $current_filter = current_filter();
    if ($current_filter === 'the_modified_time') {
        $date_str = get_the_modified_time('Y/m/d', $post);
    } else {
        $date_str = get_the_time('Y/m/d', $post);
    }

    $date_parts = explode('/', $date_str);
    $persian_date = g2p($date_parts[0], $date_parts[1], $date_parts[2]);
    return $persian_date[0] . '/' . $persian_date[1] . '/' . $persian_date[2];
}

// 保留原有的公历转波斯历核心函数g2p不变
function g2p($g_y, $g_m, $g_d)
{
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

    $gy = $g_y - 1600;
    $gm = $g_m - 1;
    $gd = $g_d - 1;

    $g_day_no = 365 * $gy + floor(($gy + 3) / 4) - floor(($gy + 99) / 100) + floor(($gy + 399) / 400);

    for ($i = 0; $i < $gm; ++$i) {
        $g_day_no += $g_days_in_month[$i];
    }

    if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0))) {
        /* 闰年且在2月之后 */
        ++$g_day_no;
    }

    $g_day_no += $gd;
    $j_day_no = $g_day_no - 79;
    $j_np = floor($j_day_no / 12053);
    $j_day_no %= 12053;
    $jy = 979 + 33 * $j_np + 4 * floor($j_day_no / 1461);
    $j_day_no %= 1461;

    if ($j_day_no >= 366) {
        $jy += floor(($j_day_no - 1) / 365);
        $j_day_no = ($j_day_no - 1) % 365;
    }
    $j_all_days = $j_day_no + 1;

    for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i) {
        $j_day_no -= $j_days_in_month[$i];
    }

    $jm = $i + 1;
    $jd = $j_day_no + 1;

    return array($jy, $jm, $jd, $j_all_days);
}

修改要点说明

  • 新增the_modified_time过滤器绑定,让修改日期的输出也经过转换逻辑。
  • 转换函数convert_to_persian_date新增钩子参数判断,根据当前调用的钩子选择获取发布时间或修改时间。
  • 添加格式判断,仅处理Y/m/d格式的日期,避免影响其他格式的日期输出(例如如果使用the_time('F j, Y')这类格式时,不会被转换)。
  • 保留原有的g2p核心转换函数,确保公历转波斯历的逻辑不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:23:24