Aggiungere una voce di menu personalizzata usando il filtro wp_nav_menu_items
Ho aggiunto uno snippet per aggiungere un link "Profilo" al menu di navigazione del mio sito. Il mio codice:
add_filter( 'wp_nav_menu_items', 'my_nav_menu_profile_link');
function my_nav_menu_profile_link($menu) {
if (!is_user_logged_in()){
return $menu;
} else {
$user_data = bbp_get_user_profile_url( get_current_user_id() );
$profilelink = '<li><a href="'.$user_data.'&edit" >Profilo</a></li>';
$menu = $menu . $profilelink;
return $menu;
}
}
Questo codice visualizza correttamente il link del profilo nel mio menu, ma ora voglio spostare questo link "profilo" come sottomenu di un altro menu principale.
La struttura del mio menu è la seguente:
Home | Il Mio Account | Categorie
Vorrei aggiungere il link "profilo" sotto "Il Mio Account". Qualche suggerimento per risolvere questo problema?
Ho creato queste due funzioni che puoi utilizzare per aggiungere elementi personalizzati a un elemento del menu presente nel tuo menu (pagina, articolo, link...).
Nel tuo caso, puoi aggiungere queste funzioni al tuo file functions.php e chiamarle in questo modo:
$menu_name = 'Nome del tuo menu';
$name_of_menu_item_to_append_to = 'Il mio Account';
$id_of_menu_item_to_append_to = get_wp_object_id( $name_of_menu_item_to_append_to, 'nav_menu_item' );
$new_submenu_item = array(
'text' => 'Profilo',
'url' => 'http://qualcheurl.com'
);
add_subitems_to_menu(
$menu_name,
$id_of_menu_item_to_append_to,
array( $new_submenu_item )
);
add_subitems_to_menu()
/**
* Aggiunge elementi personalizzati a un menu di navigazione
* Basato parzialmente su:
* http://teleogistic.net/2013/02/dynamically-add-items-to-a-wp_nav_menu-list/
*
* @param string $menu_name Il nome o slug del menu di navigazione
* @param int $parent_object_id L'ID del post/pagina, che deve essere presente
* nel menu, e a cui vogliamo aggiungere sotto-elementi
* @param array $subitems Gli sotto-elementi da aggiungere al menu, come
* array( array( 'text' => 'foo', 'url' => '/bar') )
*/
public function add_subitems_to_menu( $menu_name, $parent_object_id, $subitems ) {
// Non aggiungere nulla nell'area di amministrazione. Altrimenti WP proverà a visualizzare gli elementi
// nell'editor del menu e non funzionerà correttamente, causando comportamenti strani
if ( is_admin() ) {
return;
}
// Utilizza il filtro wp_get_nav_menu_items, usato da Timber per ottenere gli elementi del menu WP
add_filter( 'wp_get_nav_menu_items', function( $items, $menu )
use( $menu_name, $parent_object_id, $subitems ) {
// Se nessun menu trovato, restituisce gli elementi senza aggiungere nulla
if ( $menu->name != $menu_name && $menu->slug != $menu_name ) {
return $items;
}
// Trova l'ID dell'elemento del menu corrispondente all'ID dell'oggetto post/pagina dato
// Se nessun post/pagina trovato, i sotto-elementi non avranno alcun genitore (saranno al 1° livello)
$parent_menu_item_id = 0;
foreach ( $items as $item ) {
if ( $parent_object_id == $item->object_id ) {
$parent_menu_item_id = $item->ID;
break;
}
}
$menu_order = count( $items ) + 1;
foreach ( $subitems as $subitem ) {
// Crea oggetti contenenti tutte (e solo) quelle proprietà da WP_Post
// usate da WP per creare un elemento del menu
$items[] = (object) array(
'ID' => $menu_order + 1000000000, // ID che WP non utilizzerà
'title' => $subitem['text'],
'url' => $subitem['url'],
'menu_item_parent' => $parent_menu_item_id,
'menu_order' => $menu_order,
// Questi non sono necessari, ma verrà generato un warning PHP se non definiti
'type' => '',
'object' => '',
'object_id' => '',
'db_id' => '',
'classes' => '',
);
$menu_order++;
}
return $items;
}, 10, 2);
}
get_wp_object_id()
/**
* Restituisce l'ID WordPress di qualsiasi tipo di post o pagina tramite il suo titolo o nome
* Nel caso in cui venga fornito un ID, lo "validerà" cercando qualsiasi post con quell'ID
*
* @param mixed $post_identifier Il titolo, nome o ID del post/pagina
* @param string $post_type Il tipo di post da cercare (default: page)
*
* @return int L'ID del post/pagina se trovato, altrimenti 0
*/
public function get_wp_object_id( $post_identifier, $post_type = 'page' ) {
$post_id = 0;
if ( get_page_by_title( $post_identifier, OBJECT, $post_type ) ) {
$post_id = get_page_by_title( $post_identifier, OBJECT, $post_type )->ID;
}
else if ( get_page_by_path( $post_identifier, OBJECT, $post_type ) ) {
$post_id = get_page_by_path( $post_identifier, OBJECT, $post_type )->ID;
}
else if ( get_post( $post_identifier ) ) {
$post_id = get_post( $post_identifier )->ID;
}
return $post_id;
}

Grazie MikO per il tuo aiuto
-
Il mio Account non è una pagina, ho creato un link e l'ho aggiunto al menu attraverso le impostazioni del menu di wp admin
-
Ho verificato il tuo codice creando una nuova pagina e passando il suo id alla funzione, ma non ha funzionato per me
-
Ho cambiato la riga $my_account_page_id = in
$my_account_item_id

Ohh Miko, ora funziona, grazie mille per il codice..
Ma invece di usare l'id della pagina, vorrei aggiungere Profilo sotto un link, che ho creato nelle impostazioni del menu di wp admin

Nessun problema, ho ottenuto l'ID dell'elemento del menu personalizzato controllando nel database
Quindi è risolto, grazie ancora

@Hafsal, prego. Ho modificato la mia risposta aggiungendo un'altra funzione, che puoi usare per ottenere l'ID di qualsiasi pagina, articolo o voce di menu di WordPress, e ho aggiornato il modo in cui dovresti chiamare queste funzioni. Altrimenti, puoi controllare direttamente l'ID nel database come hai fatto...
