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

如何完全覆盖WooCommerce的woocommerce_email_order_meta钩子?是否需新建钩子?

WooCommerce邮件自定义配送信息问题解决

为什么原始内容还会显示?

你当前的remove_action执行时机太早——WooCommerce的woocommerce_email_order_meta动作是在插件加载完成后才注册的,直接在functions.php顶部调用remove_action时,这个动作还没被添加,所以移除无效,原始内容自然会继续输出。

完全覆盖现有钩子的正确方法

把移除和添加动作的逻辑放到woocommerce_loaded钩子中,确保在WooCommerce完成初始化后再执行:

add_action('woocommerce_loaded', 'override_email_order_meta_hook');
function override_email_order_meta_hook() {
    // 移除原始动作,优先级和参数个数要和原始注册一致(原始是10,4个参数)
    remove_action('woocommerce_email_order_meta', 'woocommerce_email_order_meta', 10, 4);
    // 添加自定义动作
    add_action('woocommerce_email_order_meta', 'custom_email_order_meta_content', 10, 4);
}

function custom_email_order_meta_content($order, $sent_to_admin, $plain_text, $email) {
    // 这里替换成你的配送日期时间逻辑,示例从订单元数据中读取
    $delivery_date = $order->get_meta('_delivery_date');
    $delivery_time = $order->get_meta('_delivery_time');

    if ($plain_text) {
        // 纯文本邮件格式
        echo "配送日期:{$delivery_date}\n";
        echo "配送时间:{$delivery_time}\n";
    } else {
        // HTML邮件格式
        echo "<p><strong>配送日期:</strong>{$delivery_date}</p>";
        echo "<p><strong>配送时间:</strong>{$delivery_time}</p>";
    }
}

是否需要新建钩子?

如果只是替换原有订单元数据区域的内容,上面的覆盖方法完全够用,不需要新建钩子。

如果想把配送信息作为独立模块,方便灵活调整在邮件中的位置,才需要新建钩子。但新建的钩子默认不会在WooCommerce邮件编辑器中显示——编辑器里的可添加块是WooCommerce预设的,自定义钩子需要你通过代码手动插入到邮件的指定位置(比如woocommerce_email_before_order_table、woocommerce_email_after_order_table等现有钩子位置),或者通过开发自定义邮件块插件来让它在编辑器中可选(这个流程较复杂)。

比如新建钩子并插入到邮件订单表格之后:

// 定义自定义配送信息钩子
add_action('woocommerce_email_delivery_info', 'render_delivery_info', 10, 4);
function render_delivery_info($order, $sent_to_admin, $plain_text, $email) {
    $delivery_date = $order->get_meta('_delivery_date');
    $delivery_time = $order->get_meta('_delivery_time');

    if ($plain_text) {
        echo "\n--- 配送信息 ---\n";
        echo "配送日期:{$delivery_date}\n";
        echo "配送时间:{$delivery_time}\n";
    } else {
        echo "<div style='margin: 20px 0; padding: 10px; background: #f8f8f8; border-radius: 4px;'>";
        echo "<h3 style='margin-top:0;'>配送信息</h3>";
        echo "<p><strong>配送日期:</strong>{$delivery_date}</p>";
        echo "<p><strong>配送时间:</strong>{$delivery_time}</p>";
        echo "</div>";
    }
}

// 把自定义钩子插入到邮件订单表格之后
add_action('woocommerce_email_after_order_table', function($order, $sent_to_admin, $plain_text, $email) {
    do_action('woocommerce_email_delivery_info', $order, $sent_to_admin, $plain_text, $email);
}, 15, 4);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:06