web-dev-qa-db-fra.com

wp_nav_menu - nom du modèle de page en tant que classe d'élément

Est-il possible d'afficher le nom du modèle (ou le nom du fichier page-template.php) dans la classe de chaque élément de menu? Peut-être en utilisant wp_nav_menu walker?

Plus précisément, j'utilise l'appel de menu standard:

wp_nav_menu( array( 'menu' => 3, 'container' => false )

Ce qui me donne:

<div class="menu-wrap">
<ul id="menu-menu" class="menu">
<li id="menu-item-979" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-979"><a href="#">Homepage</a></li>
<li id="menu-item-844" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-844"><a href="#">Subpage</a></li>
</ul>
</div>

Et si j'ai des noms de modèles Page d'accueil et Sous-page, j'aimerais obtenir les mêmes, mais avec les classes de noms de modèles:

<div class="menu-wrap">
<ul id="menu-menu" class="menu">
<li id="menu-item-979" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-979 Homepage"><a href="#">Homepage</a></li>
<li id="menu-item-844" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-844 Subpage"><a href="#">Subpage</a></li>
</ul>
</div>

Merci!

1
Adam

Le filtre nav_menu_css_class vous permettra d’ajouter des classes CSS à des éléments de menu spécifiques. Nous combinons cela avec la fonction get_page_template_slug pour extraire le nom de fichier du modèle de page, puis nous l’utilisons avec la méthode get_page_templates de la classe theme pour obtenir le nom du modèle tel que défini dans l’en-tête Template Name:. Ensuite, nous passons ce résultat via sanitize_html_class pour en faire un nom de classe valide. Enfin, nous l'ajoutons au tableau de classes et le renvoyons.

function wpd_page_template_nav_class( $classes, $item ) {
    // only check pages
    if( 'page' == $item->object ){
        // if this page has a template assigned
        if( $slug = get_page_template_slug( $item->object_id ) ){
            // get the array of filenames => template names in the current theme
            $templates = wp_get_theme()->get_page_templates();
            // if there is a template with key matching our filename
            if( isset( $templates[$slug] ) ){
                // sanitize it and add it to the classes
                $classes[] = sanitize_html_class( $templates[$slug] );
            }
        }
    }
    return $classes;
}
add_filter( 'nav_menu_css_class', 'wpd_page_template_nav_class', 10, 2 );
1
Milo