register_rest_route 注册了接口,访问一直返回 404

· wordpress · 阅读 5
摘要

接口地址自己拼得挺顺,浏览器一敲却是 404,连 rest_no_route 的错误 JSON 都没给。这种一般不是权限问题,是路由压根没挂上——因为你在错误的时间注册了它。 挂 rest_api_init,不是 init 我一开始图省事

接口地址自己拼得挺顺,浏览器一敲却是 404,连 rest_no_route 的错误 JSON 都没给。这种一般不是权限问题,是路由压根没挂上——因为你在错误的时间注册了它。

挂 rest_api_init,不是 init

我一开始图省事,把注册代码写在 init 钩子里,结果一塌糊涂。正确的钩子是 rest_api_init:

// wp-content/plugins/my-api/my-api.php
add_action('rest_api_init', function () {
    register_rest_route('myapi/v1', '/posts', array(
        'methods'  => 'GET',
        'callback' => 'myapi_get_posts',
        'permission_callback' => '__return_true',
    ));
});

还有个大坑:namespace 参数里别带前导斜杠和末尾斜杠。写 '/myapi/v1' 或者 'myapi/v1/' 都会让最终路径变成双斜杠,然后 404。我第一次排查了大半个小时,就多敲了一个字符。

permission_callback 不写会有警告

WordPress 5.5 之后,不写 permission_callback,接口还能跑,但你会收到一条 _doing_it_wrong 提示。公开接口就写 '__return_true',需要登录就用 is_user_logged_in()。别为了省事把它省掉,改天开了 WP_DEBUG 日志里一堆这种警告,看着烦。

顺带说一句 callback 返回值。返回 WP_Error 对象会自动变成错误响应,返回数组或 WP_REST_Response 就是 JSON。直接 echo 是大忌——会破坏 JSON 结构,前端拿到一堆脏字符。

想确认路由到底有没有

不装插件也能查。访问 /wp-json/,把返回的那坨 JSON 格式化一下,看 namespaces 里有没有你的命名空间。没有就是没注册成功,别再去纠结 URL 拼得对不对。

如果命名空间在但路由不在,八成是插件没启用,或者你写在了 plugins_loaded 之后才加载的文件里。这个我没法替你在环境里验证,得看你自己的加载顺序。

最后提醒一句:固定链接如果是「朴素」模式,REST 接口也会跟着乱。先把固定链接设成任意一个非默认值,再测接口。这个坑挺隐蔽,我栽过。