WooCommerce结算页复选框验证失效:未勾选同意框仍可点击“前往结算”跳转
WooCommerce结算页复选框验证失效:未勾选同意框仍可点击“前往结算”跳转
我来帮你排查下这个问题~你的复选框验证没生效主要有两个核心原因,咱们一步步修正:
问题分析
- 钩子用错了:你当前用的
woocommerce_proceed_to_checkout钩子只是用来在结算按钮附近输出内容的,它不会阻止表单提交流程,所以即使触发了错误提示,页面还是会跳转。 - 判断逻辑有误:
! (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' ); } } } }
修改说明
- 更换验证钩子:改用
woocommerce_checkout_process——这个钩子是WooCommerce专门用来处理结算前验证的,触发错误提示后会直接阻止页面跳转,完美符合你的需求。 - 修正判断逻辑:用
!isset( $_POST['checkout_checkboxTEST'] ) || $_POST['checkout_checkboxTEST'] != '1'来准确判断复选框是否未被勾选(WooCommerce的复选框选中时会提交值为'1')。 - 添加SKU检查:在验证函数里重复了SKU匹配逻辑,确保只有当购物车里存在目标SKU时,才会执行复选框验证,避免不必要的干扰。
这样修改后,用户未勾选复选框点击“前往结算”时,会显示错误提示,并且不会跳转到下一页,只有勾选后才能正常结算~
备注:内容来源于stack exchange,提问作者JohnLyons
相关产品推荐
相关产品推荐

