WordPress子主题覆盖插件函数 修改WhatsApp订单日期为PT_BR
解决WordPress WhatsApp插件订单日期转为巴西葡萄牙语的问题
问题背景
使用一款可将WordPress订单信息发送至WhatsApp的插件时,消息末尾的日期显示为英文,需要改为巴西葡萄牙语(PT_BR)格式。插件中生成日期的核心代码如下:
<?php function wa_order_thank_you_override( $title, $id ) { // 其他代码... $date = date( 'F j, Y – g:i A', $order->get_date_created()->getOffsetTimestamp()); // 其他代码... } ?>
自行编写的自定义函数未生效,尝试的代码如下:
<?php function my_custom_filter_function($date) { date_default_timezone_set( 'America/Sao_Paulo' ); $dateTimeObj = new DateTime('now', new DateTimeZone('America/Sao_Paulo')); $dateFormatted = IntlDateFormatter::formatObject( $dateTimeObj, 'eeee, d MMMM y, HH:mm', 'pt_BR' ); $date = ucwords($dateFormatted); } add_filter('wa_order_thank_you_override', 'my_custom_filter_function'); ?>
问题原因
你尝试的add_filter无法生效,是因为wa_order_thank_you_override是插件定义的函数名,而非WordPress的filter钩子。原函数内部的$date变量没有被挂载任何filter,所以直接针对函数名添加filter不起作用。
解决方案
方法1:覆盖可插拔函数(优先推荐)
首先检查插件中wa_order_thank_you_override函数的定义是否包含if (!function_exists('wa_order_thank_you_override'))判断(即该函数是可插拔的)。如果是,直接在主题的functions.php文件中重新定义该函数,仅替换日期生成的代码:
<?php function wa_order_thank_you_override( $title, $id ) { // 保留原函数的所有其他代码,仅修改日期生成部分 $order = wc_get_order( $id ); if ( $order ) { // 设置时区为圣保罗 date_default_timezone_set( 'America/Sao_Paulo' ); // 方案A:使用IntlDateFormatter(需服务器安装intl扩展) $date_obj = $order->get_date_created(); $dateFormatted = IntlDateFormatter::formatObject( $date_obj, 'eeee, d MMMM y, HH:mm', 'pt_BR' ); $date = ucwords($dateFormatted); // 方案B:使用strftime(无需intl扩展,需服务器支持pt_BR本地化) // setlocale(LC_TIME, 'pt_BR.utf8', 'pt_BR', 'portuguese'); // $date = strftime('%A, %d de %B de %Y, %H:%M', $order->get_date_created()->getOffsetTimestamp()); } // 保留原函数的其他逻辑和返回语句 return $title; } ?>
方法2:寻找插件内置的Filter钩子
如果插件开发者为订单日期预留了filter(例如wa_order_date_display),可以直接通过该钩子修改日期格式。假设插件中有类似如下代码:
$date = apply_filters('wa_order_date_display', $date, $order);
则可以添加以下代码到functions.php:
<?php function custom_wa_order_date($date, $order) { date_default_timezone_set( 'America/Sao_Paulo' ); $date_obj = $order->get_date_created(); $dateFormatted = IntlDateFormatter::formatObject( $date_obj, 'eeee, d MMMM y, HH:mm', 'pt_BR' ); return ucwords($dateFormatted); } add_filter('wa_order_date_display', 'custom_wa_order_date', 10, 2); ?>
方法3:直接修改插件代码(不推荐)
如果以上两种方法都不可行,可直接修改插件中的日期生成代码,但不推荐——因为插件更新后修改会被覆盖。修改时将原代码替换为:
date_default_timezone_set( 'America/Sao_Paulo' ); $date_obj = $order->get_date_created(); $date = IntlDateFormatter::formatObject( $date_obj, 'eeee, d MMMM y, HH:mm', 'pt_BR' ); $date = ucwords($date);
内容的提问来源于stack exchange,提问作者Henrique R. Pohl
相关产品推荐
相关产品推荐

