如何在wp_NAV_MENU中使用带有(MENU)参数的WP_TERM?

时间:2017-02-05 作者:Mohamed Omar

我试图理解wp_nav_menu函数,我对它的参数没有意见,但wordpress声明要使用int , stringWP_Term 使用menu 钥匙我需要知道如何使用WP_Term 因为wordpress只提供了核心类WP_Term.如果你愿意,你可以解释一下这个概念。使用它的原因和结果是什么?

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

背景正如你所知,wp_nav_menu() 函数接受数组$args 作为参数(&A);menu 是关键之get_term_by()三 大堆

钥匙menu 对于参数$args 定义为:

(int | string | WP\\u Term)所需菜单。接受(按顺序匹配)id、slug、名称、菜单对象。

现在,如果你深入研究implementation of wp_nav_menu() function, 您将看到,无论您提供什么价值,无论它是否是int id,astring 名称,astring slugobject WP_Term, 它将始终检索WP_Term object 在创建菜单之前,为相应的菜单id命名。

例如:如果您有一个id为的菜单3, 名称My Menu 和slugmy-menu; 您可以使用以下任意代码添加该菜单:

    // with id: 3
    wp_nav_menu( array(
        \'menu\'           => 3
    ) );

    // with name: My Menu
    wp_nav_menu( array(
        \'menu\'           => "My Menu"
    ) );

    // with slug: my-menu
    wp_nav_menu( array(
        \'menu\'           => "my-menu"
    ) );
即使您不提供menu 参数,它将尝试获取WP_Term 对象来自其他参数,如theme_location.

例如:说出菜单位置top 已使用注册register_nav_menus() 在主题中的功能functions.php &文件;名为的菜单My Menu 被任命为top 位置位于WP管理面板中。在这种情况下,您可以使用以下方法获得相同的菜单:

    wp_nav_menu( array(
        \'theme_location\' => \'top\'
    ) );
在上述每种情况下,wp_nav_menu() 函数检索WP_Term 对象,然后生成菜单。它使用wp_get_nav_menu_object() 函数来执行此操作。

实施

因此而不是theme_location 参数,或menu 参数为int idstring name|slug,您可以直接提供相应的WP\\u Term对象。

单向获取WP_Term 对象是通过使用WP_Term::get_instance() 方法:

    // get the WP_Term object using menu id 3
    $menu_obj = WP_Term::get_instance( 3, \'nav_menu\' );
您还可以获得WP_Term 使用菜单名称的对象get_term_by() 功能:

    // by menu slug
    $menu_obj = get_term_by( \'slug\', \'my-menu\', \'nav_menu\' );

    // or, by menu name
    $menu_obj = get_term_by( \'name\', \'My Menu\', \'nav_menu\' );
现在你有了WP_Term 对象$menu_obj, 您可以使用它生成菜单:

    wp_nav_menu( array(
        \'menu\'           => $menu_obj
    ) );
用例:

因此您知道如何使用WP_Term 对象作为wp_nav_menu() 作用现在的问题是:你为什么要使用它it\'s just another option, 您可能想使用它,因为它可能是一个稍微快一点的选项。

例如,如果要两次使用同一菜单,一次在页眉中(&A);然后在页脚中,在这种情况下,您可以创建WP_Term 标题菜单模板中的对象:

    global $menu_obj;
    $menu_obj = WP_Term::get_instance( 3, \'nav_menu\' );

    wp_nav_menu( array(
        \'menu\'           => $menu_obj,
        \'menu_id\'        => \'header_menu\'
    ) );
然后简单地使用$menu_obj 在页脚模板中:

    // global declaration is needed to access the global variable from another template
    global $menu_obj;
    wp_nav_menu( array(
        \'menu\'           => $menu_obj,
        \'menu_id\'        => \'footer_menu\'
    ) );
如果您调查wp_nav_menu() 函数,您将看到,通过这样做,您将避免WordPress core中的一些额外函数调用,因此总体执行速度将略快。

但是,请记住使用theme_location 参数或其他选项可能更方便&;更好的维护。因此,您是否应该使用它完全取决于您自己的特定场景。我刚才解释说,您可以&;怎么了,没什么了。