WordPress中修改代码使the_modified_time转换为波斯历
解决WordPress文章修改日期无法转为波斯历的问题
问题说明
已在主题的functions.php中添加公历转波斯历的代码片段,使用<?php the_time('Y/m/d'); ?>显示文章发布日期时,能正常完成公历到波斯历的转换;但使用<?php the_modified_time('Y/m/d'); ?>显示文章修改日期时,转换代码无效,仍显示公历日期。
问题根源
- 原代码仅为
the_time钩子添加了转换过滤器,未对the_modified_time钩子做处理,导致修改日期的输出未经过转换逻辑。 - 转换函数硬编码调用
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
相关产品推荐
相关产品推荐

