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

WooCommerce结账页面:勾选自定义复选框时为账单姓名字段设置默认值

解决WooCommerce勾选自定义复选框后动态填充账单姓名默认值的问题

你的问题核心在于当前用的woocommerce_checkout_fields过滤器是服务器端全局生效的,所以不管复选框状态如何,默认值都会一直显示。要实现「仅勾选复选框时才填充默认值」的效果,我们需要结合前端交互+后端兜底处理来完成,具体步骤如下:

第一步:先移除全局默认值设置

首先把你之前写的zk_set_checkout_field_input_value_default函数删掉,它会强制给姓名字段设置默认值,和我们要的动态效果冲突。

第二步:添加前端JS实现实时控制

通过JavaScript监听复选框的勾选状态,动态填充或恢复姓名字段的值,同时还可以给字段加只读属性防止匿名状态下被修改:

add_action( 'woocommerce_after_checkout_form', 'zk_anonymouse_checkout_js' );
function zk_anonymouse_checkout_js() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($) {
            // 获取目标元素
            const anonCheckbox = $('#billing_anonymouse');
            const firstNameInput = $('#billing_first_name');
            const lastNameInput = $('#billing_last_name');

            // 保存用户原本输入的内容,取消勾选时恢复
            let savedFirstName = firstNameInput.val();
            let savedLastName = lastNameInput.val();

            // 监听复选框状态变化
            anonCheckbox.on('change', function() {
                if ($(this).is(':checked')) {
                    // 勾选时:保存当前值,设置默认名,锁定输入框
                    savedFirstName = firstNameInput.val();
                    savedLastName = lastNameInput.val();
                    firstNameInput.val('First');
                    lastNameInput.val('Last');
                    firstNameInput.prop('readonly', true);
                    lastNameInput.prop('readonly', true);
                } else {
                    // 取消勾选时:恢复用户原本输入的内容,解锁输入框
                    firstNameInput.val(savedFirstName);
                    lastNameInput.val(savedLastName);
                    firstNameInput.prop('readonly', false);
                    lastNameInput.prop('readonly', false);
                }
            });
        });
    </script>
    <?php
}

第三步:后端兜底处理(可选但推荐)

为了兼容用户禁用JavaScript的场景,我们在订单提交时做一次后端校验,如果复选框被勾选,就强制设置姓名字段的值:

// 结账提交时校验并设置值
add_action( 'woocommerce_checkout_process', 'zk_anonymouse_checkout_process' );
function zk_anonymouse_checkout_process() {
    if ( isset($_POST['billing_anonymouse']) && $_POST['billing_anonymouse'] === '1' ) {
        $_POST['billing_first_name'] = 'First';
        $_POST['billing_last_name'] = 'Last';
    }
}

// 同步更新订单元数据
add_action( 'woocommerce_checkout_update_order_meta', 'zk_anonymouse_update_order_meta' );
function zk_anonymouse_update_order_meta( $order_id ) {
    if ( isset($_POST['billing_anonymouse']) && $_POST['billing_anonymouse'] === '1' ) {
        $order = wc_get_order( $order_id );
        $order->update_meta_data('_billing_first_name', 'First');
        $order->update_meta_data('_billing_last_name', 'Last');
        $order->save();
    }
}

额外说明

  • 如果不需要锁定姓名输入框,直接删掉代码里的prop('readonly', ...)相关内容即可
  • 确保你的自定义复选框billing_anonymouse已经正确添加到结账页面(如果还没添加,可以用woocommerce_before_checkout_billing_form钩子来创建)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:22:31