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

WooCommerce单用户商品限购设置(年/30天)及代码修复求助

WooCommerce购买限制问题解决方案

问题1:单用户对特定商品的一年内购买限制设置

要实现单用户对特定商品的一年内购买限制,可通过自定义代码结合WooCommerce订单查询功能实现,具体方案如下:

  1. 先为需要限制的商品添加自定义字段(比如annual_purchase_limit,值设为Yes/No),也可直接在代码中指定目标商品ID;
  2. 通过woocommerce_is_purchasable钩子拦截购买权限判断;
  3. 查询用户过去365天内已完成的该商品订单,若存在则禁用加购按钮并显示提示。

示例代码:

/**
 * 限制单用户一年内购买特定商品
 */
add_filter('woocommerce_is_purchasable', 'restrict_annual_product_purchase', 10, 2);
function restrict_annual_product_purchase($is_purchasable, $product) {
    // 仅登录用户生效
    if (!is_user_logged_in()) return $is_purchasable;

    $user_id = get_current_user_id();
    $product_id = $product->get_id();

    // 检查商品是否启用年度购买限制
    $has_annual_limit = get_post_meta($product_id, 'annual_purchase_limit', true);
    if ($has_annual_limit !== 'Yes') return $is_purchasable;

    // 查询过去365天内用户已完成的该商品订单
    $args = array(
        'customer_id' => $user_id,
        'status' => array('wc-completed'),
        'date_created' => '>=' . (time() - 365 * 24 * 60 * 60),
        'return' => 'ids',
        'line_items' => array(
            array(
                'product_id' => $product_id
            )
        )
    );
    $order_ids = wc_get_orders($args);

    if (!empty($order_ids)) {
        $is_purchasable = false;
        // 添加提示信息
        add_action('woocommerce_single_product_summary', 'display_annual_limit_message', 35);
    }

    return $is_purchasable;
}

function display_annual_limit_message() {
    echo '<p class="purchase-limit-message">' . __('您在一年内已购买过此商品,无法重复购买。', 'woocommerce') . '</p>';
}

问题2:自定义字段控制30天内重复购买限制的代码修复

你的原代码存在以下核心问题:

  • 未检查自定义字段purchase limit的值,所有商品都会触发限制逻辑;
  • 未筛选购买时间范围,只要用户买过该商品就会被限制;
  • 在函数内部嵌套定义提示信息函数,会触发重复定义错误;
  • 订单查询参数不够精准,用meta_key匹配商品ID的方式可靠性不足。

修正后的代码:

/**
 * 针对purchase limit为Yes的商品,限制30天内重复购买
 */
add_filter('woocommerce_is_purchasable', 'restrict_30day_repeat_purchase', 10, 2);
function restrict_30day_repeat_purchase($is_purchasable, $product) {
    // 仅登录用户生效
    if (!is_user_logged_in()) return $is_purchasable;

    $user_id = get_current_user_id();
    $product_id = $product->get_id();

    // 检查商品是否启用30天购买限制
    $has_30day_limit = get_post_meta($product_id, 'purchase limit', true);
    if ($has_30day_limit !== 'Yes') return $is_purchasable;

    // 查询过去30天内用户已完成的该商品订单
    $thirty_days_ago = strtotime('-30 days');
    $args = array(
        'customer_id' => $user_id,
        'status' => array('wc-completed'),
        'date_created' => '>=' . $thirty_days_ago,
        'return' => 'ids',
        'line_items' => array(
            array(
                'product_id' => $product_id
            )
        )
    );
    $order_ids = wc_get_orders($args);

    if (!empty($order_ids)) {
        $is_purchasable = false;
        // 添加提示信息钩子
        add_action('woocommerce_single_product_summary', 'display_30day_limit_message', 35);
    }

    return $is_purchasable;
}

// 单独定义提示信息函数,避免重复定义问题
function display_30day_limit_message() {
    echo '<p class="purchased-message">' . __('您已购买过此商品', 'woocommerce') . '</p>';
}

代码说明

  1. 优先判断用户登录状态,未登录用户不触发限制;
  2. 读取商品自定义字段值,仅对标记为Yes的商品执行限制;
  3. 通过date_created筛选过去30天内的订单,精准限制近期重复购买;
  4. 将提示信息函数单独定义,避免嵌套函数导致的重复定义错误;
  5. 使用line_items参数精准查询包含目标商品的订单,比原代码的meta_key方式更可靠。

内容的提问来源于stack exchange,提问作者sandhya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:07:50