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();
额外验证建议
- 安装
WP Crontrol插件,可直观查看Cron任务是否成功注册及触发状态。 - 检查WordPress的Cron是否正常运行:默认Cron依赖网站访问触发,若预发布环境访问量低,可考虑配置服务器系统Cron(如Linux的crontab)来定时触发
wp-cron.php。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

