Adăugare element personalizat în meniu folosind filtrul wp_nav_menu_items
Am adăugat un fragment de cod pentru a adăuga un link "Profil" în meniul de navigare al site-ului meu. Codul meu:
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" >Profil</a></li>';
$menu = $menu . $profilelink;
return $menu;
}
}
Acest cod afișează corect linkul către profil în meniul meu, dar acum vreau să mut acest link "profil" ca submeniu al unui alt meniu principal.
Structura meniului meu este următoarea:
Acasă | Contul Meu | Categorii
Aș dori să adaug linkul "profil" sub "Contul Meu". Aveți vreo sugestie pentru a rezolva această problemă?
Am creat aceste două funcții pe care le poți folosi pentru a adăuga elemente personalizate la un anumit element din meniu (pagină, articol, link...).
În cazul tău, poți adăuga aceste funcții în functions.php și le poți apela astfel:
$menu_name = 'Numele Meniului Tău';
$name_of_menu_item_to_append_to = 'Contul Meu';
$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' => 'Profil',
'url' => 'http://adresawebsite.com'
);
add_subitems_to_menu(
$menu_name,
$id_of_menu_item_to_append_to,
array( $new_submenu_item )
);
add_subitems_to_menu()
/**
* Adaugă elemente personalizate la un meniu de navigare
* Parțial bazat pe:
* http://teleogistic.net/2013/02/dynamically-add-items-to-a-wp_nav_menu-list/
*
* @param string $menu_name Numele sau slug-ul meniului de navigare
* @param int $parent_object_id ID-ul postului/paginii, care trebuie să fie prezent
* în meniu și căruia vrem să adăugăm subelemente
* @param array $subitems Subelementele de adăugat în meniu, sub forma
* unui array( array( 'text' => 'foo', 'url' => '/bar') )
*/
public function add_subitems_to_menu( $menu_name, $parent_object_id, $subitems ) {
// Nu adăuga nimic în zona de administrare. Altfel WP va încerca să afișeze elementele
// în editorul de meniu și nu va funcționa corect, provocând comportamente ciudate
if ( is_admin() ) {
return;
}
// Folosește filtrul wp_get_nav_menu_items, folosit de Timber pentru a obține elementele meniului WP
add_filter( 'wp_get_nav_menu_items', function( $items, $menu )
use( $menu_name, $parent_object_id, $subitems ) {
// Dacă nu se găsește meniul, returnează elementele fără a adăuga nimic
if ( $menu->name != $menu_name && $menu->slug != $menu_name ) {
return $items;
}
// Găsește ID-ul elementului de meniu corespunzător ID-ului postului/paginii date
// Dacă nu se găsește postul/pagina, subelementele nu vor avea părinte (vor fi pe primul nivel)
$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 ) {
// Creează obiecte care conțin doar acele proprietăți din WP_Post
// folosite de WP pentru a crea un element de meniu
$items[] = (object) array(
'ID' => $menu_order + 1000000000, // ID pe care WP nu îl va folosi
'title' => $subitem['text'],
'url' => $subitem['url'],
'menu_item_parent' => $parent_menu_item_id,
'menu_order' => $menu_order,
// Acestea nu sunt necesare, dar se va genera avertisment PHP dacă sunt nedefinite
'type' => '',
'object' => '',
'object_id' => '',
'db_id' => '',
'classes' => '',
);
$menu_order++;
}
return $items;
}, 10, 2);
}
get_wp_object_id()
/**
* Returnează ID-ul WordPress al oricărui tip de post sau pagină după titlu sau nume
* În cazul în care furnizezi un ID, acesta va fi "validat" căutând orice post cu acel ID
*
* @param mixed $post_identifier Titlul, numele sau ID-ul postului/paginii
* @param string $post_type Tipul de post pentru care se caută (implicit: page)
*
* @return int ID-ul postului/paginii dacă există, sau 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;
}

Mulțumesc MikO pentru ajutor
-
Contul meu nu este pagină, am creat un link și l-am adăugat în meniu prin setările de meniu din wp admin
-
Am verificat codul tău creând o pagină nouă și transmitându-i id-ul către funcție, dar nu a funcționat pentru mine
-
Am schimbat linia $my_account_page_id = în
$my_account_item_id

Ohh Miko, Acum funcționează, Mulțumesc mult pentru cod..
Dar în loc să folosesc id-ul paginii, aș dori să adaug Profil sub un link, pe care l-am creat în setările de meniu wp admin

Nicio problemă, am obținut ID-ul elementului personalizat din meniu verificând în baza de date
Așadar, este rezolvat, Mulțumesc din nou

@Hafsal, cu plăcere. Am editat răspunsul meu adăugând o altă funcție pe care o poți folosi pentru a obține ID-ul oricărei pagini, articol sau element de meniu WordPress, și am actualizat modul în care ar trebui să apelezi aceste funcții. Altfel, poți verifica direct ID-ul în baza de date așa cum ai făcut...
