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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:54:31