web-dev-qa-db-fra.com

Ajouter une classe d'ID de page aux éléments de menu de navigation

J'aimerais ajouter des classes contenant les numéros d'identification de page aux éléments <li> du menu de navigation. Des classes similaires sont générées par wp_page_menu() mais, pour une raison quelconque, elles ne sont pas générées par wp_nav_menu().

Je pensais que je pourrais peut-être utiliser la fonctionnalité "walker" (que je viens juste de découvrir) pour ajouter une classe personnalisée aux balises <li> et utiliser get_post_meta( $item->ID, '_menu_item_object_id', true ); pour obtenir les numéros d'identification, mais le temps est compté pour moi. comment le faire. Tout le monde sur les divers forums semble avoir des questions sur l'utilisation de la classe de promeneur pour les sous-menus, etc., et j'ai essayé divers codes de mes recherches mais rien ne fonctionne. J'ai juste besoin d'une classe personnalisée avec l'ID de page dans chaque balise <li>.

Mon code de menu actuel est la base:

function abdmenu_nav()
{
wp_nav_menu(
array(
    'theme_location'  => 'header-menu',
    'menu'            => '',
    'container'       => 'div',
    'container_class' => 'menu-{menu slug}-container',
    'container_id'    => '',
    'menu_class'      => 'menu',
    'menu_id'         => '',
    'echo'            => true,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'items_wrap'      => '<ul>%3$s</ul>',
    'depth'           => 0,
    'walker'          => ''
    )
);
}

Je suis sûr que c'est plus simple que je le fais mais je n'ai jamais eu affaire à la classe de marcheur auparavant. Je ne peux même pas trouver si c'est nécessaire pour ce que j'essaie de faire. Si c'est le cas, comment pourrais-je le configurer?

2
Shoelaced

Nous pouvons ajouter des classes personnalisées classes de menu de navigation via le filtre nav_menu_css_class .

Exemple:

Les éléments suivants doivent ajouter la classe CSS wpse-object-id-{object_id} aux balises <li>:

// Add filter
add_filter( 'nav_menu_css_class', 'wpse_menu_item_id_class', 10, 2 ); 

// Your navigational menu
wp_nav_menu( $args );

// Remove filter
remove_filter( 'nav_menu_css_class', 'wpse_menu_item_id_class', 10, 2 );

où nous définissons le rappel de filtre comme:

/**
 * Custom Nav Menu Class For Page ID
 */
function wpse_menu_item_id_class( $classes, $item )
{
    if( isset( $item->object_id ) )
        $classes[] = sprintf( 'wpse-object-id-%d', $item->object_id );

    return $classes;
}

Ici, l'attribut object_id devrait nous donner l'identifiant de page/post correspondant.

Nous pouvons voir que cet attribut provient de la fonction wp_setup_nav_menu_item() core:

$menu_item->object_id = ! isset( $menu_item->object_id ) 
    ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) 
    : $menu_item->object_id;
4
birgire