如何让Woocommerce自定义结账字段仅对产品ID6245生效
实现自定义结账字段仅对指定产品生效的方案
核心逻辑是先检查购物车/订单中是否包含产品ID为6245的商品,仅在满足条件时执行字段的显示、保存与展示操作。以下是修改后的完整代码:
1. 自定义结账字段(仅在包含指定产品时显示)
// Display a custom checkout select field after billing information (only for product ID 6245) add_action( 'woocommerce_after_checkout_billing_form', 'my_custom_checkout_field', 10, 1 ); function my_custom_checkout_field( $checkout ) { // Check if cart contains product ID 6245 $has_target_product = false; foreach ( WC()->cart->get_cart() as $cart_item ) { if ( $cart_item['product_id'] == 6245 ) { $has_target_product = true; break; } } // Only display the field if target product exists in cart if ( $has_target_product ) { echo '<div id="my_custom_checkout_field"> <h2>' . __('Please select your Delivery Partner') . '</h2>'; woocommerce_form_field( 'delivery_partner', array( 'type' => 'select', 'options' => array( 't1' => __('t1', 'woocommerce' ), 't2' => __('t2', 'woocommerce' ), 't3' => __('t3', 'woocommerce' ), 't4' => __('t4', 'woocommerce'), 't5' => __('t5', 'woocommerce' ) ), 'class' => array('my-field-class form-row-wide'), 'label' => __('Delivery Partner'), ), $checkout->get_value( 'delivery_partner' )); echo '</div>'; } }
2. 保存字段值到订单(仅当订单包含指定产品时)
// Save the dropdown custom field selected value as order custom meta data (only for product ID 6245) add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 10, 2 ); function my_custom_checkout_field_update_order_meta( $order, $data ) { // Check if order contains product ID 6245 $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'] ) ); } }
3. 后台订单页面显示字段(仅当订单包含指定产品时)
// Display the custom field value on admin order pages after billing address (only for product ID 6245) 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 ) { // Check if order contains product ID 6245 $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 && $order->get_meta('Delivery Partner') ) { echo '<p><strong>'.__('Delivery Partner').':</strong> ' . $order->get_meta('Delivery Partner') . '</p>'; } }
4. 新订单邮件通知显示字段(仅当订单包含指定产品时)
// Display the custom field value on "New Order" notification (only for product ID 6245) add_action( 'woocommerce_email_after_order_table', 'custom_woocommerce_email_order_meta_fields', 10, 4 ); function custom_woocommerce_email_order_meta_fields( $order, $sent_to_admin, $plain_text, $email ) { if( 'new_order' !== $email->id ) return; // Check if order contains product ID 6245 $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 && $order->get_meta('Delivery Partner') ) { echo '<p><strong>'.__('Delivery Partner').':</strong> ' . $order->get_meta('Delivery Partner') . '</p>'; } }
关键说明
- 购物车检查:在结账页面显示字段前,遍历购物车商品判断是否包含ID为6245的产品
- 订单检查:在保存字段、后台显示、邮件通知环节,遍历订单商品做同样判断,避免无效操作或空值展示
- 如果需要支持变体产品,可将
$cart_item['product_id']替换为$cart_item['variation_id'](仅针对变体)或同时判断两者
内容的提问来源于stack exchange,提问作者user22722114
相关产品推荐
相关产品推荐

