求助:如何在WooCommerce订单及邮件通知中正确显示自定义结账字段的值
求助:如何在WooCommerce订单及邮件通知中正确显示自定义结账字段的值
看起来你已经有了一个不错的开头,能针对特定商品(ID6270)在结账页面添加配送伙伴选择字段,但代码好像没写完,而且还缺少把字段值保存到订单、显示在后台订单页和邮件里的关键步骤。我帮你把完整的功能补全,确保整个流程都能顺畅运行:
完整的实现需要覆盖这几个核心环节:
- 在结账页面针对目标商品显示自定义字段
- 验证字段的必填性,防止用户跳过选择
- 把用户选择的字段值保存到订单数据中
- 在后台订单详情页展示这个字段值
- 在订单邮件通知里包含该字段信息
下面是补全后的完整代码:
// 1. 在结账页面针对特定商品显示自定义字段 add_action( 'woocommerce_after_checkout_billing_form', 'my_custom_checkout_field', 10, 1 ); function my_custom_checkout_field( $checkout ) { $targeted_product_id = 6270; // 指定目标商品ID $has_targeted_product = false; // 检查购物车是否包含目标商品(包括商品变体) foreach( WC()->cart->get_cart() as $item ){ if ( in_array($targeted_product_id, [$item['product_id'], $item['variation_id']]) ) { $has_targeted_product = true; break; } } // 如果购物车没有目标商品,直接退出不显示字段 if ( !$has_targeted_product ) { return; } echo '<div id="my_custom_checkout_field"> <h2>' . __('Please select your Delivery Partner') . '</h2>'; woocommerce_form_field( 'delivery_partner', array( 'type' => 'select', 'required' => true, 'label' => __('Delivery Partner'), 'options' => array( '' => __('---Please select your Delivery Partner---'), 'partner_a' => __('Delivery Partner A'), 'partner_b' => __('Delivery Partner B'), 'partner_c' => __('Delivery Partner C') ), ), $checkout->get_value( 'delivery_partner' ) ); echo '</div>'; } // 2. 验证自定义字段是否填写完整 add_action( 'woocommerce_checkout_process', 'my_custom_checkout_field_validation' ); function my_custom_checkout_field_validation() { $targeted_product_id = 6270; $has_targeted_product = false; foreach( WC()->cart->get_cart() as $item ){ if ( in_array($targeted_product_id, [$item['product_id'], $item['variation_id']]) ) { $has_targeted_product = true; break; } } // 如果购物车有目标商品但用户没选配送伙伴,抛出错误提示 if ( $has_targeted_product && empty( $_POST['delivery_partner'] ) ) { wc_add_notice( __( 'Please select your Delivery Partner.' ), 'error' ); } } // 3. 把自定义字段值保存到订单元数据中 add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' ); function my_custom_checkout_field_update_order_meta( $order_id ) { if ( ! empty( $_POST['delivery_partner'] ) ) { update_post_meta( $order_id, 'delivery_partner', sanitize_text_field( $_POST['delivery_partner'] ) ); } } // 4. 在后台订单详情页显示自定义字段值 add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 ); function my_custom_checkout_field_display_admin_order_meta( $order ) { $delivery_partner = get_post_meta( $order->get_id(), 'delivery_partner', true ); if ( !empty($delivery_partner) ) { echo '<p><strong>' . __('Delivery Partner') . ':</strong> ' . esc_html( $delivery_partner ) . '</p>'; } } // 5. 在订单邮件通知中添加自定义字段信息 add_action( 'woocommerce_email_after_order_table', 'my_custom_checkout_field_display_email', 20, 4 ); function my_custom_checkout_field_display_email( $order, $sent_to_admin, $plain_text, $email ) { $delivery_partner = get_post_meta( $order->get_id(), 'delivery_partner', true ); if ( !empty($delivery_partner) ) { if ( $plain_text ) { echo "\n" . __('Delivery Partner') . ': ' . esc_html( $delivery_partner ) . "\n"; } else { echo '<p><strong>' . __('Delivery Partner') . ':</strong> ' . esc_html( $delivery_partner ) . '</p>'; } } }
我还给你调整了几个细节:
- 修正了购物车检查逻辑:原来的代码如果购物车有其他商品就直接退出,现在改成只有当购物车包含目标商品时才显示字段,逻辑更合理
- 补全了字段必填验证,避免用户跳过选择直接结账
- 优化了字段选项结构,默认选项设为空值,配合必填验证逻辑
- 增加了邮件适配,支持纯文本和HTML两种邮件格式的显示
你只需要把这段代码添加到主题的functions.php文件里,或者用自定义代码插件来添加,就能实现完整的功能了。
备注:内容来源于stack exchange,提问作者user22722114
相关产品推荐
相关产品推荐

