WooCommerce全商品30天10%临时折扣实现方案咨询
解决方案:基于WooCommerce钩子实现批量临时折扣
针对20万无变体商品的30天10%折扣需求,最优方案是通过WooCommerce原生价格钩子动态计算折扣,无需修改商品数据库数据,既保证性能,又能轻松取消,且依赖原生模板显示原价与折扣价。
核心思路
利用WooCommerce的产品价格过滤钩子,在指定时间范围内动态为所有商品生成销售价(原价的90%),同时保留商品本身的原价。WooCommerce原生模板会自动显示“原价划掉+折扣价”的样式,无需额外前端修改;购物车会直接使用折扣价结算,无需用户操作。
步骤实现
1. 添加自定义代码
将以下代码添加到主题的functions.php文件,或创建一个简单的自定义插件(推荐,避免主题更新丢失):
// 定义折扣配置 define('DISCOUNT_PERCENT', 10); // 折扣比例 define('DISCOUNT_START_DATE', strtotime('today')); // 折扣开始时间(今日0点) define('DISCOUNT_END_DATE', strtotime('+30 days')); // 折扣结束时间(今日+30天) // 动态设置商品销售价 add_filter('woocommerce_product_get_sale_price', 'apply_global_dynamic_discount', 10, 2); function apply_global_dynamic_discount($sale_price, $product) { // 检查是否在折扣时间范围内 if (current_time('timestamp') >= DISCOUNT_START_DATE && current_time('timestamp') <= DISCOUNT_END_DATE) { $regular_price = (float)$product->get_regular_price(); if ($regular_price > 0) { return $regular_price * (1 - DISCOUNT_PERCENT / 100); } } return $sale_price; // 超出时间范围则返回原销售价(无则为空) } // 确保商品原价不被修改 add_filter('woocommerce_product_get_regular_price', 'preserve_original_regular_price', 10, 2); function preserve_original_regular_price($regular_price, $product) { return $product->get_meta('_regular_price', true); // 返回数据库中存储的原价 } // 强制WooCommerce识别商品处于促销状态(确保原价+折扣价显示) add_filter('woocommerce_product_is_on_sale', 'force_product_sale_status', 10, 2); function force_product_sale_status($is_on_sale, $product) { if (current_time('timestamp') >= DISCOUNT_START_DATE && current_time('timestamp') <= DISCOUNT_END_DATE) { $regular_price = (float)$product->get_regular_price(); $sale_price = (float)$product->get_sale_price(); return $regular_price > $sale_price; } return $is_on_sale; }
2. 缓存适配(关键)
由于你使用W3 Total Cache + Redis,需避免价格被静态缓存:
- 在W3 Total Cache设置中,开启动态缓存,并排除产品价格相关的动态内容;
- 或设置页面缓存的过期时间与折扣周期一致(30天),确保折扣结束后缓存自动失效;
- 若使用页面缓存,可在产品页面的缓存规则中添加时间相关的缓存键,保证不同时间显示正确价格。
3. 取消折扣
30天后无需手动修改商品数据,只需:
- 注释掉上述代码,或修改
DISCOUNT_END_DATE为当前时间之前的日期; - 清除W3 Total Cache和Redis缓存,确保前端立即更新价格。
方案优势
- 性能友好:无需批量修改20万商品的数据库记录,所有价格计算在内存中完成,无额外数据库负载;
- 原生兼容:依赖WooCommerce原生价格逻辑,主题无需额外修改即可显示原价与折扣价;
- 易维护:通过修改代码中的时间参数即可开启/关闭折扣,操作简单;
- 自动生效:所有访客无需操作即可享受折扣,购物车自动使用折扣价结算。
验证方法
- 访问店铺首页/产品列表页,确认商品显示“原价划掉+折扣价”;
- 添加商品到购物车,确认购物车中显示的是折扣后的价格;
- 修改
DISCOUNT_END_DATE为过去的日期,清除缓存后,确认价格恢复为原价。
内容的提问来源于stack exchange,提问作者sotirov
相关产品推荐
相关产品推荐

