在WordPress与WooCommerce中实现公历转波斯太阳历
将WordPress/WooCommerce日期转为波斯太阳历的解决方案
核心思路
通过修改WordPress的日期格式化钩子,替换默认的公历日期输出为波斯历,无需依赖插件,直接在主题的functions.php中添加代码即可实现全站或模板内的日期转换。
代码实现
方法1:全局替换(全站所有日期生效)
将以下代码添加到主题的functions.php文件中:
function convert_to_persian_date($date, $format) { // 后台管理页面保留原日期格式,避免影响操作 if (is_admin()) { return $date; } // 获取原始时间戳,转换失败则返回原日期 $timestamp = strtotime($date); if (!$timestamp) { return $date; } // 初始化波斯历日历对象 $persian_calendar = new IntlGregorianCalendar(); $persian_calendar->setTimeZone(new DateTimeZone(wp_timezone_string())); $persian_calendar->setTime($timestamp * 1000); // 映射公历格式符到波斯历格式符 $persian_format = str_replace( ['Y', 'm', 'd', 'F', 'M', 'l', 'D'], ['yyyy', 'MM', 'dd', 'MMMM', 'MMM', 'EEEE', 'EEE'], $format ); // 创建日期格式化器并输出波斯历日期 $formatter = new IntlDateFormatter( 'fa_IR@calendar=persian', IntlDateFormatter::FULL, IntlDateFormatter::FULL, wp_timezone_string(), IntlDateFormatter::TRADITIONAL ); $formatter->setPattern($persian_format); return $formatter->format($persian_calendar); } add_filter('date_i18n', 'convert_to_persian_date', 10, 2);
方法2:局部替换(仅模板the_time调用生效)
如果仅需要修改模板中the_time输出的日期,用以下代码替换上述全局钩子:
function custom_the_time($format) { // 获取文章发布时间戳 $post_timestamp = get_post_time('U', true); // 初始化波斯历日历对象 $persian_calendar = new IntlGregorianCalendar(); $persian_calendar->setTimeZone(new DateTimeZone(wp_timezone_string())); $persian_calendar->setTime($post_timestamp * 1000); // 映射公历格式符到波斯历格式符 $persian_format = str_replace( ['Y', 'm', 'd', 'F', 'M', 'l', 'D'], ['yyyy', 'MM', 'dd', 'MMMM', 'MMM', 'EEEE', 'EEE'], $format ); // 创建日期格式化器并输出波斯历日期 $formatter = new IntlDateFormatter( 'fa_IR@calendar=persian', IntlDateFormatter::FULL, IntlDateFormatter::FULL, wp_timezone_string(), IntlDateFormatter::TRADITIONAL ); $formatter->setPattern($persian_format); return $formatter->format($persian_calendar); } // 替换the_time函数的输出 add_filter('the_time', 'custom_the_time', 10, 1);
注意事项
- 确保服务器已启用Intl扩展(PHP 5.3+默认支持,若未启用需联系主机商开启)。
- 方法1会覆盖全站所有日期输出,包括文章、评论、WooCommerce订单日期等;方法2仅针对模板中
the_time的调用。 - 如需支持更多日期格式,可扩展
str_replace中的格式符映射规则。
内容的提问来源于stack exchange,提问作者user21540512
相关产品推荐
相关产品推荐

