Infos SaaS Web

WordPress : Créer une navigation véritablement personnalisée et la classe Walker_Nav_Menu

2 minutes de lecture

Il arrive fréquemment qu’une navigation de site web ne doive pas seulement afficher le nom de la page, mais aussi des informations y afférentes, comme la description ou l’image de la page, ou n’importe quoi d’autre… Pour en avoir le contrôle, il faut la classe Walker_Nav_Menu.

Procédure
Dans le fichier functions.php, insérez le code suivant ; il correspond au code propre à WP. Les modifications souhaitées y seront ensuite effectuées.

class Custom_Walker extends Walker_Nav_Menu{

  function start_el(&$output, $item, $depth, $args){
    
    $classes = empty ( $item->classes ) ? array () : (array) $item->classes;
    $class_names = join(" ", apply_filters("nav_menu_css_class", array_filter($classes), $item));

    ! empty ($class_names) and $class_names = " class='" . esc_attr($class_names) . "'";

    $output .= $indent . "

Que voulons-nous modifier maintenant ? Par exemple, ne pas avoir une navigation <ul><li> mais simplement des <div> pour les éléments de navigation individuels. De plus, l’image de l’article en dessous, et la description (du menu). Cela ressemblerait alors à ceci :

// Add these lines in order to fetch the additional information you wish to display

// We need the target page id in order to fetch the page image
$page = get_page_by_path(basename($item->url));
$page_id = $page->ID;
// We should check if there is an image set or not, but we are lazy for this example
$image_url = get_the_post_thumbnail( $page_id, 'custom-image-preview' );
// Same thing for the description
$description = esc_attr( $item->description );

// Remove the li
// Instead of $item_output = $args->before . "" . $args->link_before . $title . " " . $args->link_after. $args->after;
$output .= "";

// Change the output like you need it
$item_output = $args->before . "
" . $args->link_before . $title . "
" . $image_url . "
" . $args->link_after. $args->after;

Pour que cela s’affiche, l’appel de wp_nav_menu doit être modifié. Par exemple, comme ceci :

wp_nav_menu( array( 'theme_location' => 'my-custom-navigation', 
    'menu' => '', 
    'container' => 'nav', // Auto wrap navigation in <nav> area
    'container_class' => FALSE, 
    'container_id' => FALSE, 
    'menu_class' => FALSE, 
    'menu_id' => FALSE, 
    'echo' => true, 
    'fallback_cb' => 'wp_page_menu', 
    'before' => '', 
    'after' => '', 
    'link_before' => '', 
    'link_after' => '', 
    'items_wrap' => '%3$s', // Remove the ul container
    'depth' => 0, 
    'walker' => new Custom_Walker ) );