WP REST API从路径获取页面

时间:2020-06-06 作者:user3452

我希望使用RESTAPI将WordPress用作无头CMS,但我很好奇如何最好地使用路径获取页面。

例如,如果Wordpress托管在cms上。实例com和我的前端就是一个例子。com。如果我在cms创建一个页面。实例com/services/service-a例如,我希望它可以在前端访问。com/services/service-a。如果我的前端使用“services/service-a”,我如何才能找到正确的页面?

我的第一个想法是使用slug,直到我意识到slug只匹配最后一部分。在本例中,slug将是“service-a”,而不是“service\\service-a”。我可以指定一个slug和一个父ID,但这将需要对每个级别或层次结构进行调用,以向上遍历树以获取父ID。

我还简要考虑过忽略所有以前的层次结构,只查看使用slug的路径的最后一部分,但我不确定这是否会产生任何意外的后果 编辑:再仔细考虑一下,我坚决反对这种方法,因为在不同层次结构区域的两个页面可能有相同的slug,从而导致不同的路径。

我想设置一个自定义端点来获取路径,通过get\\u page\\u by\\u path()函数运行它,然后返回id。但这意味着每个页面加载都需要2个API调用,或者至少每个页面加载都不在层次结构的第一级。

但要将每个请求限制为单个API调用,我想要么在可能的情况下向pages API端点添加一个自定义参数,以指定搜索响应的完整路径,要么在不明确可能的情况下创建自己的端点以接受path参数,然后返回匹配的page对象。显然,在这种情况下,我更倾向于前者,而不是后者,因为这将减少插件的工作量,并充分利用WordPress中现有的代码。

是否可以向现有端点添加自定义选项?有没有更好的方法可以通过单个API调用实现这一点?

2 个回复
SO网友:Adam Bernot

对我来说,通常更容易决定前端应该如何工作,然后决定如何获取适当的数据。在你的例子中,services 将是一个具有某些功能的模块,然后service-a 会是鼻涕虫。

但是,如果您只关心URL的外观是否相同,则可以使用pushState 在浏览器中更改URL而不加载新页面。可以分析posts API响应中的“link”属性,以获得完整路径。只要在最后得到一个唯一标识符(例如slug),这实际上会使路径的中间部分变得毫无意义,但在加载页面后仍然可以立即填充它。

SO网友:user3452

我找到了一个过滤器挂钩“rest\\u page\\u query”,我打算尝试向官方页面端点添加一个自定义查询变量,但虽然我可以从过滤器中获得自定义查询变量,但我无法找出如何影响基于它的输出。

然而,在查看自定义端点时,我意识到它非常简单,而且更容易做到这一点。

因此,我将此代码放在自定义插件中:

add_action( \'rest_api_init\', function () {
  register_rest_route( \'custom/v1\', \'/pages\', array(
    \'methods\' => \'GET\',
    \'callback\' => \'my_page_from_path\',
  ) );
} );

function my_page_from_path( $request ) {
    $path = $request->get_param( \'path\' );
    $page = get_page_by_path( $path, ARRAY_A );
    return rest_ensure_response( $page );
}

相关推荐

WP-API:获取多个类别的帖子

比方说,我有两个类别,\'color\' 和\'temperature\'. 每一个都有许多子类别。当我转到如下URL时,Wordpress在显示请求类别中的帖子方面做得很好:http://www.example.com/category/pink+warm 现在我想对json-rest-api 插件,通过REST请求。有可能吗?如何使用REST请求获取多个类别的帖子(不是在任何一个类别中,而是在所有请求的类别中)?我尝试了不同的URI,但失败了。