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

WooCommerce订单确认页及邮件无法显示Property卖家信息求助

问题排查与修正方案

问题描述

我通过WordPress的ACF插件创建了post type key为property的自定义文章类型properties,包含卖家名字、姓氏等自定义字段。前端使用WooCommerce单产品块展示ID为502的“Seller Information”产品,希望用户点击加购时,获取当前浏览的property的卖家信息,并在付款后显示于订单确认页及邮件中。编写了相关PHP钩子代码,但卖家信息未在订单及邮件中显示,请求排查问题。

原代码

add_filter('woocommerce_add_cart_item_data', 'add_property_seller_info_to_cart', 10, 2);
function add_property_seller_info_to_cart($cart_item_data, $product_id) {
    // Check if the product being added is the 'Seller Information' product with ID 502
    if ($product_id == 502) {
        // Get the current property post being viewed
        if (is_singular('property')) {
            global $post;
            if ($post) {
                $property_id = $post->ID;

                // Get the custom field values for the property seller
                $seller_name = get_field('property_seller_name', $property_id);
                $seller_surname = get_field('property_seller_surname', $property_id);
                $seller_email = get_field('property_seller_email', $property_id);
                $seller_phone = get_field('property_seller_phone', $property_id);
                $seller_alternative_phone = get_field('property_seller_alternative_phone', $property_id);

                // Add the seller information to the cart item data
                $cart_item_data['property_seller_info'] = array(
                    'name' => $seller_name,
                    'surname' => $seller_surname,
                    'email' => $seller_email,
                    'phone' => $seller_phone,
                    'alternative_phone' => $seller_alternative_phone,
                );
            }
        }
    }
    return $cart_item_data;
}

add_action('woocommerce_checkout_create_order_line_item', 'add_property_seller_info_to_order', 10, 4);
function add_property_seller_info_to_order($item, $cart_item_key, $values, $order) {
    if (isset($values['property_seller_info'])) {
        $seller_info = $values['property_seller_info'];
        
        // Add seller information as meta data to the order item
        $item->add_meta_data('Seller First Name', $seller_info['name']);
        $item->add_meta_data('Seller Surname', $seller_info['surname']);
        $item->add_meta_data('Seller Email', $seller_info['email']);
        $item->add_meta_data('Seller Phone', $seller_info['phone']);
        $item->add_meta_data('Seller Alternative Phone', $seller_info['alternative_phone']);
    }
}

add_action('woocommerce_email_order_details', 'add_seller_info_to_order_email', 10, 4);
function add_seller_info_to_order_email($order, $sent_to_admin, $plain_text, $email) {
    foreach ($order->get_items() as $item_id => $item) {
        $seller_name = $item->get_meta('Seller First Name');
        $seller_surname = $item->get_meta('Seller Surname');
        $seller_email = $item->get_meta('Seller Email');
        $seller_phone = $item->get_meta('Seller Phone');
        $seller_alternative_phone = $item->get_meta('Seller Alternative Phone');

        if ($seller_name && $seller_surname) {
            echo '<h3>Seller Information</h3>';
            echo '<p>Name: ' . esc_html($seller_name) . ' ' . esc_html($seller_surname) . '</p>';
            echo '<p>Email: ' . esc_html($seller_email) . '</p>';
            echo '<p>Phone: ' . esc_html($seller_phone) . '</p>';
            echo '<p>Alternative Phone: ' . esc_html($seller_alternative_phone) . '</p>';
        }
    }
}

排查出的问题点

  • 购物车项数据丢失:WooCommerce会合并相同产品的购物车项,未添加唯一标识的自定义数据会被覆盖,导致后续无法读取。
  • 元数据可见性问题:默认添加的订单元数据可能被WooCommerce隐藏,无法在前端订单页和邮件中显示。
  • 当前页面Post获取不可靠:使用global $post在AJAX加购场景下可能无法正确获取当前property的ID。
  • 订单确认页无显示逻辑:原代码仅处理了邮件显示,未覆盖订单确认页的展示需求。
  • ACF字段键校验缺失:未确认代码中的ACF字段键与实际创建的字段键是否完全匹配。

修正后的完整代码

add_filter('woocommerce_add_cart_item_data', 'add_property_seller_info_to_cart', 10, 2);
function add_property_seller_info_to_cart($cart_item_data, $product_id) {
    if ($product_id == 502 && is_singular('property')) {
        // 改用get_queried_object()更可靠获取当前页面的property对象
        $property_post = get_queried_object();
        if ($property_post && $property_post->post_type === 'property') {
            $property_id = $property_post->ID;

            // 确保ACF字段键与实际创建的一致
            $seller_name = get_field('property_seller_name', $property_id);
            $seller_surname = get_field('property_seller_surname', $property_id);
            $seller_email = get_field('property_seller_email', $property_id);
            $seller_phone = get_field('property_seller_phone', $property_id);
            $seller_alternative_phone = get_field('property_seller_alternative_phone', $property_id);

            if (!empty($seller_name) || !empty($seller_surname)) {
                $cart_item_data['property_seller_info'] = array(
                    'name' => $seller_name,
                    'surname' => $seller_surname,
                    'email' => $seller_email,
                    'phone' => $seller_phone,
                    'alternative_phone' => $seller_alternative_phone,
                );
                // 添加唯一标识,避免购物车项合并导致数据丢失
                $cart_item_data['unique_key'] = md5(microtime() . rand());
            }
        }
    }
    return $cart_item_data;
}

add_action('woocommerce_checkout_create_order_line_item', 'add_property_seller_info_to_order', 10, 4);
function add_property_seller_info_to_order($item, $cart_item_key, $values, $order) {
    if (isset($values['property_seller_info'])) {
        $seller_info = $values['property_seller_info'];
        
        // 第三个参数设为true,确保元数据在前端可见
        $item->add_meta_data('Seller First Name', $seller_info['name'], true);
        $item->add_meta_data('Seller Surname', $seller_info['surname'], true);
        $item->add_meta_data('Seller Email', $seller_info['email'], true);
        $item->add_meta_data('Seller Phone', $seller_info['phone'], true);
        $item->add_meta_data('Seller Alternative Phone', $seller_info['alternative_phone'], true);
    }
}

// 处理订单确认页显示卖家信息
add_action('woocommerce_order_item_meta_end', 'display_seller_info_on_order_page', 10, 4);
function display_seller_info_on_order_page($item_id, $item, $order, $plain_text) {
    $seller_name = $item->get_meta('Seller First Name');
    $seller_surname = $item->get_meta('Seller Surname');
    if ($seller_name && $seller_surname) {
        echo '<div class="seller-info">';
        echo '<h4>Seller Information</h4>';
        echo '<p><strong>Name:</strong> ' . esc_html($seller_name) . ' ' . esc_html($seller_surname) . '</p>';
        if ($seller_email = $item->get_meta('Seller Email')) {
            echo '<p><strong>Email:</strong> ' . esc_html($seller_email) . '</p>';
        }
        if ($seller_phone = $item->get_meta('Seller Phone')) {
            echo '<p><strong>Phone:</strong> ' . esc_html($seller_phone) . '</p>';
        }
        if ($alt_phone = $item->get_meta('Seller Alternative Phone')) {
            echo '<p><strong>Alternative Phone:</strong> ' . esc_html($alt_phone) . '</p>';
        }
        echo '</div>';
    }
}

add_action('woocommerce_email_order_details', 'add_seller_info_to_order_email', 10, 4);
function add_seller_info_to_order_email($order, $sent_to_admin, $plain_text, $email) {
    foreach ($order->get_items() as $item_id => $item) {
        $seller_name = $item->get_meta('Seller First Name');
        $seller_surname = $item->get_meta('Seller Surname');

        if ($seller_name && $seller_surname) {
            if (!$plain_text) {
                echo '<h3>Seller Information</h3>';
                echo '<p>Name: ' . esc_html($seller_name) . ' ' . esc_html($seller_surname) . '</p>';
                if ($seller_email = $item->get_meta('Seller Email')) {
                    echo '<p>Email: ' . esc_html($seller_email) . '</p>';
                }
                if ($seller_phone = $item->get_meta('Seller Phone')) {
                    echo '<p>Phone: ' . esc_html($seller_phone) . '</p>';
                }
                if ($alt_phone = $item->get_meta('Seller Alternative Phone')) {
                    echo '<p>Alternative Phone: ' . esc_html($alt_phone) . '</p>';
                }
            } else {
                // 纯文本邮件格式
                echo "Seller Information\n";
                echo "Name: " . esc_html($seller_name) . " " . esc_html($seller_surname) . "\n";
                if ($seller_email = $item->get_meta('Seller Email')) {
                    echo "Email: " . esc_html($seller_email) . "\n";
                }
                if ($seller_phone = $item->get_meta('Seller Phone')) {
                    echo "Phone: " . esc_html($seller_phone) . "\n";
                }
                if ($alt_phone = $item->get_meta('Seller Alternative Phone')) {
                    echo "Alternative Phone: " . esc_html($alt_phone) . "\n";
                }
                echo "\n";
            }
        }
    }
}

额外注意事项

  • 确认ACF字段的字段键(不是字段标签)与代码中的property_seller_name等完全一致,可在ACF字段编辑页面查看。
  • 测试时清空购物车,避免旧数据干扰。
  • 若使用AJAX加购,确保get_queried_object()能正确获取当前property页面,必要时可通过URL参数传递property ID并在代码中获取。

内容的提问来源于stack exchange,提问作者Innocent Monareng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:40:54