wp_get_current_user()在REST API回调函数中失效问题及代码咨询
解决WordPress REST API中wp_get_current_user()无法正常工作的问题
我帮开发者排查过很多次这个问题,核心原因是WordPress REST API的身份验证机制:默认情况下,未携带有效凭证的请求不会自动加载当前用户数据,而且自定义端点如果没配置权限验证,WordPress也不会初始化用户会话。下面给你一步步解决:
一、核心问题分析
- REST API无默认身份验证:和WordPress前端不同,REST API不会自动识别登录状态,必须通过请求凭证(比如Nonce、JWT Token)来验证请求合法性。
- 缺少权限回调:自定义端点如果没设置
permission_callback,WordPress不会触发用户验证流程,导致wp_get_current_user()返回匿名用户(ID为0)。
二、修改自定义端点代码
你需要在路由注册时添加权限回调,并确保回调里验证用户身份。以下是修改后的完整代码片段:
<?php class MCQAcademy_Endpoint extends WP_REST_Controller { /** * 注册端点路由 */ public function register_routes() { $version = '1'; $namespace = 'custompath/v' . $version; $base = 'endpointbase'; register_rest_route( $namespace, '/' . $base, array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), // 新增:添加权限验证回调 'permission_callback' => array( $this, 'get_items_permissions_check' ), ), ) ); } /** * 验证请求权限的回调函数 */ public function get_items_permissions_check( $request ) { // 验证用户是否已登录,可根据需求调整为角色/权限验证 if ( ! is_user_logged_in() ) { return new WP_Error( 'rest_forbidden', __( '你没有权限访问该端点', 'text-domain' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * 业务逻辑回调:现在可以正常获取当前用户 */ public function get_items( $request ) { $current_user = wp_get_current_user(); // 双重验证:确保用户有效 if ( $current_user->ID === 0 ) { return new WP_Error( 'rest_user_unauthorized', __( '无法识别当前登录用户', 'text-domain' ), array( 'status' => 401 ) ); } // 这里编写你的业务逻辑,比如返回用户信息 return rest_ensure_response( array( 'user_id' => $current_user->ID, 'user_login' => $current_user->user_login, 'user_email' => $current_user->user_email, ) ); } } // 初始化端点 add_action( 'rest_api_init', function () { $controller = new MCQAcademy_Endpoint(); $controller->register_routes(); } );
三、前端请求必须携带验证凭证
前端发起请求时,必须在请求头里添加WordPress的REST Nonce,否则权限验证会失败。以下是两种常见的实现方式:
1. 先通过PHP传递Nonce到前端
在主题的functions.php里添加代码,把Nonce注入到前端脚本:
function mcq_academy_enqueue_scripts() { wp_enqueue_script( 'mcq-academy-script', get_template_directory_uri() . '/js/your-script.js', array( 'jquery' ), '1.0', true ); // 传递REST Nonce到前端 wp_localize_script( 'mcq-academy-script', 'mcqAcademyData', array( 'nonce' => wp_create_nonce( 'wp_rest' ), 'api_url' => get_rest_url() ) ); } add_action( 'wp_enqueue_scripts', 'mcq_academy_enqueue_scripts' );
2. 前端请求携带Nonce
用Fetch API的示例:
fetch(mcqAcademyData.api_url + 'custompath/v1/endpointbase', { method: 'GET', headers: { 'X-WP-Nonce': mcqAcademyData.nonce, 'Content-Type': 'application/json' } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('请求失败:', error));
四、其他可能的场景
如果你的站点使用JWT认证(比如第三方插件实现),则需要在请求头里携带Authorization: Bearer {token},此时wp_get_current_user()也能正常工作,但需要确保JWT插件配置正确。
内容的提问来源于stack exchange,提问作者Shah Alom
相关产品推荐
相关产品推荐

