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
相关产品推荐
相关产品推荐

