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

如何在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调度逻辑:
    1. register_daily_order_completion_hook函数负责检查并注册每日执行的定时事件,避免重复调度
    2. 将wp_order_completed绑定到自定义的daily_order_completion_event钩子,实现每日触发
  • 补充提示:WP Cron依赖网站访问触发,如果网站长时间无访问,定时任务可能延迟执行。若需要更可靠的调度,可配置服务器级别的Cron任务,直接调用站点根目录的wp-cron.php文件

内容的提问来源于stack exchange,提问作者TI Two Dogs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:16:18