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

WooCommerce结算页复选框验证失效:未勾选同意框仍可点击“前往结算”跳转

WooCommerce结算页复选框验证失效:未勾选同意框仍可点击“前往结算”跳转

我来帮你排查下这个问题~你的复选框验证没生效主要有两个核心原因,咱们一步步修正:

问题分析

  1. 钩子用错了:你当前用的woocommerce_proceed_to_checkout钩子只是用来在结算按钮附近输出内容的,它不会阻止表单提交流程,所以即使触发了错误提示,页面还是会跳转。
  2. 判断逻辑有误:! (int) isset( $_POST['checkout_checkboxTEST'] )这个写法不对,isset()返回的是布尔值,转成int后,存在是1、不存在是0,这个判断逻辑会搞反;而且你没在验证函数里做SKU匹配检查——不管购物车里有没有目标SKU,都会触发验证,这也不符合你的需求。

修正后的完整代码

首先保留你原来的复选框生成代码(这部分没问题),然后替换掉你的验证函数:

// 生成特定SKU对应的复选框
add_action( 'woocommerce_proceed_to_checkout', 'ICG70_Rover', 10 );
function ICG70_Rover() {
    // 检查WooCommerce是否激活
    if ( class_exists( 'WooCommerce' ) ) {
        // 需要检查的SKU
        $checkSKUs = ['3'];
        // 获取购物车中所有商品的SKU
        $skus = array();
        foreach( WC()->cart->get_cart() as $cart_item ) {
            array_push($skus, $cart_item['data']->get_sku());
        }
        // 判断购物车是否包含目标SKU
        $matchingResult = array_intersect($checkSKUs,$skus);
        if (count($matchingResult) > 0) { 
            // 生成复选框字段
            woocommerce_form_field( 'checkout_checkboxTEST', array(
                   'type'          => 'checkbox',
                   'class'         => array('form-row mycheckbox'),
                   'label_class'   => array('woocommerce-form__label woocommerce-form__label-for-checkbox checkbox'),
                   'input_class'   => array('woocommerce-form__input woocommerce-form__input-checkbox input-checkbox'),
                   'required'      => true,
                   'label'         => 'I have read and understood ICG70 Rover disclaimer',
            ));
        } 
    }   
}

// 结算验证:未勾选则阻止跳转并提示
add_action( 'woocommerce_checkout_process', 'verify_checkout_disclaimer' );
function verify_checkout_disclaimer() {
    // 先检查WooCommerce是否激活,且购物车不为空
    if ( class_exists( 'WooCommerce' ) && !WC()->cart->is_empty() ) {
        $checkSKUs = ['3'];
        $skus = array();
        foreach( WC()->cart->get_cart() as $cart_item ) {
            array_push($skus, $cart_item['data']->get_sku());
        }
        $matchingResult = array_intersect($checkSKUs,$skus);
        
        // 只有购物车包含目标SKU时,才验证复选框
        if (count($matchingResult) > 0) {
            // 判断复选框是否被勾选
            if ( !isset( $_POST['checkout_checkboxTEST'] ) || $_POST['checkout_checkboxTEST'] != '1' ) {
                wc_add_notice( __( 'Please acknowledge the disclaimer' ), 'error' );
            }
        }
    }
}

修改说明

  1. 更换验证钩子:改用woocommerce_checkout_process——这个钩子是WooCommerce专门用来处理结算前验证的,触发错误提示后会直接阻止页面跳转,完美符合你的需求。
  2. 修正判断逻辑:用!isset( $_POST['checkout_checkboxTEST'] ) || $_POST['checkout_checkboxTEST'] != '1'来准确判断复选框是否未被勾选(WooCommerce的复选框选中时会提交值为'1')。
  3. 添加SKU检查:在验证函数里重复了SKU匹配逻辑,确保只有当购物车里存在目标SKU时,才会执行复选框验证,避免不必要的干扰。

这样修改后,用户未勾选复选框点击“前往结算”时,会显示错误提示,并且不会跳转到下一页,只有勾选后才能正常结算~

备注:内容来源于stack exchange,提问作者JohnLyons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:03:02