WooCommerce中为订单完成邮件及后台订单页添加套件元数据
优化原函数(适配多场景)
先把你原来直接输出内容的函数改成返回字符串的形式,这样能灵活适配邮件、后台等不同场景:
// 获取套件元数据的HTML内容,返回字符串而非直接输出 function bis_get_kit_meta_contents($product_id) { $post_meta = get_post_meta($product_id, '', true); $output = ''; if (isset($post_meta['bis_kit_id']) && $post_meta['bis_kit_id'][0] > 1) { $output .= '<p>This is a Kit containing the following items:</p>'; $output .= '<p>' . esc_html($post_meta['bis_kit_type'][0]) . '</p>'; $output .= '<ul>'; foreach($post_meta as $kititem) { foreach ($kititem as $value) { $newvalue = unserialize($value); if ($newvalue) { $newvalue2 = unserialize($newvalue); if($newvalue2['type'] === "kititem") { $quantity = esc_html($newvalue2['quantity']); $name = esc_html($newvalue2['name']); $output .= "<li>{$quantity} -> {$name}</li>"; } } } } $output .= '</ul>'; } return $output; }
1. 订单完成邮件显示套件内容
不用直接修改customer-completed-email.php模板,通过WooCommerce自带的邮件钩子实现:
add_action('woocommerce_email_order_item_meta', 'bis_display_kit_in_email', 10, 4); function bis_display_kit_in_email($item_id, $item, $order, $plain_text) { // 只处理订单中的产品项 if (!is_a($item, 'WC_Order_Item_Product')) return; $product = $item->get_product(); if (!$product) return; $kit_content = bis_get_kit_meta_contents($product->get_id()); if (!empty($kit_content)) { // 区分HTML邮件和纯文本邮件格式 if ($plain_text) { $kit_content = wp_strip_all_tags($kit_content); $kit_content = str_replace(array('<ul>', '</ul>', '<li>', '</li>'), array("\n", "\n", '- ', "\n"), $kit_content); echo "\n" . $kit_content . "\n"; } else { echo $kit_content; } } }
2. 后台订单编辑页显示套件内容
用你找到的woocommerce_before_order_itemmeta钩子,结合优化后的函数即可,无需修改后台模板文件:
add_action('woocommerce_before_order_itemmeta', 'bis_display_kit_in_admin_order', 10, 3); function bis_display_kit_in_admin_order($item_id, $item, $product) { // 只处理订单中的产品项 if (!is_a($item, 'WC_Order_Item_Product')) return; if (!$product) return; $kit_content = bis_get_kit_meta_contents($product->get_id()); if (!empty($kit_content)) { // 给后台添加样式,区分套件内容 echo '<div style="margin: 10px 0; padding: 10px; background: #f5f5f5; border-radius: 4px;">'; echo $kit_content; echo '</div>'; } }
注意事项
- 所有代码直接添加到子主题的
functions.php文件即可,无需修改任何模板文件,避免主题更新丢失修改。 - 代码中加入了
esc_html()处理内容,防止XSS安全问题,建议保留。
内容的提问来源于stack exchange,提问作者Doveman
相关产品推荐
相关产品推荐

