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
相关产品推荐
相关产品推荐

