带有REST_DO_REQUEST的WordPress REST API,可能的竞争条件?

时间:2020-05-25 作者:Mike Kormendy

我试图在我的自定义插件中检索响应,这是基于另一个插件提供的REST路由。

在主题函数文件的根作用域中运行以下代码块时,我得到了一个成功的响应,并得到了预期的结果。

$request = new WP_REST_Request(\'GET\', \'/another/plugins/rest/route\');
$request->set_query_params([
  \'filterBy\' => [
    \'url\' => \'/test/\'
  ]
]);
$response = rest_do_request($request);
但是,当在我的自定义插件文件的根范围内运行上面的代码块时,我得到以下响应:

Array
(
    [code] => rest_no_route
    [message] => No route was found matching the URL and request method
    [data] => Array
        (
            [status] => 404
        )
)
我会注意到,我的自定义插件应该在生成REST路由的其他插件之后加载,因为我的自定义插件的名称按字母顺序排在其他插件之后,我没有代码来更改顺序。

如何在加载插件之前实例化rest路由?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

根本问题是,代码试图在注册端点之前使用REST API端点。

具体来说,它需要这样做after 这个rest_api_init 胡克开火了。尝试在加载插件和主题后运行的挂钩上执行此操作,例如wp_loaded.

一般来说avoid doing work in the root scope of a plugins file or functions.php. WordPress是围绕挂钩和过滤器以及特定的加载过程构建的,因此将挂钩视为时间轴上的事件更为准确。只需将内容放入插件文件而不使用挂钩,它基本上是在史前时代运行的。你不能要求它从A开到B,因为汽车还没有发明出来。

所以这不是what, 这是一个when