Adăugare element personalizat în meniu folosind filtrul wp_nav_menu_items

4 mai 2014, 07:47:15
Vizualizări: 29.2K
Voturi: 11

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ă?

3
Comentarii

Aruncă o privire la http://codex.wordpress.org/Function_Reference/add_submenu_page

bestprogrammerintheworld bestprogrammerintheworld
4 mai 2014 09:55:18

@bestprogrammerintheworld - asta e pentru meniul de administrare, nu pentru meniul din față.

Stephen Harris Stephen Harris
4 mai 2014 12:30:09

dacă dorești să adaugi un element de meniu fără link, încearcă această soluție cu ajutorul js. http://www.kvcodes.com/2014/07/make-menu-link-wordpress-without-adding-page/

Kvvaradha Kvvaradha
16 feb. 2016 06:53:04
Toate răspunsurile la întrebare 1
6

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;
}
4 mai 2014 15:47:27
Comentarii

Mulțumesc MikO pentru ajutor

  1. Contul meu nu este pagină, am creat un link și l-am adăugat în meniu prin setările de meniu din wp admin

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

  3. Am schimbat linia $my_account_page_id = în

$my_account_item_id

Hafsal Hafsal
4 mai 2014 16:58:21

Am adăugat tot codul tău în function.php

Hafsal Hafsal
4 mai 2014 17:05:59

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

Hafsal Hafsal
4 mai 2014 17:12:41

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 Hafsal
4 mai 2014 17:56:53

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

MikO MikO
4 mai 2014 18:00:29

Când încerc să votez pozitiv, îmi spune că "Ai nevoie de 15 reputație", dar eu nu am

Hafsal Hafsal
4 mai 2014 18:08:28
Arată celelalte 1 comentarii