如何在WooCommerce邮件通知中获取自定义元字段值
解决WooCommerce邮件中获取自定义订单项元字段的问题
看起来你遇到的核心问题有两个:一是订单项的自定义元字段可能没正确保存到订单中(因为钩子用错了),二是即便保存成功,邮件模板默认也不会自动输出这些自定义元数据。咱们一步步来搞定:
第一步:确保自定义元字段正确保存到订单项
你当前的函数wdm_add_custom_order_line_item_meta用错了钩子!woocommerce_email_order_details是邮件触发的钩子,根本不是用来保存订单项元数据的。正确的钩子应该是woocommerce_checkout_create_order_line_item,它会在结账时把购物车项的元数据同步到订单行项里。修改后的保存代码如下:
function wdm_add_custom_order_line_item_meta($item, $cart_item_key, $values, $order) { if(array_key_exists('wdm_name', $values)) { // 添加元数据,第三个参数控制是否在后台可见(true=隐藏,false=直接显示) $item->add_meta_data('_wdm_name', $values['wdm_name'], true); } } // 替换成正确的钩子,参数数量要匹配(最后一个4代表接收4个参数) add_action( 'woocommerce_checkout_create_order_line_item', 'wdm_add_custom_order_line_item_meta', 10, 4 );
保存后,你可以去WooCommerce后台查看订单的订单项,确认_wdm_name是否已经被正确保存(如果第三个参数设为false,会直接显示在订单项下方;设为true则需要点击"显示隐藏元数据"查看)。
第二步:在邮件通知中输出自定义元字段
接下来,我们需要在邮件的订单详情里把这个字段显示出来。用woocommerce_email_order_details钩子,循环每个订单项,取出自定义元数据并输出:
function wdm_display_custom_meta_in_email($order, $sent_to_admin, $plain_text, $email) { // 循环订单的每个订单项 foreach( $order->get_items() as $item_id => $item ) { // 获取自定义元字段的值 $wdm_name = $item->get_meta('_wdm_name'); // 如果值存在,就输出(区分纯文本和HTML邮件格式) if( !empty($wdm_name) ) { if( $plain_text ) { echo '自定义名称: ' . $wdm_name . "\n"; } else { echo '<p><strong>自定义名称:</strong> ' . esc_html($wdm_name) . '</p>'; } } } } // 优先级设为20,确保在默认订单详情之后输出,也可以改成5让它显示在前面 add_action( 'woocommerce_email_order_details', 'wdm_display_custom_meta_in_email', 20, 4 );
小提示:
- 使用
esc_html()是为了防止恶意代码注入,保证输出内容的安全性。 - 如果你的自定义元字段是订单级别的(不是绑定到单个商品项),那可以用
$order->get_meta('_your_meta_key')直接获取,但根据你的代码逻辑,订单项级别的获取方式更适配。
把这两段代码添加到主题的functions.php文件或者自定义插件里,测试一下邮件通知,就能看到你的自定义元字段正常显示啦!
内容的提问来源于stack exchange,提问作者Aleks Pvn
相关产品推荐
相关产品推荐

