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

如何修改WordPress Cron执行时间?PHP代码遇重复触发问题

问题原因分析

你遇到的立即触发问题,核心原因是当用户设置的时间早于当前时间时,strtotime($options['send_time'])生成的时间戳是过去的。WordPress的wp_schedule_event函数会检测到这个时间已经过期,于是立即执行一次回调,同时再安排下一天的定时任务,导致重复执行。

解决方案

WordPress确实没有直接修改Cron时间的函数,正确的做法是:清除原有定时任务后,确保新生成的执行时间是未来的时间点,再创建新的定时任务。同时优化代码逻辑,避免冗余判断。

优化后的代码

// 建议将action注册移到插件初始化阶段,避免重复注册
add_action('init', function() {
    add_action('email_cron', 'email_event');
});

function email_run_cron()
{
    // 先清除所有已存在的该钩子定时任务
    wp_clear_scheduled_hook('email_cron');

    $options = get_option('email_options');
    // 检查是否启用定时任务
    if (isset($options['enabled']) && $options['enabled']) {           
        $send_time = $options['send_time'] ?? '00:00:00'; // 默认凌晨0点
        $tm = strtotime($send_time);
        
        // 关键:如果计算出的时间在当前时间之前,就设置为明天的同一时间
        if ($tm < time()) {
            $tm += 86400; // 加上一天的秒数(24*60*60)
        }

        // 创建每日定时任务
        wp_schedule_event($tm, 'daily', 'email_cron');
    }
}

关键改动说明

  • 时间校验逻辑:新增对$tm的判断,如果是过去的时间,自动加一天,确保第一次执行是在未来的时间点,避免立即触发。
  • 移除冗余判断:wp_clear_scheduled_hook之后,wp_next_scheduled必然返回false,所以去掉if ( ! wp_next_scheduled( 'email_cron' ) )的判断,简化逻辑。
  • action注册优化:将add_action('email_cron', 'email_event')移到init钩子中,确保只注册一次,避免每次保存设置时重复注册(虽然重复注册不影响功能,但更符合规范)。
  • 默认值处理:使用??运算符给send_time设置默认值,避免未设置时使用当前时间导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:42:10