web-dev-qa-db-fra.com

Vérifier si les éléments wp_nav_menu ont des sous-menus

Je cherche à sortir le balisage suivant pour un menu via wp_nav_menu,

<ul>
        <li><a href="/">Home</a></li>
        <li>
            <a href="/" aria-haspopup="true">Blog</a>
            <ul>
                <li><a href="/">Design</a></li>
                <li><a href="/">HTML</a></li>
                <li><a href="/">CSS</a></li>
                <li><a href="/">JavaScript</a></li>
            </ul>
        </li>
</ul>

Les éléments de menu peuvent avoir des sous-menus - si tel est le cas, le lien de niveau supérieur doit être formaté comme dans l'exemple ci-dessus. J'ai essayé différentes solutions en cherchant dans le codex mais sans succès. Il semble que j'aurai besoin de créer un lecteur pour cela, sauf si je veux ajouter un tas de requêtes (exécuter des boucles de sous-menus dans une boucle principale). Mais comme c'est un si petit changement, ne serait-il pas possible d'ajouter un crochet de filtre sur la sortie du menu?

2
Staffan Estberg

Si je comprends bien, vous voulez que les liens avec les sous-menus aient l'attribut aria-haspopup. Si cela est correct, vous devriez pouvoir le faire en utilisant le filtre nav_menu_link_attributes (WP 3.6 et supérieur). Vous pouvez également contourner la nécessité de devoir écrire un Walker personnalisé pour vérifier si un élément a des enfants en vérifiant ses classes CSS dans le filtre.

add_filter( 'nav_menu_link_attributes', 'wpse154485_add_aria_haspopup_atts', 10, 3 );
function wpse154485_add_aria_haspopup_atts( $atts, $item, $args ) {
  if (in_array('menu-item-has-children', $item->classes)) {
    $atts['aria-haspopup'] = 'true';
  }
  return $atts;
}
8
nothingtosee