如何通过Cron定时触发WooCommerce全商品低库存阈值通知邮件
WooCommerce 定时触发全商品低库存通知实现方案
整个实现完全复用WooCommerce原生通知逻辑,不需要自定义邮件模板,不会和现有店铺规则冲突,分三步落地:
1. 注册12小时Cron执行间隔
WooCommerce/WordPress 默认没有每日两次(12小时间隔)的定时调度规则,先把自定义间隔加进去,把以下代码放到主题functions.php或者自定义插件中:
// 注册12小时定时调度间隔 add_filter('cron_schedules', function($schedules) { $schedules['twelve_hourly'] = [ 'interval' => 12 * HOUR_IN_SECONDS, 'display' => '每12小时执行一次' ]; return $schedules; });
2. 挂载库存检测定时任务
注册定时触发点,确保任务不会重复挂载:
// 初始化时检查并挂载定时任务 add_action('init', function() { if (!wp_next_scheduled('wc_custom_low_stock_check_event')) { wp_schedule_event(time(), 'twelve_hourly', 'wc_custom_low_stock_check_event'); } }); // 主题/插件停用时清理定时任务,避免垃圾任务残留 register_deactivation_hook(__FILE__, function() { $timestamp = wp_next_scheduled('wc_custom_low_stock_check_event'); if ($timestamp) { wp_unschedule_event($timestamp, 'wc_custom_low_stock_check_event'); } });
3. 库存检测逻辑(复用原生低库存邮件流程)
不要自己写邮件发送逻辑,直接触发WooCommerce内置的低库存钩子,自动走你后台配置好的通知规则、收件人、邮件模板:
// 绑定定时任务的执行逻辑 add_action('wc_custom_low_stock_check_event', function() { // 获取所有上架、开启库存管理的商品(含变体商品) $args = [ 'limit' => -1, 'status' => 'publish', 'type' => ['simple', 'variable', 'variation'], 'manage_stock' => true, 'return' => 'objects' ]; $products = wc_get_products($args); foreach ($products as $product) { $stock_qty = (int)$product->get_stock_quantity(); $low_stock_threshold = (int)$product->get_low_stock_amount(); // 跳过未设置阈值、库存高于阈值的商品 if ($low_stock_threshold <= 0 || $stock_qty > $low_stock_threshold) { continue; } // 12小时内已经发过通知的商品跳过,避免重复发邮件 $last_notice_time = (int)get_post_meta($product->get_id(), '_wc_last_low_stock_notice', true); if (time() - $last_notice_time < 12 * HOUR_IN_SECONDS) { continue; } // 触发WooCommerce原生低库存动作,自动发送标准通知邮件 do_action('woocommerce_low_stock', $product); // 记录本次通知时间 update_post_meta($product->get_id(), '_wc_last_low_stock_notice', time()); } });
关键注意事项
- 如果你需要更稳定的定时触发,不要依赖WordPress自带的伪Cron(需要有人访问网站才会执行),可以在
wp-config.php里加define('DISABLE_WP_CRON', true);禁用伪Cron,然后在服务器Crontab里加如下命令,用系统级定时任务触发:0 */12 * * * wget -q -O - https://你的店铺域名/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - 测试时可以临时把调度间隔改成1分钟(把
12 * HOUR_IN_SECONDS改成60,Crontab对应规则也改成每分钟执行),找个测试商品把库存调到低于阈值,验证邮件能正常收到后再改回12小时间隔。 - 代码不需要做额外兼容,只要你后台已经配置好低库存通知的收件人、邮件模板,触发后会完全按照现有配置发送。
内容的提问来源于stack exchange,提问作者phpspeed
相关产品推荐
相关产品推荐

