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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:20:09