WP_GET_NAV_MENU_ITEMS()不使用辅助文件

时间:2016-08-24 作者:somebodysomewhere

根据docs, wp_get_nav_menu_items() 参数1接受

(string) (Required) Menu name, ID, or slug.
下面是我注册菜单的方式

register_nav_menus(
    array(
        \'primary\' => \'Navigation primaire\',
        \'secondary\' => \'Navigation secondaire\',
    )
);
下面是我如何尝试加载一个

var_dump( wp_get_nav_menu_items(\'primary\') );             // bool(false)
var_dump( wp_get_nav_menu_items(\'navigation-primaire\') ); // bool(false)
var_dump( wp_get_nav_menu_items(\'Navigation primaire\') ); // bool(false)

var_dump( wp_get_nav_menu_items(51) );                      // array([...]) (correct)
因此,该函数只会在我使用ID时返回菜单。我更愿意使用slug,因为我的网站是多语言的,我不想根据语言使用不同的ID。

我是做错了什么还是这是一个核心bug?我在禁用了多语言插件(Polylang)的情况下,尝试了这一点。

4 个回复
最合适的回答,由SO网友:JoeMoe1984 整理而成

由于没有人真正解释为什么函数不能按您所认为的方式工作,我将尝试详细解释它,因为我刚刚落入了与您相同的陷阱。

这就是为什么文档并不真正清楚slug指的是什么。大多数人都会认为这是注册菜单的一部分,但这是不对的。它实际上是分类nav\\U菜单中的一个鼻涕虫。

让我们深入了解源代码,看看Wordpress核心如何解释菜单的slug。

function wp_get_nav_menu_items( $menu, $args = array() ) {
    $menu = wp_get_nav_menu_object( $menu );
....
第一行显示它使用一个名为wp\\u get\\u nav\\u menu\\u object()的函数来检索菜单。它通过$menu 作为此函数的第一个参数。因为这是我们用来制作slug的,所以我们必须深入到源代码中wp_get_nav_menu_object().

function wp_get_nav_menu_object( $menu ) {
    $menu_obj = false;

    if ( is_object( $menu ) ) {
            $menu_obj = $menu;
    }

    if ( $menu && ! $menu_obj ) {
            $menu_obj = get_term( $menu, \'nav_menu\' );

            if ( ! $menu_obj ) {
                    $menu_obj = get_term_by( \'slug\', $menu, \'nav_menu\' );
            }

            if ( ! $menu_obj ) {
                    $menu_obj = get_term_by( \'name\', $menu, \'nav_menu\' );
            }
    }
....
我们可以看到,此函数使用get_term_by 函数检索$menu_obj. 这是我们的菜单。

在Wordpress管理区域中创建菜单时,会创建一个新术语。术语,有基于名称的鼻涕虫。因此,如果你有一个菜单名“我的超棒菜单”,Wordpress将生成一个名为“我的超棒菜单”的slug。您可能已经将菜单注册为“primary”,但这不是这些函数所指的slug。这实际上是菜单上的术语slug。

因此,为了明确起见,假设您注册了这样一个菜单:

register_nav_menu(\'primary\', \'my primary nav\');
primary 不是鼻涕虫。my-primary-nav 也不是鼻涕虫。

由于我们创建了一个名为“My Awesome menu”(作为示例)的菜单,而slug是“My Awesome menu”,因此您可以这样检索它:

$awesome_menu = wp_get_nav_menu_items( \'my-awesome-menu\' );
您只需检查wp\\u terms(或任何前缀)表中的数据库并在其中查找菜单名,就可以看到slug是什么。

由于您使用的是多语言站点,甚至是多站点,因此这种方法并不是最好的方法。因为名称和slug可能不同。

因此,最好的方法是使用get_nav_menu_locations() 它将返回一个关联数组,其中键是已注册菜单的slug,值是为其位置选择的菜单项的id。

通过术语id,我们可以获得术语信息,然后返回函数所需的适当slug。

下面是一个利用wp_get_nav_items() 函数,但您将传入已注册的菜单slug。在您的情况下,这将是“主要的”。

代码解决方案

// kind of a long function name but whatevs
function get_menu_items_by_registered_slug($menu_slug) {

    $menu_items = array();

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_slug ] ) ) {
        $menu = get_term( $locations[ $menu_slug ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);


    }

    return $menu_items;

}

SO网友:Narek Malkhasyan

对已接受答案的小修改

从菜单位置删除菜单后,$locations[ $menu_slug ] 退货0, 所以最好加上这张支票:

function get_menu_items_by_registered_slug($menu_slug) {
  $menu_items = array();

  if ( ($locations = get_nav_menu_locations()) && isset($locations[$menu_slug]) && $locations[$menu_slug] != 0 ) {
    $menu = get_term( $locations[ $menu_slug ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
  }

  return $menu_items;
}

SO网友:Ignat B.

Try this:

    $menu_name = \'primary\'; 

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
        $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);
        // Your output code
    }
SO网友:Abuzer Killibacak
custom_menu(\'primary\');

function custom_menu( $theme_location ) {
if ( ($theme_location) && ($locations = get_nav_menu_locations()) && isset($locations[$theme_location]) ) {
    $menu = get_term( $locations[$theme_location], \'nav_menu\' );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
    //your menu code.
}

相关推荐

用标准的干净文件替换NAV-menus.php文件?

我是一个自学成才的wordpress网站设计师,请原谅我的无知。我为一个客户开发的几个网站最近被一个印尼黑客组织破坏了(很有趣!)。客户端没有更新wordpress安装和其他一些危及安全的事情。遗憾的是,没有网站的清理备份。网络主机给了我一个包含恶意软件扫描结果的文本文件。看起来很多受影响的文件都是导航菜单。网站的php文件。文本文件中显示的扫描结果示例如下:“[主目录]/[网站文件夹名称]/wp includes/nav-menu.php:SL-php-INJECTOR-1-ejw.UNOFFICIAL