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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:57:41