WooCommerce使用100%折扣券时自定义结账字段不显示问题
解决WooCommerce 0金额订单自定义字段不显示问题
针对你遇到的「使用100%折扣券导致订单金额为£0时,Delivery Partner自定义字段无法在感谢页和邮件中显示」问题,核心原因通常是0金额订单的流程钩子触发逻辑与付费订单不同,或是代码中存在订单金额/支付状态的判断限制了字段显示。以下是分场景的解决方案:
第一步:先排查元数据是否已保存
进入后台订单编辑页,查看该0金额订单的「自定义字段」区域,确认_delivery_partner元数据是否存在:
- 如果元数据存在:问题出在感谢页/邮件的显示逻辑
- 如果元数据不存在:问题出在订单元数据的保存逻辑
场景1:元数据已保存但不显示
问题大概率是你的感谢页、邮件代码中添加了订单金额>0的判断,导致0金额订单被过滤。修改以下代码:
调整感谢页显示代码
移除金额判断,只要元数据存在就显示:
add_action( 'woocommerce_thankyou', 'display_delivery_partner_on_thankyou' ); function display_delivery_partner_on_thankyou( $order_id ) { $order = wc_get_order( $order_id ); $delivery_partner = $order->get_meta( '_delivery_partner' ); if ( ! empty( $delivery_partner ) ) { echo '<p><strong>Delivery Partner:</strong> ' . esc_html( $delivery_partner ) . '</p>'; } }
调整邮件通知显示代码
同样移除金额限制,确保字段出现在邮件中:
add_filter( 'woocommerce_email_order_meta_fields', 'add_delivery_partner_to_email', 10, 3 ); function add_delivery_partner_to_email( $fields, $sent_to_admin, $order ) { $delivery_partner = $order->get_meta( '_delivery_partner' ); if ( ! empty( $delivery_partner ) ) { $fields['delivery_partner'] = array( 'label' => __( 'Delivery Partner', 'woocommerce' ), 'value' => $delivery_partner, ); } return $fields; }
场景2:元数据未保存
0金额订单的创建流程可能跳过了woocommerce_checkout_update_order_meta钩子,改用更早触发的woocommerce_checkout_create_order钩子来保存元数据,确保所有订单场景都能生效:
修改元数据保存逻辑
add_action( 'woocommerce_checkout_create_order', 'save_delivery_partner_to_order', 10, 2 ); function save_delivery_partner_to_order( $order, $data ) { // 仅当购物车包含目标产品ID6245时保存字段 $has_target_product = false; foreach ( $order->get_items() as $item ) { if ( $item->get_product_id() == 6245 ) { $has_target_product = true; break; } } if ( $has_target_product && isset( $_POST['delivery_partner'] ) && ! empty( $_POST['delivery_partner'] ) ) { $order->update_meta_data( '_delivery_partner', sanitize_text_field( $_POST['delivery_partner'] ) ); } }
同时确保结账字段的显示和校验逻辑不依赖订单金额:
// 显示结账字段 add_action( 'woocommerce_before_order_notes', 'add_delivery_partner_checkout_field' ); function add_delivery_partner_checkout_field( $checkout ) { $has_target_product = false; foreach ( WC()->cart->get_cart() as $cart_item ) { if ( $cart_item['product_id'] == 6245 ) { $has_target_product = true; break; } } if ( $has_target_product ) { woocommerce_form_field( 'delivery_partner', array( 'type' => 'text', 'class' => array('form-row-wide'), 'label' => __('Delivery Partner', 'woocommerce'), 'required' => true, ), $checkout->get_value( 'delivery_partner' ) ); } } // 校验字段必填 add_action( 'woocommerce_checkout_process', 'validate_delivery_partner_field' ); function validate_delivery_partner_field() { $has_target_product = false; foreach ( WC()->cart->get_cart() as $cart_item ) { if ( $cart_item['product_id'] == 6245 ) { $has_target_product = true; break; } } if ( $has_target_product && empty( $_POST['delivery_partner'] ) ) { wc_add_notice( __( 'Please enter the Delivery Partner.', 'woocommerce' ), 'error' ); } }
验证测试
- 添加产品ID6245到购物车
- 应用100%折扣券使订单金额为£0
- 完成结账,检查感谢页和邮件是否显示Delivery Partner字段
- 后台查看订单元数据是否正常保存
内容的提问来源于stack exchange,提问作者user22722114
相关产品推荐
相关产品推荐

