如何完全覆盖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
相关产品推荐
相关产品推荐

