我正在尝试使用WP REST API v2插件从JSON响应中获取导航菜单。

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}}

服务器理解了我的请求,但拒绝提供数据。

问:如何解决此问题?

评论

所有这些答案都是可怕的。安装它,扩展它。它应该已经内置,社区应该在GitHub上发布一个问题。

#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',
    ) );
} );


像这样对我有用。