如何在functions.php中设置函数每日仅运行一次?
在WordPress中每日调度订单状态更新函数的实现方法
需求说明
需要自动将付款超过7天的wc-processing状态订单更新为completed,且该函数每日仅执行一次,避免绑定init钩子随页面加载重复运行拖慢网站。
修改后的完整代码
// 定义订单状态更新函数 function wp_order_completed() { global $wpdb; // 用动态表前缀替代硬编码,兼容不同站点配置 $order_stats_table = $wpdb->prefix . 'wc_order_stats'; // SQL直接筛选付款超过7天的processing状态订单,减少循环计算量 $my_query = $wpdb->prepare( "SELECT order_id, date_paid FROM {$order_stats_table} WHERE status = %s AND date_paid <= DATE_SUB(NOW(), INTERVAL 7 DAY)", 'wc-processing' ); $result2 = $wpdb->get_results($my_query); foreach ($result2 as $results2) { $order_id = $results2->order_id; $order = wc_get_order($order_id); // 用WC官方函数替代new WC_Order,更规范 if ($order) { $order->update_status('completed', '付款超过7天,自动完成订单'); // 添加状态更新备注 } } } // 注册自定义定时钩子 function register_daily_order_completion_hook() { if (!wp_next_scheduled('daily_order_completion_event')) { // 设置每日执行一次,首次执行时间为当前时间后1分钟(可调整) wp_schedule_event(time() + 60, 'daily', 'daily_order_completion_event'); } } add_action('wp', 'register_daily_order_completion_hook'); // 将更新函数绑定到自定义定时钩子 add_action('daily_order_completion_event', 'wp_order_completed');
关键说明
- 动态表前缀:用
$wpdb->prefix获取WordPress表前缀,避免硬编码导致站点换前缀后功能失效 - SQL优化:直接在查询中筛选付款超过7天的订单,减少PHP循环的计算量,提升执行效率
- WC规范调用:用
wc_get_order()替代new WC_Order(),符合WooCommerce官方开发规范 - WP Cron调度逻辑:
register_daily_order_completion_hook函数负责检查并注册每日执行的定时事件,避免重复调度- 将
wp_order_completed绑定到自定义的daily_order_completion_event钩子,实现每日触发
- 补充提示:WP Cron依赖网站访问触发,如果网站长时间无访问,定时任务可能延迟执行。若需要更可靠的调度,可配置服务器级别的Cron任务,直接调用站点根目录的
wp-cron.php文件
内容的提问来源于stack exchange,提问作者TI Two Dogs
相关产品推荐
相关产品推荐

