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

WordPress插件自定义Cron调度添加失败问题排查

WordPress自定义Cron调度无法添加的问题排查与解决

你遇到的核心问题是**cron_schedules过滤器的注册时机太晚**。cron_schedules钩子在WordPress初始化早期就会触发,远早于admin_init动作。你在表单提交时(admin_init阶段)才添加这个过滤器,此时钩子已经执行完毕,所以add_custom_schedule函数根本不会被调用。

修正方案

1. 全局注册自定义调度过滤器

将add_filter('cron_schedules', 'add_custom_schedule')移出表单处理函数,直接在插件初始化时注册,确保钩子触发时过滤器已存在。

2. 表单处理仅负责保存选项与管理Cron任务

表单提交时只处理选项存储,根据开关状态创建/删除Cron任务,不要在这个阶段注册调度。

修正后的完整代码

// 先定义常量(确保在所有函数前定义)
define('AUTO_FETCH_OPTION', 'my_plugin_auto_fetch');
define('MINUTES_AUTO_FETCH_OPTION', 'my_plugin_auto_fetch_minutes');

// 全局注册自定义Cron调度,确保钩子触发时能被调用
add_filter('cron_schedules', 'add_custom_schedule');

function add_custom_schedule($schedules) {
    error_log('add_custom_schedule called'); // 现在应该能看到这条日志了
    // 读取用户设置的间隔,动态生成调度
    $minutes = get_option(MINUTES_AUTO_FETCH_OPTION, 15);
    $interval = max($minutes * 60, 60); // 确保最小间隔为60秒
    
    $schedules['custom_auto_fetch'] = array(
        'interval' => $interval,
        'display' => sprintf(__('Every %d Minutes'), $minutes)
    );
    return $schedules;
}

// 表单提交处理函数
function handle_form_submission() {
    if (isset($_POST['save_fetch_settings'])) {
        // 保存开关选项
        $auto_fetch = isset($_POST['auto_fetch']) ? 1 : 0;
        update_option(AUTO_FETCH_OPTION, $auto_fetch);
        
        // 保存间隔选项,做最小值限制
        $minutes_auto_fetch = intval($_POST['minutes_auto_fetch']);
        $minutes_auto_fetch = $minutes_auto_fetch < 1 ? 15 : $minutes_auto_fetch;
        update_option(MINUTES_AUTO_FETCH_OPTION, $minutes_auto_fetch);
        
        // 管理Cron任务(自定义钩子名)
        $hook_name = 'my_plugin_auto_fetch_task';
        if ($auto_fetch) {
            // 任务不存在则添加
            if (!wp_next_scheduled($hook_name)) {
                wp_schedule_event(time(), 'custom_auto_fetch', $hook_name);
            }
        } else {
            // 任务存在则移除
            $timestamp = wp_next_scheduled($hook_name);
            if ($timestamp) {
                wp_unschedule_event($timestamp, $hook_name);
            }
        }
    }
}
add_action('admin_init', 'handle_form_submission');

// 别忘了定义你的Cron任务执行函数
function my_plugin_auto_fetch_task() {
    // 这里写你的自动抓取逻辑
    error_log('Auto fetch task executed');
}
add_action('my_plugin_auto_fetch_task', 'my_plugin_auto_fetch_task');

关键说明

  • 调度注册时机:cron_schedules在WordPress加载wp-includes/cron.php时就会触发,必须在这之前完成过滤器注册才能生效,全局注册是最稳妥的方式。
  • 动态间隔:直接读取用户设置的分钟数转换为秒,让调度间隔与用户配置同步。
  • Cron任务管理:每次保存设置时检查任务状态,避免重复添加或移除不存在的任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:16:29