Aggiungi un menu a discesa usando "add_filter => wp_nav_menu_items" in WordPress

23 mag 2017, 20:53:47
Visualizzazioni: 3.98K
Voti: 1

Il mio progetto: Wordpress, Woocommerce, Bootstrap 4, bs4navwalker

Il mio problema: Aggiungere un elemento dropdown personalizzato tramite filtro WP. Ho una navbar con 3 menu diversi (usando bs4navwalker), un badge per il carrello e un modulo di ricerca. Vedi codice.

Sto usando un filtro (add_filter('wp_nav_menu_items',) per aggiungere login, logout e dettagli dell'account nella mia navbar, tutto funziona, ma vorrei inserire questi elementi in un dropdown. Il filtro crea semplicemente uno o due elementi aggiuntivi nel menu 'user'.

Capisco che questo accade perché sto aggiungendo un <li>, ma non riesco a capire come aggiungere tutto il codice necessario a Bootstrap per gestire il dropdown.

È possibile?

CODICE front-page.php

<div class="nav-custom">
  <div class="container">
    
      <nav class="navbar-nav navbar-toggleable-sm navbar-inverse">
        
        <a class="navbar-brand" href="<?php echo get_home_url(); ?>">
              <img src="<?php bloginfo('template_url'); ?>/img/logo.png" class="d-inline-block align-top" alt="Logo del sito" title="Logo del sito">
        </a>

           <?php
           wp_nav_menu([
             'menu'            => 'top',
             'theme_location'  => 'top',
             'container'       => false,
             'container_id'    => 'bs4navbar',
             'container_class' => 'collapse navbar-collapse',
             'menu_id'         => false,
             'menu_class'      => 'navbar-nav mr-auto no-md-view',
             'depth'           => 2,
             'fallback_cb'     => 'bs4navwalker::fallback',
             'walker'          => new bs4navwalker()
           ]);
          ?>
        
        <!-- Form di ricerca -->
        <?php get_product_search_form(); ?>

        <!-- Menu Utente -->
        <?php 
          wp_nav_menu([
           'menu'            => 'user',
           'theme_location'  => 'user',
           'container'       => false,
           'menu_id'         => false,
           'menu_class'      => 'navbar-nav mr-auto no-md-view',
           'depth'           => 2,
           'fallback_cb'     => 'bs4navwalker::fallback',
           'walker'          => new bs4navwalker()
         ]);
        ?>

        <!-- Menu Carrello -->
        <?php 
          wp_nav_menu([
           'menu'            => 'Cart',
           'theme_location'  => 'Cart',
           'container'       => false,
           'menu_id'         => false,
           'menu_class'      => 'navbar-nav mr-auto',
           'depth'           => 2,
           'fallback_cb'     => 'bs4navwalker::fallback',
           'walker'          => new bs4navwalker()
         ]);
        ?>
        
        <!-- codice per il badge INIZIO -->
        <?php
        if ( WC()->cart->get_cart_contents_count() !== 0 ) {
          ?>  
          <span class="badge badge-pill badge-warning no-md-view">
            <a class="cart-customlocation" href="<?php echo wc_get_cart_url(); ?>" title="<?php _e( 'Visualizza il tuo carrello' ); ?>"><?php echo sprintf ( _n( '%d articolo', '%d articoli', WC()->cart->get_cart_contents_count() ), WC()->cart->get_cart_contents_count() ); ?></a>
          <?php 
        }
        ?>
        </span>
    </nav>
  </div>
</div>

CODICE functions.php

<?php

add_filter( 'wp_nav_menu_items', 'my_account_loginout_link', 10, 2 );
/**
 * Aggiungi link di Login/Logout Account WooCommerce al Menu
 * 
 * @see https://support.woothemes.com/hc/en-us/articles/203106357-Add-Login-Logout-Links-To-The-Custom-Primary-Menu-Area
 */
function my_account_loginout_link( $items, $args ) {
    if (is_user_logged_in() && $args->theme_location == 'user') { //modifica la posizione del menu in base alle tue esigenze

        $items .= '                 
                    <li><a class="nav-link" href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">I miei Dati</a></li>
                    <li><a class="nav-link" href="'. wp_logout_url( get_home_url() ) .'">Esci</a></li>
                    '; //modifica il link di logout, qui va a 'shop', potresti volerlo indirizzare a 'myaccount'
    }
    elseif (!is_user_logged_in()  && $args->theme_location == 'user') {//modifica la posizione del menu in base alle tue esigenze
        
        $items .= '<li><a class="nav-link" href="' . get_permalink( wc_get_page_id( 'myaccount' ) ) . '">Accedi</a></li>';
    }
    return $items;
}

Risultato

Come puoi vedere, l'elemento è stato aggiunto nel mio menu utente (icona utente + Accedi), ma non come Dropdown.

Menu utente WordPress con voce Accedi

1
Commenti

Potresti voler verificare una strategia che prevede l'aggiunta di elementi come oggetti invece che come HTML: https://teleogistic.net/2013/02/11/dynamically-add-items-to-a-wp_nav_menu-list/

brianjohnhanna brianjohnhanna
23 mag 2017 21:50:20
Tutte le risposte alla domanda 1
3

Penso che questo faccia quello che stai cercando di ottenere. Fondamentalmente, in questo modo ti agganci prima che l'HTML venga generato per aggiungere le tue voci di menu. Non ho avuto modo di testarlo, ma dovrebbe funzionare.

MODIFICA: Dato che vuoi averlo sotto un menu a discesa, devi impostare il menu_item_parent. Se la voce del menu dell'icona utente rimarrà statica, puoi ottenere l'ID della voce di menu guardando il codice sorgente di quella voce e prendendo il numero che segue menu-item- nell'ID.

Descrizione dell'immagine qui

Ad esempio, in questo caso 103191 è l'ID della voce di menu (nota che questo non è lo stesso dell'oggetto/post/pagina/CPT/ecc a cui punta una voce di menu).

function my_account_loginout_link( $items, $menu, $args ) {
    if ( $args->theme_location !== 'user' ) {
        return $items;
    }

    if ( is_user_logged_in() ) {
        $added_menu_items = array(
            array(
                'title' => 'I miei dati',
                'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
            ),
            array(
                'title' => 'Esci',
                'url' => wp_logout_url( get_home_url() )
            )
        );
    } else {
        $added_menu_items = array(
            array(
                'title' => 'Accedi',
                'url' => get_permalink( wc_get_page_id( 'myaccount' ) )
            )
        );
    }

    $parent_menu_id = 103191;
    $menu_order = count( $items ) + 1;
    foreach ( $added_menu_items as $added_item ) {
        $nav_menu_item = new stdClass;
        $nav_menu_item->menu_item_parent = $parent_menu_id;
        $nav_menu_item->url = $added_item['url'];
        $nav_menu_item->title = $added_item['title'];
        $nav_menu_item->menu_order = $menu_order;
        $items[] = $nav_menu_item;
        $menu_order++;
    }
    return $items;
}
add_filter( 'wp_get_nav_menu_items', 'my_account_loginout_link', 10, 3 );

Adattato da:

23 mag 2017 22:09:14
Commenti

Ciao, grazie per la risposta. Lo apprezzo davvero. Ma non ha funzionato bene. Gli elementi sono stati aggiunti, ma non nel posto giusto. Ho fatto qualcosa di sbagliato. Dopo di che, ho deciso di spiegare un po' di più sul mio progetto. Forse puoi aiutarmi a sistemarlo. Vedi la modifica. Grazie @brianjohnhanna

Állan Fidelis Toledo Állan Fidelis Toledo
24 mag 2017 14:35:11

Ho aggiunto una modifica, fammi sapere se questo aiuta a risolvere il tuo problema

brianjohnhanna brianjohnhanna
24 mag 2017 22:03:23

Grazie ancora, ma non ha funzionato. La prima volta, non è successo nulla. Confrontando l'altro menu con una struttura simile, poiché non ha un Dropdown, la classe non era presente neanche lì. Ho aggiunto un elemento solo per cambiare lo stato, ma non è apparso nulla. A proposito, il menu_id è 106.

Állan Fidelis Toledo Állan Fidelis Toledo
25 mag 2017 05:44:53