WordPress插件rest_api_init钩子不触发问题求助
WordPress REST API路由注册失败排查方案
问题现象
- 开发的WordPress插件在一台服务器正常运行,另一台服务器上REST路由无法注册,
rest_api_init钩子未触发 wp_loaded钩子可正常触发,请求日志显示:REQUEST_URI=>/zuzz-club/v1/gc/1CONTENT_TYPE=>application/jsonREQUEST_METHOD=>POST
排查与解决步骤
1. 验证REST API是否可用
直接访问服务器域名下的/wp-json/路径:
- 若返回JSON格式的API信息,说明REST API正常;
- 若返回403/404,说明API被拦截,需排查:
- 主机商是否禁用了REST API;
- 安全插件(如Wordfence)是否设置了REST API访问限制;
.htaccess或Nginx配置中是否有屏蔽API路由的规则。
2. 刷新固定链接重写规则
WP REST API依赖固定链接的重写规则,若规则失效会导致路由无法识别:
- 登录WP后台,进入「设置 → 固定链接」,选择非默认格式(如「文章名」),点击「保存更改」强制刷新规则;
- Apache服务器检查
.htaccess文件是否包含WP默认重写规则,且文件具备写入权限; - Nginx服务器确保配置文件中有正确的重写规则:
location / { try_files $uri $uri/ /index.php?$args; }
3. 排查插件冲突
部分插件可能提前终止WP流程,导致rest_api_init钩子无法执行:
- 临时禁用服务器上所有其他插件,仅保留目标插件测试;
- 若恢复正常,逐个启用其他插件,定位冲突插件。
4. 检查环境版本差异
对比两台服务器的环境配置:
- PHP版本:代码使用了短数组语法
[],需PHP 5.4+,若目标服务器版本过低会报错; - WordPress版本:确保两台服务器WP版本一致,旧版本对REST API的支持存在差异;
- 查看PHP错误日志,排查是否有语法错误、致命错误或函数禁用(如
error_log被禁用)导致钩子代码无法执行。
5. 临时 workaround:手动在wp_loaded中注册路由
若rest_api_init始终无法触发,可在wp_loaded钩子中手动注册路由(仅在REST请求时执行):
add_action( 'wp_loaded', function() { if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { error_log("wp_loaded: 手动注册路由"); $result = register_rest_route( 'zuzz-club/v1', '/gc/(?P<id>\d+)', array( 'methods' => [ 'POST', 'GET' ], 'callback' => 'zuzz_gc_webhook', 'permission_callback' => function () { return true; } ) ); if ($result) { error_log("wp_loaded: 路由注册成功"); } else { error_log("wp_loaded: 路由注册失败"); } } }, 10 );
内容的提问来源于stack exchange,提问作者MGB
相关产品推荐
相关产品推荐

