問題描述

我正在為 wp_nav_menu 編寫一個自定義的 walker 類,並希望能夠指定 li 是否包含子選單。所以我想要我的標記是:

<li class="has_children [other-wordpress-classes]">
    <a class="parent-link">Some item</a>
    <ul class="sub-menu">

我知道如何新增和刪除課程,我只是找不到任何東西告訴我,如果當前專案有子專案。

有任何想法嗎?

提前致謝。

最佳解決方案

start_el()應該在 $args 引數中獲取此資訊,但是如果 $args 是一個陣列,則 WordPress 只會填寫此資訊,而對於自定義導航選單則是 WordPress 的一個物件。這在 a Trac ticket 中報道。但是沒有問題,您可以自己填寫,如果您還可以在自定義步行者中覆蓋 display_element()方法 (因為這是訪問子元素陣列最簡單的地方):

class WPSE16818_Walker extends Walker_Nav_Menu
{
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output )
    {
        $id_field = $this->db_fields['id'];
        if ( is_object( $args[0] ) ) {
            $args[0]->has_children = ! empty( $children_elements[$element->$id_field] );
        }
        return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

    function start_el( &$output, $item, $depth, $args ) {
        if ( $args->has_children ) {
            // ...
        }
    }

次佳解決方案

更新:從 WordPress 3.7(2013 年 10 月) 開始,新增 CSS 類以在主題選單中指示子選單項和頁面 – 無需使用自定義步行器,因為它在 WordPress 核心中處理。

CSS 類名為 menu-item-has-childrenpage_item_has_children


對於任何人匆忙的完整解決方案 (信用於 Jan Fabry 之前的答案),請參閱下面的完整實現。

輸出主題模板中的導航:

wp_nav_menu( array(
    'theme_location' => 'navigation-primary',
    'container' => false,
    'container_class' => '',
    'container_id' => '',
    'menu_class' => '',
    'menu_id' => '',
    'walker' => new Selective_Walker(),
    'depth' => 2
    )
);

然後,在主題的 functions.php 中包含以下內容:

class Selective_Walker extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
        $id_field = $this->db_fields['id'];

        if ( is_object( $args[0] ) ) {
            $args[0]->has_children = !empty( $children_elements[$element->$id_field] );
        }

        return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

    function start_el( &$output, $item, $depth, $args ) {
        if ( $args->has_children ) {
            $item->classes[] = 'has_children';
        }

        parent::start_el(&$output, $item, $depth, $args);
    }
}

生成的 HTML 輸出將類似於以下內容:

<ul>
    <li><a href="#">Home</a></li>
    <li class="has_children"><a href="#">About</a>
        <ul class="sub-menu">
            <li><a href="#">Our Mission</a></li>
        </ul>
    </li>
    <li><a href="#">Services</a></li>
    <li class="has_children"><a href="#">Products</a>
        <ul class="sub-menu">
            <li><a href="#">Lorem Ipsum</a></li>
            <li><a href="#">Lorem Ipsum</a></li>
        </ul>
    </li>
    <li><a href="#">Contact Us</a></li>
</ul>

有關使用 WordPress’walker 類的更多資訊,請參閱 Understanding the Walker Class

請享用!

參考文獻

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