REST API v2没有导航菜单插件扩展,而仅针对V1。
从Codex WordPress帖子类型中,我了解到导航菜单被视为帖子类型。
从Rest API Doc中,这就是我们获取以下类型的帖子的方式:
GET http://demo.wp-api.org/wp-json/wp/v2/types/<type>
我试图这样获得:
URL : http://localhost/wptest/wp-json/wp/v2/types/nav_menu_item
我收到403错误。
{"code":"rest_cannot_read_type","message":"Cannot view type.","data":{"status":403}}
服务器理解了我的请求,但拒绝提供数据。
问:如何解决此问题?
#1 楼
REST API v2有一个导航菜单插件扩展:https://wordpress.org/plugins/wp-api-menus/评论
我刚刚访问了链接,不幸的是,该插件三年没有更新了。
–大卫·加斯金(David Gaskin)
20 Mar 26 '20 at 0:48
#2 楼
由于当我的最主要回答是“安装插件X”时,我自己并不喜欢它,因此,这是我解决的方法:WP Rest当前不提供菜单。因此,您需要做的是注册您自己的自定义终结点,然后从需要它的应用程序中调用该路由。
所以您将在函数(php.plugin)中包含这样的内容):
function get_menu() {
# Change 'menu' to your own navigation slug.
return wp_get_nav_menu_items('menu');
}
add_action( 'rest_api_init', function () {
register_rest_route( 'myroutes', '/menu', array(
'methods' => 'GET',
'callback' => 'get_menu',
) );
} );
对于上面的示例,您将从以下位置访问数据:
http://your-domain.dev/wp-json/myroutes/menu
您可以使用上面的方法创建您想要的任何路由,以获取WP Rest中不可用的任何类型的数据。如果需要在将某些数据发送到您的应用程序之前对其进行处理,也很好。
评论
感谢您与您分享解决方法,而不仅仅是一个插件链接;-)最好为函数名加上前缀或使用名称空间,以避免可能的名称冲突,因为get_menu()非常通用。
–birgire
17年7月24日在21:30
太棒了,人们并没有意识到大多数人已经安装了30到70个插件。他们甚至有插件来保持停用状态!太疯狂了。我想我要安装一个插件来保持该线程。
– Ignacio Bustos
18年7月9日在22:49
它只会输出false
–moesphemie
18年11月16日在20:57
#3 楼
@Liren的答案很好。但是,很少有初学者可能无法调整路线。这是经过最少的修改即可与WordPress Rest API v2很好地结合的代码。仅在wp_get_nav_menu_items()函数中替换菜单名称。如果菜单名称和子菜单不起作用(返回false),请使用菜单ID(在编辑该菜单时在仪表板中可见)。
function get_my_menu() {
// Replace your menu name, slug or ID carefully
return wp_get_nav_menu_items('Main Navigation');
}
add_action( 'rest_api_init', function () {
register_rest_route( 'wp/v2', 'menu', array(
'methods' => 'GET',
'callback' => 'get_my_menu',
) );
} );
路由URL:
https://website.com/wp-json/wp/v2/menu
涵盖了更多详细信息在教程中:WordPress Rest API –获取导航菜单项
评论
这是一个只有一条路线的好解决方案
–juanitourquiza
20 Jan 23 '20 at 16:40
#4 楼
我选择了最简单的方法,但仍保持动态状态,以便可以获取多个菜单。 /**
* Returns menu items in a array based on the navigation menu id passed
*
* @param object The actual request where parameters can be accessed.
* @return array The menu items contained in that specific menu
*/
function expose_navigation($request) {
$id = $request['id'];
return wp_get_nav_menu_items($id);
}
/**
* Exposes under /navigation/{id} the menu items in the wp-json api
*
* @return void
*/
function expose_navigation_to_rest() {
register_rest_route( 'wp/v2', '/navigation/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'expose_navigation'
]
);
}
add_action('rest_api_init', 'expose_navigation_to_rest');
因此像
/navigation/{id}
这样容易查询#5 楼
注册帖子类型时需要添加'show_in_rest' => true,
。在此处查看详细信息http://v2.wp-api.org/extending/custom-content-types/
评论
register_post_type('nav_menu_item',array('show_in_rest'=> true));
–luukvhoudt
19年11月28日在1:24
这将是一个很好的解决方案,但是由于对我来说并不明显的原因,响应中的数据不包含菜单信息,响应中没有标题,描述或任何有用的信息(对我而言)。我想念什么吗?
–约翰内斯
20 Nov 15'上午0:37
#6 楼
我认为不应将插件用于此类任务。同样,hkc的答案实际上还不错,它只需要进一步解释即可使用nav_menu_item
帖子类型(用于wp导航菜单的帖子)。该帖子类型已被注册,因此我们需要对其进行更改,只需将其插入
register_post_type_args
过滤器即可轻松完成。通过此过滤器,我们可以更改特定帖子类型的参数。下面的代码只显示了nav_menu_item
帖子类型。 REST中的发布类型。它还会更改默认的Posts REST控制器,以在Liren的答案中描述的REST中显示一些类似的输出。尽管除此之外,它还可以完成所有后置类型REST控制器的工作,从而为您提供更多控制和功能。还应将其视为更稳定的选项,因为它不会与其他REST路由冲突,并且最后但并非最不重要的是,它也使使用起来更加方便。#7 楼
我同意@Lirens的回答,但是菜单应该通过ID来调用,而不是笨拙。另外,不需要菜单路径前的斜杠。因此它变得更像这样:function get_menu() {
# Change '2' to your own navigation ID.
return wp_get_nav_menu_items(2);
}
add_action( 'rest_api_init', function () {
register_rest_route( 'myroutes', 'menu', array(
'methods' => 'GET',
'callback' => 'get_menu',
) );
} );
像这样对我有用。
评论
所有这些答案都是可怕的。安装它,扩展它。它应该已经内置,社区应该在GitHub上发布一个问题。