Как вывести подменю?

Если вы читаете это, значит вам нужно вывести дочерние пункты меню или «submenu» или «подменю».

У меня возникла необходимость вывести подменю на странице. Я думал, что это легко, но на это я потратил около 5 часов.

Спросите зачем мне выводить подменю? а я вам отвечу, для проекта jff.by было решено переделать меню, чтобы оно хорошо смотрелось на телефонах.

В интернете я нашел много способов, но у меня ни один из них не сработал и только в час ночи я понял почему.

Структура моего меню следующая:

menu

Особенность моего меню в том, что у меня пункт «О фестивале» является и родительским и дочерним, поэтому классический вариант кода в интернете мне не подошел.

Мой код немного побольше, но в этом есть свои плюсы. В классическом варианте в функцию передают «Название пункта меню», как я уже описал выше, мне это не подходит и я решил передавать ID этого же пункта.

В файл functions.php вставляем следующий код:

add_filter( 'wp_nav_menu_objects', 'submenu_limit', 10, 2 );

function submenu_limit( $items, $args ) {

    if ( empty($args->submenu) && empty($args->submenuID) )
        return $items;
	if( empty($args->submenu) ) 
		    $parent_id = array_pop( wp_filter_object_list( $items, array( 'ID' => $args->submenuID ), 'and', 'ID' ) );
	elseif( empty($args->submenuID) )
    $parent_id = array_pop( wp_filter_object_list( $items, array( 'title' => $args->submenu ), 'and', 'ID' ) );
    $children  = submenu_get_children_ids( $parent_id, $items );

    foreach ( $items as $key => $item ) {

        if ( ! in_array( $item->ID, $children ) )
            unset($items[$key]);
    }

    return $items;
}

function submenu_get_children_ids( $id, $items ) {

    $ids = wp_filter_object_list( $items, array( 'menu_item_parent' => $id ), 'and', 'ID' );

    foreach ( $ids as $id ) {

        $ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) );
    }

    return $ids;
}

Использование:

В нужном месте, там где хотите выводить подменю вставляем следующий код:

<?php
$args = array(
    'menu'    => 'Меню в шапке',
    'submenuID' => '25',
    'submenu' => 'О фестивале',
);
wp_nav_menu( $args );

?>

Мы передаем в функцию ‘name’ — это название вашего меню, ‘submenuID’ — ID пункта меню, ‘submenu’ — это название пункта

Честно признаюсь что обрабатываются аргументы не одновременно, а ппервый или второй, кстати у ‘submenuID’ приоритет выше.

 

Полезно почитать:

 

4 thoughts on “Как вывести подменю?

  1. Благодарю за информацию! Очень помогла!

    Единственное, у меня (на WP 4.3.1) заработало только после того, как я поменял ID на object_id в $parent_id = array_pop( wp_filter_object_list( $items, array( ‘object_id’ => $args->submenuID ), ‘and’, ‘ID’ ) );

    Ну и я совсем убрал submenu, решив использовать только submenuID.

    • У меня эта функция работает уже третий год. на 4.3.1 тоже работает без проблем

  2. Уж не знаю как и благодарить! Два дня искал простое решение того, как вывести подменю на странице и наконец-то нашел. Не думал, что это будет такой большой проблемой. Спасибо за то, что поделились таким полезным кодом! Всяческих успехов автору!

Leave a Comment