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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:21