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

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原生价格逻辑,主题无需额外修改即可显示原价与折扣价;
  • 易维护:通过修改代码中的时间参数即可开启/关闭折扣,操作简单;
  • 自动生效:所有访客无需操作即可享受折扣,购物车自动使用折扣价结算。

验证方法

  1. 访问店铺首页/产品列表页,确认商品显示“原价划掉+折扣价”;
  2. 添加商品到购物车,确认购物车中显示的是折扣后的价格;
  3. 修改DISCOUNT_END_DATE为过去的日期,清除缓存后,确认价格恢复为原价。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:30:01