我希望使用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调用实现这一点?
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 );
}