web-dev-qa-db-fra.com

À quoi ressemble un marcheur de menu minimal?

Selon les docs de wp_nav_menu , nous pouvons spécifier notre propre fonction de déambulateur. Ils suggèrent de copier celui par défaut et de le modifier si nécessaire. Mais pour être honnête, c'est un peu trop compliqué à comprendre.

Pourriez-vous s'il vous plaît fournir un exemple minimal de menu personnalisé?

Dites, sans éléments de sous-menu, sans conteneur d'habillage, sans toutes les classes appliquées par le marcheur par défaut. Une seule classe, le .current-menu-item est important, bien sûr. Un moyen de spécifier l'élément HTML des éléments de menu peut également être inclus.

5
danijar

Vous pouvez créer un marcheur très simple, comme celui-ci . Pour détecter l'élément actuel, inspectez $item->current. Il s'agit de TRUE pour l'élément en cours uniquement.

Je n’ajouterais pas de classe, mais désactiverais complètement le lien inutile, car il ne doit pas être cliquable de toute façon.

Exemple:

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 );
    }
}

Dans votre thème, utilisez le marcheur comme ceci:

wp_nav_menu(
    array (
        'theme_location'  => 'your_theme_location',
        'walker'          => new One_Line_Walker,
        'container'       => '',
        'items_wrap' => '<p>%3$s</p>',
        'depth'           => 1
    )
);

Voir mon article sur items_wrap pour une explication de <p>%3$s</p>.

6
fuxia

La plupart du temps, vous n'avez besoin que de vous connecter à la méthode Walker::walk(). Dans ce cas, un Callback_Walker peut le faire, ce qui vous permet d'enregistrer un rappel.

Si vous utilisez des fermetures et une version moderne de PHP (> = 5.4), vous pouvez profiter des avantages de 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 );
    }
}

Cela seul ne fait rien jusqu'à présent, mais copier de manière flagrante l'exemple de @toscho, voici comment cela pourrait être utilisé:

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
    )
);

J'espère qu'il peut excuser;)

2
hakre