WordPress自定义API端点报rest_no_route(404)错误求排查
排查WordPress REST API
rest_no_route 404错误的解决方案 咱们先从你给出的代码细节和REST API路由常见坑点入手,一步步定位问题:
1. 先修正路由路径的合理性
你注册的路由是learn2/v1 + /api/,最终访问URL会是your-site.com/wp-json/learn2/v1/api/,这里有两个潜在问题:
- 路径末尾的斜杠:虽然WordPress会自动处理,但多余的斜杠偶尔会导致匹配异常,建议去掉末尾斜杠,改成
'/api' - 冗余的
api字样:REST API本身已经通过wp-json标识,路由里重复写/api/容易混淆,建议改成更具语义的路径,比如'/webhook'
2. 确认钩子绑定是否真的生效
你用$this->loader->add_action('rest_api_init', $plugin_public, 'create_api_webhook')绑定路由注册函数,要确保:
$plugin_public这个类实例已经正确初始化,没有为空或未定义- 可以在
create_api_webhook方法里加一行日志测试,确认函数是否被执行:
查看PHP错误日志,如果没有这条日志,说明钩子根本没触发——要检查你的loader类的error_log('REST route registration triggered');add_action方法是否正确传递了回调(比如是不是应该用数组格式[$plugin_public, 'create_api_webhook']?如果是WP Plugin Boilerplate的loader,这个格式是对的,但要确认实例没问题)
3. 补全回调函数的完整性
你的代码里'callback...是截断的,必须确保:
- 回调函数存在,并且是
public权限(因为是类方法) - 回调函数格式正确,比如在
$plugin_public类里:
然后在public function handle_webhook(WP_REST_Request $request) { return rest_ensure_response(['status' => 'success', 'data' => 'Hello from webhook']); }register_rest_route里正确关联:'callback' => [$this, 'handle_webhook'],
4. 验证请求方法和权限设置
- 你设置的
methods是'GET',要确保测试时用的是GET请求(比如浏览器直接访问,或者curl命令:curl -X GET your-site.com/wp-json/learn2/v1/api/),如果用POST请求会直接返回404 - 临时添加
'permission_callback' => '__return_true'跳过权限验证,测试路由是否能正常访问,排除权限问题导致的404
5. 检查WordPress固定链接设置
REST API依赖“非朴素”的固定链接模式,如果你当前是“朴素”模式(即?p=123这种URL),必须到设置→固定链接里改成“文章名称”或其他模式,保存设置后再测试路由。
修正后的示例代码
// 确保钩子绑定正确 $this->loader->add_action('rest_api_init', $plugin_public, 'create_api_webhook'); public function create_api_webhook() { // 简化路径,使用规范的常量定义请求方法 register_rest_route( 'learn2/v1', '/webhook', // 去掉末尾斜杠,语义化路径 array( 'methods' => WP_REST_Server::READABLE, // 等价于GET,用常量更规范 'callback' => [$this, 'handle_webhook'], // 关联正确的回调方法 'permission_callback' => '__return_true', // 测试用,后续替换为实际权限逻辑 ) ); } // 完整的回调方法 public function handle_webhook(WP_REST_Request $request) { // 处理你的业务逻辑,比如获取请求参数 $params = $request->get_query_params(); return rest_ensure_response([ 'message' => 'Webhook accessed successfully', 'received_params' => $params ]); }
按上面的步骤逐一排查,应该就能解决rest_no_route的404问题了。
内容的提问来源于stack exchange,提问作者Tommy Adeniyi
相关产品推荐
相关产品推荐

