如何为已购买指定商品的WooCommerce用户移除加购按钮,限制单用户单商品仅购一次
WooCommerce 单用户单商品仅允许购买一次实现方案
实现逻辑说明
woocommerce_is_purchasable是WooCommerce提供的原生过滤器钩子,核心逻辑是当用户访问商品页时,校验当前登录用户是否已经购买过该商品,若已购买则返回false,WooCommerce会自动隐藏/禁用加入购物车按钮,无需额外修改前端模板。
具体实现步骤
步骤1:插入校验代码
你可以将以下代码添加到当前使用的WooCommerce主题/子主题的functions.php文件末尾,也可以通过自定义代码片段插件插入,避免主题更新后代码被覆盖:
add_filter( 'woocommerce_is_purchasable', 'limit_one_purchase_per_user', 10, 2 ); function limit_one_purchase_per_user( $is_purchasable, $product ) { // 仅对登录用户做校验,未登录用户默认可购买(可根据需求调整规则) if ( ! is_user_logged_in() ) { return $is_purchasable; } $current_user_id = get_current_user_id(); $product_id = $product->get_id(); // 查询当前用户是否有包含该商品的有效订单 $customer_orders = wc_get_orders( array( 'customer_id' => $current_user_id, 'status' => array( 'completed', 'processing' ), // 可自定义需要校验的订单状态 'limit' => 1, 'return' => 'ids', ) ); foreach ( $customer_orders as $order_id ) { $order = wc_get_order( $order_id ); foreach ( $order->get_items() as $item ) { if ( $item->get_product_id() == $product_id ) { // 已购买过该商品,标记为不可购买 $is_purchasable = false; break 2; } } } return $is_purchasable; }
步骤2:添加提示文案(可选)
默认禁用按钮后不会展示限制原因,你可以添加以下代码在商品页显示自定义提示:
add_action( 'woocommerce_single_product_summary', 'show_purchase_limit_notice', 20 ); function show_purchase_limit_notice() { global $product; if ( ! is_user_logged_in() || $product->is_purchasable() ) { return; } echo '<div class="woocommerce-info">您已经购买过该商品,每个用户仅限购买一次。</div>'; }
注意事项
- 如果你需要把待付款、已付款等其他订单状态也纳入校验范围,直接修改代码中
status参数的数组值即可 - 上述代码默认按商品维度限制购买,如果你需要按变体维度限制,把
$item->get_product_id()改为$item->get_variation_id()即可 - 修改
functions.php前建议先备份文件,避免语法错误导致站点无法访问
内容的提问来源于stack exchange,提问作者matigcba
相关产品推荐
相关产品推荐

