Меню WordPress: При нажатии на родительский пункт меню отображаются только дочерние элементы навигации по этой ссылке
У меня возникли некоторые проблемы с моей навигационной функцией WordPress. У меня есть следующая функция, которая извлекает пункты меню из администратора:
function cr_get_menu_items($menu_location)
{
$locations = get_nav_menu_locations();
$menu = get_term($locations[$menu_location], 'nav_menu');
return wp_get_nav_menu_items($menu->term_id);
}
В моем шаблоне навигации я использую эту функцию для извлечения только родительских элементов, таких как:
<?php $nav = cr_get_menu_items('navigation_menu') ?>
<?php foreach ($nav as $link):
if ($link->menu_item_parent == 0) : ?>
<a class="main-nav" href="<?= $link->url ?>"><?= $link->title ?></a>
<?php endif; endforeach; ?>
Я попытался создать вспомогательную навигацию, которая показывает дочерние элементы следующим образом:
<?php $nav = cr_get_menu_items('navigation_menu') ?>
<?php foreach ($nav as $link):
if ($link->menu_item_parent !== 0) : ?>
<a href="<?= $link->url ?>"><?= $link->title ?></a>
<?php endif; endforeach; ?>
Это включает ВСЕ дочерние пункты меню. Способ навигации, который я создаю, должен работать следующим образом: вы нажимаете на родительский пункт меню и подменю навигация отображает все дочерние пункты меню для этого родителя. Функция скрытия/отображения - это все JS.
Есть ли способ изменить функцию, которую я должен использовать только для дочерних элементов для определенного родительского пункта меню? Любая помощь/руководство приветствуется.
1 answers
Есть ли способ изменить функцию, которую я должен использовать только для дочерних элементов для определенного родительского пункта меню?
Для этой цели, да, есть.
Попробуйте выполнить следующее function
(замените существующую функцию cr_get_menu_items()
):
function cr_get_menu_items($menu_location, $parent = -1)
{
$locations = get_nav_menu_locations();
$menu = get_term($locations[$menu_location], 'nav_menu');
$items = wp_get_nav_menu_items($menu->term_id);
if ( is_numeric( $parent ) && $parent >= 0 ) {
$_id = (int) $parent;
foreach ( $items as $i => $item ) {
if ( $_id !== (int) $item->menu_item_parent ) {
unset( $items[ $i ] );
}
}
}
return $items;
}
Примеры использования:
$nav = cr_get_menu_items( 'navigation_menu' ); // Get all menu items.
$nav = cr_get_menu_items( 'navigation_menu', 0 ); // Get menu items whose parent ID is 0
ОБНОВЛЕНИЕ
После того, как я перечитаю ваш вопрос, это function
, который вам, вероятно, понадобится:
// $items is the menu items array that you retrieved using `cr_get_menu_items()`,
// or other functions which return valid `nav_menu` items.
function cr_get_submenu_items( array $items, $parent ) {
$parent = (int) $parent;
$list = [];
foreach ( $items as $item ) {
if ( $parent === (int) $item->menu_item_parent ) {
$list[] = $item;
}
}
return $list;
}
ОБНОВЛЕНИЕ #2
Вот как вы бы/могли используйте cr_get_menu_items()
вместе с cr_get_submenu_items()
:
<?php $nav = cr_get_menu_items('navigation_menu') ?>
<!-- Display parent items. -->
<?php $nav = cr_get_menu_items('navigation_menu') ?>
<?php foreach ($nav as $link):
if ($link->menu_item_parent == 0) : ?>
<a class="main-nav" href="<?= $link->url ?>"><?= $link->title ?></a>
<?php endif; endforeach; ?>
<!-- Display children items. (in its own wrapper `div`/`ul`/etc.) -->
<?php $_ids = []; ?>
<?php foreach ($nav as $link):
$parent = (int) $link->menu_item_parent;
if ( 0 !== $parent && ! in_array( $parent, $_ids ) ) : ?>
<!-- This `div` is just an example wrapper. -->
<div class="menu-<?= $parent ?>-subnav">
<?php foreach ( cr_get_submenu_items( $nav, $parent ) as $clink ): ?>
<a href="<?= $clink->url ?>"><?= $clink->title ?></a>
<?php endforeach; ?>
<?php $_ids[] = $link->menu_item_parent; ?>
</div>
<?php endif; endforeach; ?>