WordPress 菜单:单击父菜单项时,仅显示该链接的子导航子项

Posted

技术标签:

【中文标题】WordPress 菜单:单击父菜单项时,仅显示该链接的子导航子项【英文标题】:WordPress Menu: On click of parent menu item, only display sub navigation children of that link 【发布时间】:2018-10-15 12:02:35 【问题描述】:

我的 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。

有没有办法改变我必须为特定父菜单项仅拉入子项的功能?任何帮助/指导表示赞赏。

【问题讨论】:

你必须检查db_idmenu_item_parent 【参考方案1】:

有没有办法改变我必须拉入独生子女的功能 对于特定的父菜单项?

为此,是的,有。

试试下面的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; ?>

【讨论】:

以上是关于WordPress 菜单:单击父菜单项时,仅显示该链接的子导航子项的主要内容,如果未能解决你的问题,请参考以下文章

单击主菜单项的jQuery不会显示子子菜单

Wordpress 3.5 - 如何仅使用 wp_nav_menu 显示父级的子菜单?

我们如何在单击菜单条项时突出显示活动菜单项?

使 WordPress Bootstrap 菜单顶部链接不是链接

单击其他菜单项时隐藏当前子菜单

Wordpress 子菜单 Jquery 不起作用