2016-10-05 18 views
0

Wordpressでサブメニューを作成するにはいくつかの助けが必要です。 私はそれを使用しようとしましたwp_get_nav_menu_items Wordpressの機能。Wordpressのサブメニュー:ulの子供

私はこのPHP関数を書いています。すべてが正常に動作しますが、私の第2のレベルは私の最初のレベルと同じレベルの通りです:HTMLで

<?php 

function fp_menu($menu) { 
    global $post; 

    $last = ''; 
    $args = array(
     'order'     => 'ASC', 
     'orderby'    => 'menu_order', 
     'post_type'    => 'nav_menu_item', 
     'post_status'   => 'publish', 
     'output'     => ARRAY_A, 
     'output_key'    => 'menu_order', 
     'nopaging'    => true, 
     'update_post_term_cache' => false 
    ); 

    $items = wp_get_nav_menu_items($menu, $args); 
    if ($items != '') { 
     $nav = ''; 
     for ($i=0; $i < count($items); $i++) { 
      if ($items[$i]->object_id == $post->ID) { 
       $activeClass = 'active';} else {$activeClass = ''; 
      } 
      if ($items[$i]->type !== 'custom') { 
       $nav.= '<li class="'.$activeClass.'"><a href="'.get_permalink($items[$i]->object_id).'" target="'.$items[$i]->target.'">'.$items[$i]->title.'</a></li>'; 
      } else { 
       $nav.= '<li><a href="'.$items[$i]->url.'" target="'.$items[$i]->target.'">'.$items[$i]->title.'</a></li>'; 
      } 
     } 

     return '<ul>'.$nav.'</ul>'; 
    } 
} 

<?php echo fp_menu('main_menu'); ?> 

は、残念ながら、すべての私のliは、私は私のサブメニューを置くことができるか、同じレベルにあります

<nav class="header--nav"> 
    <ul class="header--menu"> 
     <li> 
      <a href="#">Item level 1</a> 
      <ul> 
       <li><a href="#">Item level 2</a></li> 
       <li><a href="#">Item level 2</a></li> 
       <li><a href="#">Item level 2</a></li> 
      </ul> 
     </li> 
     <li><a href="#">Item level 1</a></li> 
     <li><a href="#">Item level 1</a></li> 
    </ul> 
</nav> 
+0

もう1つのレベル(追加の「

    」と「
」タグなし)を作成できる場所に何も出力していません。それであなたは何を期待していますか? WPのWalker_Nav_Menuクラスなどを使うのではなく、なぜあなた自身で構築しようとしていますか? – CBroe

+0

@CBroe Walker_Nav_Menuクラスとは何ですか?そして、どのようにこの作品ですか? – Jandon

答えて

0
ul > li

このような構造内の項目本当に必要ですか?

Wordpressには、このような基本テンプレート用の組み込み関数、つまりwp_nav_menu()が組み込まれています。ナビゲーションをレンダリングする方法をカスタマイズするために独自のウォーカーを回転させたい場合は、広範に議論されているので、the docs for wp_nav_menuを読んでください。

あなたが本当に最初から、私は与えられたナビゲーションアイテムがサブメニューであることを起こる場合は、再帰的に呼び出すことができる別の関数にあなたのHTMLの建物のロジックを分離されることをお勧め

最も簡単な方法は、あなた自身をロールする場合。また、制御されていない再帰はかなり悪いので、無限ループを回避してナビの最大深度を決定するために、関数に制限を加える必要があります。これはあなたにその背後にあるロジックのアイデアを与えるためにテストされていないコードである

function fp_menu($menu) { 
    global $post; 

    $last = ''; 
    $args = array(
     'order'     => 'ASC', 
     'orderby'    => 'menu_order', 
     'post_type'    => 'nav_menu_item', 
     'post_status'   => 'publish', 
     'output'     => ARRAY_A, 
     'output_key'    => 'menu_order', 
     'nopaging'    => true, 
     'update_post_term_cache' => false); 

    $items = wp_get_nav_menu_items($menu, $args); 

    return build_menu($items, $post, 2); 
} 

function build_menu($items, $currentPage, $depth) { 
    if($items != '') { 
     $nav = ''; 
     for ($i=0; $i < count($items); $i++) { 
      // add active class if applicable 
      if ($items[$i]->object_id == $post->ID) { 
       $activeClass = 'active'; 
      } else { 
       $activeClass = ''; 
      } 
      // trigger recursion if submenu 
      if (($depth !== 0) && $items[$i]->children /*or whatever you call it in your data*/) { 

       $nav .= build_menu($items[$i]->children, $currentPage, $depth--); 

      } else { 
       // regular menu item 
       if ($items[$i]->type !== 'custom') { 
        $nav.= '<li class="'.$activeClass.'"><a href="'.get_permalink($items[$i]->object_id).'" target="'.$items[$i]->target.'">'.$items[$i]->title.'</a></li>'; 
       } else { 
        $nav.= '<li><a href="'.$items[$i]->url.'" target="'.$items[$i]->target.'">'.$items[$i]->title.'</a></li>'; 
       } 
      } 
     } 
     return '<ul>'.$nav.'</ul>'; 
    } 
} 

免責

:あなたは、の線に沿って何かを中断した場所にある建物。

関連する問題