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

WordPress插件自定义Cron任务未执行,需修正实现定时调度

WordPress自定义Cron任务调度修复方案

针对你提供的代码,以下是需要修改的核心点及修复后的完整代码:

关键修改点

  • Cron钩子名统一:调度任务时的钩子名必须和注册的动作钩子一致,原代码中调度用send_confirmed_orders,但动作钩子是forward_orders,导致任务无法触发。
  • 注册自定义5分钟间隔:WordPress默认仅提供hourly、daily等间隔,需手动注册5min间隔才能使用;若需每小时执行,可直接替换为hourly。
  • 初始化邮件内容变量:原代码中邮件内容变量使用.=拼接但未初始化,会导致PHP警告,需先初始化为字符串。
  • 修正变量拼写错误:最后一封邮件的头变量拼写错误($pdv_headaers_p → $pdv_headers_p)。
  • 规范激活钩子路径:确保register_activation_hook指向插件主文件路径,避免钩子失效。

修复后的完整代码

class GreetingTicketScheduler {   

    public function __construct()
    {
        // 注册激活钩子,注意:若该类不在插件主文件中,需替换__FILE__为插件主文件路径
        register_activation_hook(__FILE__, [$this, 'schedule_orders_forward']);
        // 注册Cron触发的动作钩子
        add_action('forward_orders', [$this, 'send_confirmed_orders']);
        // 注册自定义5分钟间隔(如果需要每小时执行,可跳过此步骤,直接用'hourly')
        add_filter('cron_schedules', [$this, 'add_custom_cron_interval']);
    }

    // 注册自定义Cron间隔
    public function add_custom_cron_interval($schedules)
    {
        $schedules['5min'] = [
            'interval' => 300, // 5分钟=300秒
            'display'  => __('Every 5 Minutes'),
        ];
        return $schedules;
    }

    public function schedule_orders_forward()
    {
        // 仅当任务未调度时才创建
        if(!wp_next_scheduled('forward_orders')){
            // 第三个参数必须和add_action的钩子名一致,这里用'forward_orders'
            wp_schedule_event(time(), '5min', 'forward_orders');
            // 若需每小时执行,替换为:wp_schedule_event(time(), 'hourly', 'forward_orders');
        }
    }

    public function send_confirmed_orders()
    {
        global $wpdb;
        $table = $wpdb->prefix . 'order_codes';
        
        $sql = $wpdb->prepare("SELECT * FROM $table");
        $results = $wpdb->get_results($sql, ARRAY_A);
        
        if(!empty($results)){
            $pdv_subject = "Morning greetings of " . date('d-m-Y', time());
            
            // 初始化邮件内容变量,避免拼接错误
            $pdv_message_a = "Salut!\n";
            $pdv_email_a = 'mail.example@example.org';
            $pdv_headers_a[] = 'Cc: mail.example@example.org';

            $pdv_message_b = "Ciao!\n";
            $pdv_email_b = 'mail.example@example.org';
            $pdv_headers_b[] = 'Cc: mail.example@example.org';
            
            $pdv_message_p = "Hi!\n";
            $pdv_email_p = 'mail.example@example.org';
            $pdv_headers_p[] = 'Cc: mail.example@example.org';


            foreach($results as $key => $val){
                $today = date('d-m-Y');
                $confirmedDate = date('d-m-Y', $val['confirmed_at']);
                
                if($confirmedDate === $today && $val['order_cpco'] === '6605'){
                    $pdv_message_a .= $val['order_file'] . "\n";
                } 
                if($confirmedDate === $today && $val['order_cpco'] === '6200'){
                    $pdv_message_b .= $val['order_file'] . "\n";
                }
                if($confirmedDate === $today && $val['order_cpco'] === '6600'){
                    $pdv_message_p .= $val['order_file'] . "\n";
                }
            }            
            // 发送邮件,修正拼写错误的变量
            wp_mail($pdv_email_a, $pdv_subject, $pdv_message_a, $pdv_headers_a);
            wp_mail($pdv_email_b, $pdv_subject, $pdv_message_b, $pdv_headers_b);
            wp_mail($pdv_email_p, $pdv_subject, $pdv_message_p, $pdv_headers_p);
        }        
    }
}

// 实例化类
new GreetingTicketScheduler();

额外验证建议

  1. 安装WP Crontrol插件,可直观查看Cron任务是否成功注册及触发状态。
  2. 检查WordPress的Cron是否正常运行:默认Cron依赖网站访问触发,若预发布环境访问量低,可考虑配置服务器系统Cron(如Linux的crontab)来定时触发wp-cron.php。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:25:26