web-dev-qa-db-fra.com

L'ajout par programme d'éléments de menu est répliqué dans plusieurs menus

J'ai le code suivant:

add_filter( 'wp_nav_menu_objects', 'dynamically_add_shop_categories_to_submenu' );
function dynamically_add_shop_categories_to_submenu( $items ) {        
    $taxonomy_name = array( 
        'shop-category'
    );                
    $args = array(
        'orderby'    => 'name', 
        'order'      => 'ASC',
        'hide_empty' => true, 
        'fields'     => 'all', 
        'exclude'    => '160',
    );
    $terms = get_terms( $taxonomy_name, $args );
    $base = 'http://' . $_SERVER['HTTP_Host'] . '/businesses/';
    $bc = '&shop-category=';
    $bt = '?business-type=shops';             
    foreach ( $terms as $term ) {
        $shops = array (
            'title'            => $term->name,
            'menu_item_parent' => 1157,
            'ID'               => '',
            'db_id'            => '',
            'url'              => $base . $bt . $bc . $term->slug
        );        
        $items[] = (object) $shops;
    }
    return $items;    
}

Ceci ajoute avec succès des éléments de sous-menu de la taxonomie de "catégorie de magasin" à un menu de niveau supérieur avec l'ID 1157. Cela fonctionne comme prévu.

Il y a plus de menus de niveau supérieur qui ne sont pas affectés par cela, ce qui est correct, car nous avons uniquement spécifié ces éléments à ajouter au menu 1157.

Cependant, au bas de notre site, nous avons trois autres menus, auxquels sont ajoutés ces sous-menus. Pourquoi le code fait-il cela? Les menus ne semblent pas avoir d'identifiant, alors comment pouvons-nous modifier le code pour les exclure?

2
pixelkicks

Vous pouvez utiliser le deuxième argument d'entrée $args pour cibler le menu spécifique.

Voici un exemple avec quelques vérifications que vous pouvez adapter à vos besoins:

add_filter( 'wp_nav_menu_objects', function( $sorted_menu_items, $args )
{
    if( 
           'primary' === $args->theme_location   // Alternative
        && 'some_menu_slug' === $args->menu->slug  // Alternative
    ) {
        // Your stuff here ...
    }
    return $sorted_menu_items;
}, 10, 2 );

Lorsque nous ajoutons un élément de menu, une nouvelle ligne est créée dans la table wp_posts. C'est l'ID dont vous parlez. Lorsque nous le supprimons et que nous l'ajoutons à nouveau, nous obtenons un nouvel identifiant. Il serait donc préférable de cibler l'emplacement du thème de menu ou le slug de menu au lieu.

Lorsque vous ajoutez les éléments de menu personnalisés dans votre exemple et que le menu_item_parent n'existe pas, il doit être ajouté au menu en tant qu'élément avec menu_item_parent = 0.

2
birgire