wp_nav_menu
に従って、私たちは独自のwalker関数を指定することができます。彼らはデフォルトのものをコピーして必要に応じて修正することを提案します。しかし、正直に言うと、理解するには少し複雑すぎます。
カスタムメニューウォーカーの最小限の例を教えてください。
サブメニュー項目なし、コンテナの折り返しなし、デフォルトのウォーカーによって適用されるすべてのクラスなしで、言います。もちろん1つのクラス、.current-menu-item
だけが重要です。メニュー項目のHTML要素を指定する方法も含まれる場合があります。
this one のように非常に単純なwalkerを作成できます。現在のアイテムを検出するには、$item->current
を調べます。現在のアイテムに対してのみTRUE
です。
私はクラスを追加するつもりはありませんが、無駄なリンクを完全に無効にするのです。
例:
class One_Line_Walker extends Walker
{
public function walk( $elements, $max_depth )
{
$list = array ();
foreach ( $elements as $item )
{
if ( $item->current )
$list[] = "<b title='You are here'>$item->title</b>";
else
$list[] = "<a href='$item->url'>$item->title</a>";
}
return join( "\n", $list );
}
}
あなたのテーマでは、このようなウォーカーを使用してください。
wp_nav_menu(
array (
'theme_location' => 'your_theme_location',
'walker' => new One_Line_Walker,
'container' => '',
'items_wrap' => '<p>%3$s</p>',
'depth' => 1
)
);
items_wrap
についての説明は <p>%3$s</p>
についての私の投稿を参照してください。
ほとんどの場合はWalker::walk()
メソッドにフックするだけでよく、そのような場合はCallback_Walker
でそれを実行できます。これにより、コールバックを登録できます。
クロージャと最新のPHPバージョン(> = 5.4)を利用すると、 Closure::bind()
の利点が得られます。
class Callback_Walker extends Walker {
private $callback = $callback;
public static function create( $callback ) {
return new self( $callback );
}
public function __construct( $callback, $bindClosure = TRUE ) {
$this->callback = $callback;
if ( $bindClosure and $callback instanceof Closure ) {
Closure::bind( $callback, $this, __CLASS__ )
}
}
function walk( $elements, $max_depth ) {
return $this->callback
? call_user_func( $this->callback, $elements, $max_depth )
: parent::walk( $elements, $max_depth );
}
}
これだけではこれまでのところ何もしませんが、@ toschoによる例をあからさまにコピーして、これがどのように使われることができるかです:
wp_nav_menu(
array (
'theme_location' => 'your_theme_location',
'walker' => Callback_Walker::create( function( $elements, $max_depth )
{
$list = array();
foreach ( $elements as $item )
{
$list[] = $item->current
? "<b title='You are here'>{$item->title}</b>"
: "<a href='{$item->url}'>{$item->title}</a>";
}
return join( "\n", $list );
} ),
'container' => '',
'items_wrap' => '<p>%3$s</p>',
'depth' => 1
)
);
彼が言い訳することを願っています;)