如何在WooCommerce订单邮件通知中添加产品标签至订单项
解决WooCommerce订单邮件添加产品标签(活动地点)的问题
现有功能(课程日期)
你已经成功通过以下代码在WooCommerce订单邮件中添加了课程日期自定义字段:
/** * Add a custom field & product tag (in an order) to the emails */ add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4); function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) { $product = $item->get_product(); if ( empty( $product ) ) { return false; } $date = get_field( 'course_dates', $product->get_id() ); if ( !empty( $date ) ) { echo '<div style="font-size:12px;"><br>Course Date(s): '. $date .'</div>'; } }
错误代码的问题分析
你编写的添加产品标签的代码存在以下问题:
- 钩子
woocommerce_order_item_meta_end的回调参数不匹配:该钩子的正确参数为$item_id, $item, $order, $plain_text,但你写的是$order, $sent_to_admin, $plain_text, $email,参数顺序错误直接导致致命错误 - 直接通过
$item['product_tag']获取标签的方式错误,WooCommerce订单项对象没有这个索引,必须先获取关联的产品对象再提取标签 - 单独注册钩子会重复遍历订单项,逻辑冗余且容易引发冲突
正确解决方案(整合课程日期与产品标签)
无需新增钩子,直接在已有函数中添加产品标签的逻辑,代码如下:
/** * Add custom field (course dates) & product tag (location) to order emails */ add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4); function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) { $product = $item->get_product(); if ( empty( $product ) ) { return; } // 显示课程日期 $date = get_field( 'course_dates', $product->get_id() ); if ( !empty( $date ) ) { echo '<div style="font-size:12px;"><br>Course Date(s): '. esc_html($date) .'</div>'; } // 显示产品标签(作为活动地点) $product_tags = wp_get_post_terms($product->get_id(), 'product_tag', array('fields' => 'names')); if ( !empty($product_tags) ) { // 多个标签用逗号分隔显示 $location = implode(', ', $product_tags); echo '<div style="font-size:12px;">Location: '. esc_html($location) .'</div>'; } }
代码说明
- 参数匹配:严格遵循钩子的参数顺序,避免致命错误
- 安全输出:使用
esc_html()转义输出内容,防止XSS漏洞 - 标签处理:通过
wp_get_post_terms()获取产品标签,指定product_tag分类并提取标签名称 - 多标签兼容:如果产品关联多个标签,自动用逗号分隔显示
- 样式统一:保持和课程日期一致的字体大小,保证邮件格式美观
内容的提问来源于stack exchange,提问作者Fitzy007
相关产品推荐
相关产品推荐

