WordPress Cron调用Google Site Kit获取GSC数据时缺失必要权限
问题分析
你遇到的核心问题是WordPress定时任务(Cron)无用户上下文,导致Google Site Kit无法验证权限:
- 直接调用代码时,是在登录用户的会话中执行,Site Kit能读取该用户的授权信息,权限校验自然通过;
- Cron任务是后台静默执行的,没有关联任何登录用户,Site Kit找不到有效授权,因此返回
missing_required_scopes错误。
另外你的代码还存在钩子名称不匹配的bug:wp_next_scheduled检查的是gsc_data_send_email_event_'.$interval,但wp_schedule_single_event调度的是gsc_data_send_email_event,这会导致重复创建定时任务。
解决方案
1. 修复Cron钩子名称不匹配
把调度和检查的钩子名称统一,避免重复调度:
public function gsc_data_schedule_email( $interval ) { $hook_name = 'gsc_data_send_email_event_' . $interval; if ( ! wp_next_scheduled( $hook_name ) ) { wp_schedule_single_event( time() + $interval, $hook_name, array( $interval ) ); } }
清理钩子时也要用统一的名称:
wp_clear_scheduled_hook( 'gsc_data_send_email_event_' . $interval );
2. 在Cron任务中模拟授权用户上下文
在获取GSC数据前,切换到拥有Google Site Kit完整权限的管理员用户,让Site Kit能读取该用户的授权信息:
修改gsc_data_send_email_function函数,添加用户切换逻辑:
public function gsc_data_send_email_function( $interval ) { global $wpdb; // 保存原用户ID(Cron中通常为0,即未登录状态) $original_user_id = get_current_user_id(); // 切换到拥有Site Kit权限的管理员用户(替换为你的管理员ID,通常是1) $admin_user = get_user_by( 'id', 1 ); if ( $admin_user ) { wp_set_current_user( $admin_user->ID ); } if ( ! class_exists( 'Google\Site_Kit\Plugin' ) ) { // 恢复原用户后退出 wp_set_current_user( $original_user_id ); return; } // ... 原有获取GSC数据的代码 ... // 执行完所有操作后恢复原用户 wp_set_current_user( $original_user_id ); }
3. 验证权限配置
确保你切换的管理员账号确实完成了Google Site Kit的完整授权:
- 登录该管理员账号,进入Site Kit设置页面;
- 检查Search Console模块的权限状态,确认已授予
https://www.googleapis.com/auth/webmasters权限。
修改后关键代码示例
public function gsc_data_schedule_email( $interval ) { $hook_name = 'gsc_data_send_email_event_' . $interval; if ( ! wp_next_scheduled( $hook_name ) ) { wp_schedule_single_event( time() + $interval, $hook_name, array( $interval ) ); } } public function gsc_data_send_email_function( $interval ) { global $wpdb; $original_user_id = get_current_user_id(); $admin_user = get_user_by( 'id', 1 ); if ( $admin_user ) { wp_set_current_user( $admin_user->ID ); } if ( ! class_exists( 'Google\Site_Kit\Plugin' ) ) { wp_set_current_user( $original_user_id ); return; } $site_kit = \Google\Site_Kit\Plugin::instance(); $context = $site_kit->context(); $modules = new \Google\Site_Kit\Core\Modules\Modules( $context ); $search_console = $modules->get_module( 'search-console' ); if ( ! $search_console ) { wp_set_current_user( $original_user_id ); return; } // ... 后续原有代码 ... // 恢复原用户 wp_set_current_user( $original_user_id ); }
内容的提问来源于stack exchange,提问作者Waqas Safdar
相关产品推荐
相关产品推荐

