web-dev-qa-db-ja.com

Wp_get_nav_menu_items()を使用して子ページの子をリストする

私は創世記ベースのテーマで働いています、そして私はPage/Child Pageメニュー構造を構築したいです。その部分は、Bill Ericksonによって作成されたコードの助けを借りて行うことができます。

基本的に私がやろうとしているのは、子ページを持つページのコンテンツの上にメニューを作成することです。それから、左側のサイドバーで、子供のいる子供のページのナビゲーションをします。私はここで何か設定を持っています: sandbox.digisavvy.com

これが私が開発しているコードです。

<?php

/**
 * Section Menu
 * Displays the subpages of the current section
 *
 * @author Bill Erickson
 * @link http://www.billerickson.net/custom-secondary-menu
 */
function be_section_menu() {

    // Only run on pages
    if( !is_page() )
        return;

    // If top level page, use current ID; else use highest ancestor
    global $post;
    $section_id = empty( $post->ancestors ) ? $post->ID : end( $post->ancestors );

    // Get all the menu locations
    $locations = get_nav_menu_locations();
    // Find out which menu is in the 'primary' location
    $menu = wp_get_nav_menu_object( $locations[ 'primary' ] );
    // Grab all menu items in this menu that have a parent of the current section.
    // This grabs the subpages, assuming the current section is a top level page
    $menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_parent' => $section_id ) );
    // If there are menu items, build the menu
    if( !empty( $menu_items ) ) {
        echo '<ul class="section-submenu">';
        $first = true;
        foreach( $menu_items as $menu_item ) {
            $classes = 'page-item';
            // This adds a class to the first item so I can style it differently
            if( $first )
                $classes .= ' first-menu-item';
            $first = false;
            // This marks the current menu item
            if( get_the_ID() == $menu_item->object_id )
                $classes .= ' current_page_item';
            echo '<li class="' . $classes . '"><a href="' . $menu_item->url . '">' . $menu_item->title . '</a></li>';
        }
        echo '</ul>';
    }

}
add_action( 'genesis_before_loop', 'be_section_menu' );

私が達成したいと思う次の部分はChild Page/Child of Child Pageでメニューシステムを作成することです。それは私が立ち往生している部分です。以下のこのコードは変更として提案されていますが、うまくいくことはありません。それはただナビゲーションに子供の子供たちを追加するだけです。

global $post;
$level = count( $post->ancestors );
// Only build tertiary menu if current page is at least third level
if( 1 > $level )
    return;
$section_id = $post->ancestors[$level - 2];
5
Alex V.

まあ、私はこれまでにコードを解決しなかったことを恐れています。私が見つけたのは私がやりたいことを達成するプラグインのペアです。現在のサブページ/子/孫ページと同じレベルのサブページを一覧表示し、特定のページを表示から除外することができます。

これらを組み合わせることを検討してください。

1
Alex V.

私はちょうどこれを書いた: https://Gist.github.com/vwasteels/874f7d08726076bdc580

それは再帰的に取得し、各項目に埋め込まれた子を持つ配列を生成します。これは任意の深さのメニューで機能します。

0