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

WordPress REST API自定义GET端点调用自定义表遇权限禁止错误

解决REST权限禁止错误及数据库查询问题

嘿,我看你遇到了两个核心问题:REST API权限校验失败和SQL查询的语法错误,咱们一步步来修复:

1. 先搞定REST权限禁止的问题

你的permission_callback用了current_user_can('edit_others_posts'),这个权限要求当前用户得是管理员或者编辑角色(能修改其他人的文章)。如果是前端未登录的用户、普通订阅者访问这个接口,肯定会触发权限禁止的错误。

你可以根据实际需求调整权限逻辑:

  • 如果只想让管理员能访问:那保留这个权限就行,但要确保你测试用的账号是管理员角色;
  • 如果希望所有登录用户都能访问:把权限改成current_user_can('read');
  • 如果需要公开访问(不用登录就能看):直接返回true就行(注意:公开接口一定要确认数据不敏感,别泄露隐私哦)

举个公开访问的修改示例(你可以按需切换):

'permission_callback' => function () {
    // 公开访问,适合非敏感数据
    return true;
    // 要是想仅限登录用户,就换成:return is_user_logged_in();
}

2. 修复SQL查询的语法错误

你的SQL语句里表名用了单引号'wp_em_events',这会让MySQL报错的!正确的做法是用反引号包裹表名,而且推荐用$wpdb->prefix动态获取表前缀——毕竟有些用户会把默认的wp_改成别的,硬编码容易出问题。

修改后的查询函数:

function handle_get_all( $data ) {
    global $wpdb;
    // 动态拼接表名,适配自定义前缀
    $table_name = $wpdb->prefix . 'em_events';
    $query = "SELECT event_name FROM `$table_name`";
    $list = $wpdb->get_results($query);
    return $list;
}

3. 额外的调试小技巧

要是调整后还是有问题,可以加些调试信息排查:

  • 看看当前用户的权限到底是什么:
'permission_callback' => function () {
    // 把当前用户权限输出到错误日志
    error_log('当前用户权限:' . print_r(wp_get_current_user()->allcaps, true));
    return current_user_can('edit_others_posts');
}

然后去WordPress的wp-content/debug.log(需要先开启WP_DEBUG)里看日志,确认用户权限是否符合要求。

  • 检查SQL查询有没有执行成功:
$list = $wpdb->get_results($query);
if ($wpdb->last_error) {
    error_log('SQL错误:' . $wpdb->last_error);
    return new WP_Error('sql_error', '数据库查询失败', array('status' => 500));
}

最后整合所有修改后的完整代码:

add_action( 'rest_api_init', function () {
    register_rest_route( 'emevents/v1', '/all', array(
        'methods' => 'GET',
        'callback' => 'handle_get_all',
        'permission_callback' => function () {
            // 这里示例为公开访问,按需调整
            return true;
        }
    ) );
} );

function handle_get_all( $data ) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'em_events';
    $query = "SELECT event_name FROM `$table_name`";
    $list = $wpdb->get_results($query);
    
    // 检查SQL执行错误
    if ($wpdb->last_error) {
        return new WP_Error('sql_error', '数据库查询失败', array('status' => 500));
    }
    
    return $list;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:40:20