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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:24