WooCommerce指定ID商品购买验证代码失效问题求助
修复特定商品购买验证的代码问题
你的代码无法正常工作主要有三个核心问题,下面逐一说明并给出修正方案:
问题分析
- 逻辑执行顺序错误:原代码中
if条件满足后直接执行return,导致后续的错误提示代码完全无法运行,逻辑完全颠倒。 - 判断场景不匹配:
woocommerce_after_checkout_validation钩子触发于结账验证阶段,此时处于结账页面,is_product()和is_single()这类判断商品详情页的函数不会生效,应该检查购物车中是否包含目标商品。 - 多余HTML标签:错误消息中的
</div>属于多余标签,wc_add_notice会自动处理通知的HTML结构,保留该标签会导致显示异常。
修正后的代码
function validate_restricted_product( $data, $errors ) { $target_product_id = 1566; $product_in_cart = false; // 遍历购物车,检查是否包含目标商品 foreach ( WC()->cart->get_cart() as $cart_item ) { if ( $cart_item['product_id'] == $target_product_id ) { $product_in_cart = true; break; } } // 若检测到目标商品,添加错误通知阻止结账 if ( $product_in_cart ) { $p = wc_get_product( $target_product_id ); $message = sprintf( __( '%s 仅对特定客户开放购买。', 'text-domain' ), $p->get_name() ); wc_add_notice( $message, 'error' ); } } add_action( 'woocommerce_after_checkout_validation', 'validate_restricted_product', 10, 2 );
修正说明
- 适配结账场景:通过遍历购物车商品,准确检测目标商品是否在用户的待结账列表中。
- 调整逻辑顺序:仅当检测到目标商品时,才触发错误通知,阻止结账流程。
- 修复显示问题:移除多余的HTML标签,确保通知内容正常渲染。
内容的提问来源于stack exchange,提问作者user2589071
相关产品推荐
相关产品推荐

