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

WordPress插件:定时任务获取外部JSON并更新全局变量问题

嘿,我完全懂你遇到的这个坑——WordPress的cron任务是在独立的请求上下文里运行的,和用户访问页面的请求完全是两个独立的PHP进程,所以你在cron函数里更新的全局变量,到了其他请求里根本拿不到,因为全局变量只在当前请求的生命周期内有效,跨请求就没了。

解决这个问题的核心思路是:不要用全局变量存数据,改用WordPress内置的选项存储(把数据存在数据库里),这样所有请求都能共享最新的JSON内容。下面是具体的实现方案:

1. 替换全局变量为WordPress选项存储

WordPress的get_option()和update_option()函数可以帮你把数据持久化到数据库,这是跨请求共享数据的标准做法,比全局变量靠谱得多。

2. 调整你的cron任务逻辑

把原来更新全局变量的代码改成更新选项,同时修正cron的触发间隔(你要的是每60分钟,不是60秒):

// 注册每小时执行一次的cron事件
function my_plugin_setup_cron() {
    // 检查事件是否已注册,避免重复添加
    if ( ! wp_next_scheduled( 'my_plugin_check_json_update' ) ) {
        wp_schedule_event( time(), 'hourly', 'my_plugin_check_json_update' );
    }
}
add_action( 'wp_loaded', 'my_plugin_setup_cron' );

// 实际执行JSON检查的函数
function my_plugin_check_external_json() {
    $external_json_url = 'https://your-target-url.com/data.json'; // 替换成你的JSON地址
    $response = wp_remote_get( $external_json_url );

    // 处理请求错误
    if ( is_wp_error( $response ) ) {
        error_log( 'JSON请求失败:' . $response->get_error_message() );
        return;
    }

    // 解析JSON内容
    $response_body = wp_remote_retrieve_body( $response );
    $json_data = json_decode( $response_body, true );

    // 处理JSON解析错误
    if ( json_last_error() !== JSON_ERROR_NONE ) {
        error_log( 'JSON解析失败:' . json_last_error_msg() );
        return;
    }

    // 把解析后的JSON存到WordPress选项里(替代全局变量)
    update_option( 'my_plugin_stored_json', $json_data );
}
add_action( 'my_plugin_check_json_update', 'my_plugin_check_external_json' );

3. 在需要使用数据的地方获取

不管是在短代码、模板还是其他插件逻辑里,都可以通过get_option()拿到最新的JSON数据:

// 获取存储的JSON数据,第二个参数是默认值(这里用空数组)
$latest_json_data = get_option( 'my_plugin_stored_json', [] );

// 后续就可以正常使用这个变量了
if ( ! empty( $latest_json_data ) ) {
    // 比如遍历数据、渲染内容等操作
    foreach ( $latest_json_data as $item ) {
        // 处理每个条目
    }
}

额外注意事项

  • 验证cron是否正常运行:可以用WP Crontrol这类插件查看已注册的cron事件,确认my_plugin_check_json_update是每小时触发一次。
  • 缓存兼容:如果你的站点用了缓存插件(比如WP Rocket),可以考虑在更新选项后清除相关页面的缓存,确保用户能看到最新数据。
  • 权限问题:cron任务默认以管理员权限运行,update_option()需要的manage_options权限是满足的,不用额外处理。

这样一改,你就能实现每小时检查一次外部JSON,并且所有请求都能获取到最新的响应数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:05:39