由于没有人真正解释为什么函数不能按您所认为的方式工作,我将尝试详细解释它,因为我刚刚落入了与您相同的陷阱。
这就是为什么文档并不真正清楚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;
}