問題描述

我嘗試將導航分割成 3 個單一導航欄 (1 級,2 級和 3 級) 。三是因為它們在網站上分開,並且只能根據當前頁面顯示。

-0-------1--------2-------3+- level/depth
Home
 |
 |___ Lobby
 |
 |___ Projects
 |       |___ Project A
 |       |       |___ Review
 |       |       |___ Comments
 |       |       ____ Download
 |       ____ Project B
 |               |___ Review
 |               |___ Comments
 |               ____ Download
 |___ Blog
 |
 ____ About
         |___ Legal
         ____ Contact

包含級別 1 的第一個導航欄始終可見。第二個導航欄 (2 級) 只有當 im 當前在相應的父頁面上。第三個導航欄 (3 級以上,加上因為此導航欄還將包含 3 級的子頁面和子頁面…) 也是如此。

簡而言之:我想在他們的導航欄中顯示所有的父選單,只顯示當前頁面的直接子項。

我試過的

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;
    $args['echo'] = false;

    add_filter( 'wp_get_nav_menu_items' , 'my_nav_menu_filter' , 666 , 3 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_nav_menu_filter' , 666 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

function my_nav_menu_filter( $items , $menu , $args )
{
    //var_dump( $args );

    $navLevel = isset( $args['navlevel'] ) ? (int)( $args['navlevel'] ) : 0;

    //echo 'navlevel = ' . $args['navlevel'] . ' | ' . $navLevel;

    if( $navLevel == 1 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }
    }
    else if( $navLevel == 2 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent == 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else if( $navLevel == 3 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent != 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else
    {
        //var_dump( $items );
    }

    return $items;
}

在我的 header.php 中呼叫它:<?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>

但是,$args 設定為預設值,我的自定義條目 navlevel 不會顯示在過濾器中。

如何按照描述分割導航欄?如何設定自定義 $args -entry?

最佳解決方案

我想我得到了答案:

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;

    $args['echo'] = false;

    add_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100 , 2 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100, 2 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

這是一個訣竅:讓我改變 menuitems 和自定義 args 仍然可用。我不小心把過濾器連線到 wp_get_nav_menu_items 而不是 wp_nav_menu_objects 。我仍然有過濾問題,但這些可能是一些邏輯錯誤。

編輯:我將透過將導航欄 2 級和導航欄級別 3+組合成一個並將其與 css 分離來解決我的問題

繼承目前的 php 部分:

function serthy_filter_nav_menu( $items , $args )
{
    $argArray = (array)( $args );

    if( isset( $argArray['toplevel'] ) )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }

        return $items;
    }

    global $post;

    $arr = array();

    foreach( $items as $key => $item )
    {
        $parentIDs = get_post_ancestors( $item->ID );

        foreach( $parentIDs as $i => $parentID )
        {
            if( $parentID == $post->ID )
            {
                array_push( $arr , $item );

                break;
            }
        }
    }

    return $arr;
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。