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

时间:2018-05-04 23:56:18

标签: php wordpress function menu navigation

我的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 个答案:

答案 0 :(得分:5)

  

有没有办法改变我必须吸引儿童的功能   对于特定的父菜单项?

为此目的,是的,有。

尝试以下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

以下是{/ 1}}与cr_get_menu_items()一起使用的方式:

cr_get_submenu_items()