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

Woocommerce自定义结账复选框位置调整问题求助

如何将WooCommerce结账复选框移至所有账单字段之前

当前你通过woocommerce_checkout_fields添加的复选框会默认排在原生账单字段之后,因为这个钩子是用来整合所有账单字段数组的,原生字段优先级更高。要把复选框放在最前面,你需要换用woocommerce_before_checkout_billing_form钩子直接输出字段,同时补充字段保存逻辑,具体修改如下:

修改后的完整代码

// 输出复选框到账单表单最前面
add_action( 'woocommerce_before_checkout_billing_form', 'output_checkbox_before_billing_fields' );
function output_checkbox_before_billing_fields() {
    $checked = isset( $_POST['checkbox_trigger'] ) ? 'checked' : '';
    ?>
    <p class="form-row form-row-wide" id="checkbox_trigger_field">
        <label for="checkbox_trigger" class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox">
            <input type="checkbox" class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" name="checkbox_trigger" id="checkbox_trigger" <?php echo $checked; ?>>
            <span><?php _e('Perka įmonė?', 'woocommerce'); ?></span>
        </label>
    </p>
    <?php
}

// 保存复选框值到订单和用户元数据
add_action( 'woocommerce_checkout_update_order_meta', 'save_checkbox_trigger_value' );
function save_checkbox_trigger_value( $order_id ) {
    if ( isset( $_POST['checkbox_trigger'] ) ) {
        update_post_meta( $order_id, '_checkbox_trigger', 'yes' );
        // 同时保存到用户元数据(可选)
        $user_id = get_current_user_id();
        if ( $user_id ) {
            update_user_meta( $user_id, 'checkbox_trigger', 'yes' );
        }
    } else {
        update_post_meta( $order_id, '_checkbox_trigger', 'no' );
        $user_id = get_current_user_id();
        if ( $user_id ) {
            update_user_meta( $user_id, 'checkbox_trigger', 'no' );
        }
    }
}

// 显示隐藏字段的样式和JS逻辑(保留原有功能)
add_action( 'woocommerce_checkout_before_customer_details', 'conditionally_show_hide_checkout_field' );
function conditionally_show_hide_checkout_field() {
    ?>
    <style>
    p#billing_company_field.on,
    p#billing_company_code_field.on,
    p#billing_company_vat_code_field.on { 
        display:none !important; 
    }
    </style>

    <script type="text/javascript">
    jQuery(function($){
        var a = 'input#checkbox_trigger',
            b = '#billing_company_field, #billing_company_code_field, #billing_company_vat_code_field';

        // 页面加载时根据复选框状态初始化字段显示
        if ( !$(a).prop('checked') && !$(b).hasClass('on') ) {
            $(b).addClass('on').hide();
        }

        $(a).change(function(){
            if ( $(this).prop('checked') === true && $(b).hasClass('on') ) {
                $(b).removeClass('on').show();
            }
            else if ( $(this).prop('checked') !== true && !$(b).hasClass('on') ) {
                $(b).fadeOut(function(){
                    $(b).addClass('on');
                    $(b+' input').val('');
                });
            }
        });
    });
    </script>
    <?php
}

// 修改账单字段(保留原有公司字段设置)
add_filter( 'woocommerce_checkout_fields', 'add_custom_checkout_fields' );
function add_custom_checkout_fields( $fields ) {
    // 移除原有的checkbox_trigger字段(因为已经通过钩子直接输出)
    unset( $fields['billing']['checkbox_trigger'] );

    $fields['billing']['billing_company'] = array(
        'label'         => __('Įmonės pavadinimas', 'woocommerce'),
        'placeholder'   => _x('Įmonės pavadinimas', 'placeholder', 'woocommerce'),
        'class'         => array('form-row-wide on'),
        'clear'         => true
    );

    $fields['billing']['billing_company_code'] = array(
        'label'         => __('Įmonės kodas / Ind. veiklos nr. ', 'woocommerce'),
        'placeholder'   => _x('Įmonės kodas / Ind. veiklos nr. ', 'placeholder', 'woocommerce'),
        'class'         => array('form-row-wide on'),
        'clear'         => true
    );

    $fields['billing']['billing_company_vat_code'] = array(
        'label'         => __('Įmonės kodas / Ind. veiklos nr.', 'woocommerce'),
        'placeholder'   => _x('Įmonės kodas / Ind. veiklos nr.', 'placeholder', 'woocommerce'),
        'class'         => array('form-row-wide on'),
        'clear'         => true
    );

    return $fields;
}

关键修改说明

  • 换用钩子:用woocommerce_before_checkout_billing_form直接输出复选框,这个钩子的执行时机刚好在账单表单的开头,能确保复选框排在所有字段之前。
  • 添加保存逻辑:因为直接输出的字段不会被WooCommerce自动保存,所以需要通过woocommerce_checkout_update_order_meta钩子手动将复选框值保存到订单元数据,可选同步到用户元数据。
  • 调整初始化逻辑:在JS中添加页面加载时的初始化,确保刷新页面后字段状态和复选框保持一致。
  • 移除原字段:从woocommerce_checkout_fields中删除原来的checkbox_trigger字段,避免重复输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:40:49