この記事は公開から1年以上経過しており、内容が古くなっている可能性があります。
WordPressの外観>メニューで作ったメニューは、wp_nav_menu関数で簡単出力されます。
階層も反映されてて便利なのですが、どうしてもこの関数は実現できないことが発生したため、独自に関数を作ることにしました。
メニューをデータを取得するには、wp_get_nav_menu_itemsを使用して配列で取得します。
ただし階層構造にはなってません。
なので、以前の記事「WordPressのサイトマップを作る【プラグインなし】」を参考に、階層構造で作り直して出力します。
function my_wp_nav_menu($menu_type, $menu_item_parent = 0, $ul_use_flag = 0){
$return = "";
$menu_items = wp_get_nav_menu_items('main_navi');
$menu_trees = array();
if($menu_items){
$exist_flag = 0;
foreach($menu_items as $menu_item){
//親が引数($menu_item_parent)と同じもののみ
if($menu_item_parent == $menu_item->menu_item_parent){
if($exist_flag == 0){
if($ul_use_flag == 1) $return .= '<ul class="sub-menu">'."\r\n";
$exist_flag = 1;
}
//リンクの開き方
$target = '';
if($menu_item->target){
$target = 'target="_blank"';
}
//class
$class = 'menu-item';
if($menu_item->classes[0]){
$class .= ' '.implode(" ", $menu_item->classes);
}
//title要素
$attr_title = '';
if($menu_item->attr_title){
$attr_title = 'title="'.$menu_item->attr_title.'"';
}
$return .= '<li class="'.$class.'"><a href="'.$menu_item->url.'" '.$target.' '.$attr_title.'>'.$menu_item->title."</a>";
$return .= my_wp_nav_menu($menu_type, $menu_item->ID, 1);
$return .= '</li>'."\r\n";
}
}
if($exist_flag == 1){
if($ul_use_flag == 1) $return .= '</ul>'."\r\n";
}
}
return $return;
}
使用する場合は以下の通り
<ul>
<?php echo my_wp_nav_menu('main_navi'); ?>
</ul>
これで大体wp_nav_menu関数の標準設定と同じ挙動となります。
再帰のたびに、wp_get_nav_menu_itemsで全部取りなおすので、あんまり効率は良くないですが、とりあえずこれで改造し放題です。

コメント