如何移除WordPress JSON API特定端点并限制请求方法?
完整WordPress REST API定制方案
我来给你一套落地的实现方案,完全匹配你提出的三个定制需求,所有代码都可以直接放到主题的functions.php文件里,或者封装成独立插件使用:
1. 限制单个文章路由仅允许GET请求
针对/wp/v2/posts/{id}路由,我们可以通过rest_api_init钩子,在API初始化后修改该路由的允许请求方法:
add_action('rest_api_init', function () { // 获取已注册的REST路由集合 $routes = rest_get_server()->get_routes(); // 定位单个文章的路由规则 $target_route = '/wp/v2/posts/(?P<id>[\d]+)'; if (isset($routes[$target_route])) { // 仅保留GET方法(WP_REST_Server::READABLE对应GET+HEAD,也可直接写array('GET')) $routes[$target_route][0]['methods'] = WP_REST_Server::READABLE; // 更新路由配置 rest_get_server()->set_routes($routes); } }, 11); // 优先级设为11,确保在默认路由注册完成后执行
2. 完全移除指定端点
要删除users/*、settings这类端点,直接使用unregister_rest_route函数即可,同样挂载到rest_api_init钩子:
add_action('rest_api_init', function () { // 移除整个users端点(自动覆盖所有子路由如/users/{id}、/users/me) unregister_rest_route('wp/v2', '/users'); // 移除单个settings端点 unregister_rest_route('wp/v2', '/settings'); // 如果还有其他需要移除的端点,可继续添加: // unregister_rest_route('wp/v2', '/media/(?P<id>[\d]+)/edit'); }, 11);
3. 移除端点内的指定请求方法
如果需要保留某个端点,但删除其中的特定方法(比如禁止文章列表的POST、PUT请求),可以通过修改路由的methods数组实现:
add_action('rest_api_init', function () { $routes = rest_get_server()->get_routes(); // 示例1:移除文章列表端点的POST、PUT、DELETE方法,仅保留GET $posts_list_route = '/wp/v2/posts'; if (isset($routes[$posts_list_route])) { $routes[$posts_list_route][0]['methods'] = array('GET'); rest_get_server()->set_routes($routes); } // 示例2:移除单个评论端点的DELETE方法 $comments_route = '/wp/v2/comments/(?P<id>[\d]+)'; if (isset($routes[$comments_route])) { unset($routes[$comments_route][0]['methods']['DELETE']); rest_get_server()->set_routes($routes); } }, 11);
验证方案有效性
完成代码添加后,可以通过以下方式验证效果:
- 尝试用POST请求访问
/wp/v2/posts/1,应该返回405 Method Not Allowed错误 - 访问
/wp/v2/users或/wp/v2/settings,应该返回404 Not Found错误 - 检查目标端点的响应头
Allow,确认只包含你允许的请求方法
额外提示
- 如果你需要更细粒度的权限控制,可以结合
rest_pre_dispatch钩子,在请求执行前进行自定义权限校验 - 所有修改建议放在子主题的
functions.php中,避免主题更新时丢失代码
内容的提问来源于stack exchange,提问作者beauchette
相关产品推荐
相关产品推荐

