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

