WordPressのカスタムメニューはテンプレートにwp_nav_menuを使って配置するだけで
簡単に設置できるのが魅力。
こいつはバージョン3.0.0以降から追加されたとても便利なもの。
パラメータも豊富で、出力するHTMLをそれなりに制御はできるんですが
「わけのわからんClassとかなんかウゼエ」って場合にどうすんだ、というお話です。
まずはWordpress私的マニュアル様の記事で基礎を勉強。
http://elearn.jp/wpman/function/wp_nav_menu.html
ここでパラメータをある程度把握すれば配置も簡単です。
header.phpあたりに
<?php wp_nav_menu( array('menu' => 'xxx' )); ?>
と書いてやればそれでOK。
パラメータの書き方は上記を参考にしてカンマ区切りで増やしていけばOKです。
たとえば、HTML5で作ってる際はやっぱりnavで囲みたい、って時は
<?php wp_nav_menu( array('container' => 'nav' )); ?>
と書いてやればいいのです。
ただこのままだとliタグ周りにスゴイ数のclassが付くんですよね。
これはパラメータだけでは制御できないので、function.phpで
カスタムメニューの表示方法を再定義する、という方法を見つけました。
まずはfunctiom.phpに
class My_Walker_Nav_Menu extends Walker_Nav_Menu { // ※ここにカスタマイズを書き込んでいく。 } add_filter( 'wp_nav_menu_args', 'my_nav_menu_args' ); function my_nav_menu_args( $args ) { $args = (object) $args; $args->walker = new My_Walker_Nav_Menu; return $args; }
と最後尾にでも書き込みます。
で、今回はwp_nav_menuの表示方法を変えてみます。
カスタムメニューの中のliタグのクラスを排除して、
中のaタグにカテゴリIDを付加したmmneuというIDを出力する方法です。
function start_el(&$output, $item, $depth, $args) { global $wp_query; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = ' class="' . esc_attr( $class_names ) . '"'; $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args ); $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '<li>'; //liタグの出力をシンプルにします。 $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; $item_output = $args->before; //ここ以下でaタグの出力をカスタマイズします。 $item_output .= '<a id="mmenu'. $item->ID .'" ' . $attributes .'>'; $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after; $item_output .= '</a>'; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }
という記述を、さっきの// ※ここにカスタマイズを書き込んでいく。って所に書き加えると
liタグの中のaタグのIDにmmenu○○というカテゴリIDが入ったものが出力されます。
文字置き換えメニューで背景画像をjQueryで制御する場合なんかは便利ですね。
今回、参考になったのはこちらのサイトです。
http://d.hatena.ne.jp/deepskyblue/20110412/p1
(これで次回、同じ作業する時には忘れなくて安心です)