Aggiungi un menu a discesa usando "add_filter => wp_nav_menu_items" in WordPress
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.

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.
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:

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

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

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.
