如何修改Woocommerce代码仅限制微波炉分类商品30天限购
修改代码实现特定分类(微波炉)的30天限购功能
以下是修改后的代码,仅对分类slug为microwaves的商品生效,同时保留核心限购逻辑,还增加了可配置的限购数量:
// 配置项:设置微波炉分类的限购数量(30天内) define('MICROWAVE_PURCHASE_LIMIT', 1); // 检查用户30天内购买微波炉分类商品的数量 function get_microwave_purchase_count( $user_id = 0 ){ global $wpdb; $customer_id = $user_id > 0 ? $user_id : get_current_user_id(); $category_slug = 'microwaves'; // 查询用户30天内购买的微波炉分类商品总数 $count = $wpdb->get_var( $wpdb->prepare(" SELECT SUM(oi.meta_value) FROM {$wpdb->prefix}posts as p INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id INNER JOIN {$wpdb->prefix}woocommerce_order_items as oi ON p.ID = oi.order_id INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta as oim ON oi.order_item_id = oim.order_item_id INNER JOIN {$wpdb->prefix}term_relationships as tr ON oim.meta_value = tr.object_id INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id WHERE p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') AND pm.meta_key = '_customer_user' AND pm.meta_value = %d AND oi.order_item_type = 'line_item' AND oim.meta_key = '_product_id' AND tt.taxonomy = 'product_cat' AND t.slug = %s AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - (86400 * 30)) ", $customer_id, $category_slug) ); return empty($count) ? 0 : intval($count); } // 购物车和结账页面验证 add_action( 'woocommerce_check_cart_items', 'microwave_purchase_limit_validation' ); add_action( 'woocommerce_checkout_process', 'microwave_purchase_limit_validation' ); function microwave_purchase_limit_validation() { if ( !is_user_logged_in() ) return; $current_cart_microwave_count = 0; $category_slug = 'microwaves'; // 统计当前购物车内微波炉分类商品的数量 foreach( WC()->cart->get_cart() as $cart_item ) { if( has_term( $category_slug, 'product_cat', $cart_item['product_id'] ) ) { $current_cart_microwave_count += $cart_item['quantity']; } } // 如果购物车没有微波炉商品,直接跳过验证 if ( $current_cart_microwave_count == 0 ) return; // 获取用户30天内已购买的微波炉数量 $purchased_count = get_microwave_purchase_count(); // 检查是否超过限购数量 if ( ( $purchased_count + $current_cart_microwave_count ) > MICROWAVE_PURCHASE_LIMIT ) { wc_add_notice( sprintf( __("您每30天最多只能购买 %d 台微波炉,当前已购买 %d 台,无法完成本次下单。"), MICROWAVE_PURCHASE_LIMIT, $purchased_count ), 'error' ); } }
关键修改说明
- 配置化限购数量:通过
MICROWAVE_PURCHASE_LIMIT常量可以快速调整30天内允许购买的微波炉数量 - 精准查询分类购买记录:关联WooCommerce订单商品表和产品分类表,只统计
microwaves分类的已购商品数量,同时仅纳入已完成/处理中的有效订单 - 购物车分类检查:先判断当前购物车是否包含微波炉商品,不影响其他商品的正常购买流程
- 合并统计当前购物车与历史购买量:避免用户拆分订单绕过限购,将购物车内的数量与历史已购数量相加后判断是否超限
内容的提问来源于stack exchange,提问作者jamesnelson82
相关产品推荐
相关产品推荐

