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