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

选择指定配送方式后为WooCommerce账单字段设置静态值

问题:WooCommerce选择指定配送方式时自动填充静态账单地址

已实现选择itella_pp配送方式时隐藏账单地址字段的功能,但需要自动传入静态地址值,无需用户手动填写。现有隐藏字段代码如下,自行编写了填充静态值的代码,询问写法是否可行。


已实现的隐藏账单字段代码

<?php
add_filter( 'woocommerce_checkout_fields', 'remove_billing_checkout_fields' );
function remove_billing_checkout_fields( $fields ) {
    // 指定目标配送方式
    $shipping_method ='itella_pp'; 
    // 需要隐藏的字段列表
    $hide_fields = array( 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_state', 'billing_postcode', 'billing_company' );

    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    // 取消注释下面一行可查看当前选中的配送方式
    // print_r($chosen_methods);
    $chosen_shipping = $chosen_methods[0];

    foreach($hide_fields as $field ) {
        if ($chosen_shipping == $shipping_method) {
            $fields['billing'][$field]['required'] = false;
            $fields['billing'][$field]['class'][] = 'hide';
        }
        $fields['billing'][$field]['class'][] = 'billing-dynamic';
    }

    return $fields;
}

add_action( 'wp_footer', 'cart_update_script', 999 );
function cart_update_script() {
    if (is_checkout()) :
    ?>
    <style>
        .hide {visibility: hidden!important;}
    </style>
    <script>
        jQuery( function( $ ) {

            // 确保woocommerce_params对象存在
            if ( typeof woocommerce_params === 'undefined' ) {
                return false;
            }

            $(document).on( 'change', '#shipping_method input[type="radio"]', function() {
               
                $('.billing-dynamic').toggleClass('hide', this.value == 'itella_pp');
            });
        });
    </script>
    <?php
    endif;
}
?>

自行编写的静态地址填充代码

add_filter( 'woocommerce_checkout_fields', 'send_static_values' );
function send_static_values ($fields) {
  $shipping_method ='itella_pp';
    global $woocommerce;
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0];

    if ($chosen_shipping == $shipping_method) {
       $fields['billing_address_1']['value'] = 'Something 15';
       $fields['billing_city']['value'] = 'Something12';
       $fields['billing_state']['value'] = 'Something'; 
       $fields['billing_postcode']['value'] = '124712'; 
       $fields['billing_company']['value'] = 'Something Ltd';
    }

    return $fields;
}

代码可行性分析与优化建议

1. 原写法问题

你的核心逻辑可行,但存在两个关键错误:

  • 字段路径错误:正确的字段赋值路径应为$fields['billing']['billing_address_1']['value'],原代码直接写$fields['billing_address_1']['value']会导致值无法填充到对应字段
  • 冗余操作:两个woocommerce_checkout_fields钩子重复获取配送方式,可能因执行顺序引发冲突

2. 优化后的整合代码

将隐藏字段与填充值逻辑合并,修正路径问题,同时优化前端交互(页面加载时自动检查当前配送方式):

<?php
add_filter( 'woocommerce_checkout_fields', 'custom_billing_fields_for_itella_pp' );
function custom_billing_fields_for_itella_pp( $fields ) {
    $target_shipping_method = 'itella_pp';
    // 字段名 => 对应静态值的映射
    $hide_and_fill_fields = array(
        'billing_address_1' => 'Something 15',
        'billing_address_2' => '', // 可留空或设置静态值
        'billing_city' => 'Something12',
        'billing_state' => 'Something',
        'billing_postcode' => '124712',
        'billing_company' => 'Something Ltd'
    );

    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    if ( empty( $chosen_methods ) ) return $fields;
    
    $chosen_shipping = $chosen_methods[0];

    foreach( $hide_and_fill_fields as $field_key => $static_value ) {
        if ( $chosen_shipping == $target_shipping_method ) {
            $fields['billing'][$field_key]['required'] = false;
            $fields['billing'][$field_key]['class'][] = 'hide';
            $fields['billing'][$field_key]['value'] = $static_value;
        }
        $fields['billing'][$field_key]['class'][] = 'billing-dynamic';
    }

    return $fields;
}

add_action( 'wp_footer', 'cart_update_script', 999 );
function cart_update_script() {
    if ( is_checkout() ) :
    ?>
    <style>
        .hide { visibility: hidden !important; }
    </style>
    <script>
        jQuery( function( $ ) {
            if ( typeof woocommerce_params === 'undefined' ) return;

            // 统一的字段更新函数
            function updateBillingFields() {
                const selectedMethod = $('#shipping_method input[type="radio"]:checked').val();
                $('.billing-dynamic').toggleClass('hide', selectedMethod === 'itella_pp');
            }

            // 页面加载时初始化执行一次
            updateBillingFields();

            // 切换配送方式时触发更新
            $(document).on( 'change', '#shipping_method input[type="radio"]', updateBillingFields );
        });
    </script>
    <?php
    endif;
}
?>

3. 注意事项

  • 测试时可取消注释print_r($chosen_methods)确认配送方式的准确标识
  • 切换到其他配送方式时,字段会自动恢复原有状态(包括值)
  • 确保WooCommerce会话已正常初始化,避免WC()->session->get()返回空值

内容的提问来源于stack exchange,提问作者ERM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:15:37