WooCommerce单用户商品限购设置(年/30天)及代码修复求助
WooCommerce购买限制问题解决方案
问题1:单用户对特定商品的一年内购买限制设置
要实现单用户对特定商品的一年内购买限制,可通过自定义代码结合WooCommerce订单查询功能实现,具体方案如下:
- 先为需要限制的商品添加自定义字段(比如
annual_purchase_limit,值设为Yes/No),也可直接在代码中指定目标商品ID; - 通过
woocommerce_is_purchasable钩子拦截购买权限判断; - 查询用户过去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>'; }
代码说明
- 优先判断用户登录状态,未登录用户不触发限制;
- 读取商品自定义字段值,仅对标记为Yes的商品执行限制;
- 通过
date_created筛选过去30天内的订单,精准限制近期重复购买; - 将提示信息函数单独定义,避免嵌套函数导致的重复定义错误;
- 使用
line_items参数精准查询包含目标商品的订单,比原代码的meta_key方式更可靠。
内容的提问来源于stack exchange,提问作者sandhya
相关产品推荐
相关产品推荐

