WooCommerce加购验证中wc_add_notice随机失效问题求助
问题分析
你的问题核心在于错误使用了适配成功消息的过滤器干扰通知逻辑,加上首次触发后会话中残留的通知状态导致后续无法正常渲染,同时积分足够时的流程未正确阻止默认添加购物车行为,进一步打乱了通知机制。
修复后的代码
function enforce_points_based_registration( $valid, $product_id ) { // 仅处理目标产品 if ( $product_id !== 4465 ) { return $valid; } // 清空旧通知,避免状态残留 wc_clear_notices(); $points_required = get_post_meta( $product_id, 'points_required', true); $user_id = get_current_user_id(); $user_points = WC_Points_Rewards_Manager::get_users_points( $user_id ); $current_user = wp_get_current_user(); $user_email = $current_user->user_email; // 检查是否已购买该产品 if ( wc_customer_bought_product( $user_email, $user_id, $product_id ) ) { wc_add_notice( "你已购买过商家套餐", "error" ); return false; } // 检查是否已是商家 if ( dokan_is_user_vendor( $user_id ) ) { wc_add_notice( "你已是商家身份", "error" ); return false; } // 检查积分是否足够 if ( $user_points < $points_required ) { wc_add_notice( "你的积分不足,无法购买该订阅", "error" ); return false; } // 积分足够时自动创建订单 $product = wc_get_product( $product_id ); $order = wc_create_order(); if ( ! $order ) { wc_add_notice( "订单创建失败,请重试", "error" ); return false; } $order->add_product( $product, 1 ); $order->set_customer_id( $user_id ); $order->calculate_totals(); $order->update_status( 'completed' ); // 扣除积分 WC_Points_Rewards_Manager::decrease_points( $user_id, $points_required, 'vendor_registration', $order->get_id() ); // 添加订单备注 $order->add_order_note( "该订单已通过积分自动完成支付" ); // 添加成功通知 wc_add_notice( "商家套餐已成功购买,订单已完成", "success" ); // 阻止默认添加购物车流程(已创建订单无需重复添加) return false; } add_filter( 'woocommerce_add_to_cart_validation', 'enforce_points_based_registration', 5, 2 );
关键修复说明
- 移除错误过滤器:直接调用
wc_add_notice,不再用wc_add_to_cart_message包装内容(该过滤器仅适配添加购物车成功消息,会干扰错误通知逻辑)。 - 清空旧通知:函数开头添加
wc_clear_notices(),确保每次验证都从干净状态开始,解决首次显示后后续通知失效的问题。 - 调整钩子优先级:将优先级从10改为5,让验证逻辑在WooCommerce默认验证之前执行,避免被后续流程覆盖。
- 修正返回逻辑:积分足够创建订单后返回
false,阻止默认添加购物车流程,避免流程冲突导致通知丢失。 - 修复邮箱字段:将
$current_user->email改为$current_user->user_email,符合WordPress用户对象的字段规范。
内容的提问来源于stack exchange,提问作者Firas Blouza
相关产品推荐
相关产品推荐

