web-dev-qa-db-ja.com

最小限のメニューウォーカーはどのように見えますか?

wp_nav_menu に従って、私たちは独自のwalker関数を指定することができます。彼らはデフォルトのものをコピーして必要に応じて修正することを提案します。しかし、正直に言うと、理解するには少し複雑すぎます。

カスタムメニューウォーカーの最小限の例を教えてください。

サブメニュー項目なし、コンテナの折り返しなし、デフォルトのウォーカーによって適用されるすべてのクラスなしで、言います。もちろん1つのクラス、.current-menu-itemだけが重要です。メニュー項目のHTML要素を指定する方法も含まれる場合があります。

5
danijar

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> についての私の投稿を参照してください。

6
fuxia

ほとんどの場合は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
    )
);

彼が言い訳することを願っています;)

2
hakre