Aggiungere una voce di menu personalizzata usando il filtro wp_nav_menu_items

4 mag 2014, 07:47:15
Visualizzazioni: 29.2K
Voti: 11

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?

3
Commenti

Dai un'occhiata a http://codex.wordpress.org/Function_Reference/add_submenu_page

bestprogrammerintheworld bestprogrammerintheworld
4 mag 2014 09:55:18

@bestprogrammerintheworld - quello è per il menu di amministrazione, non per il menu front-end.

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

se vuoi aggiungere una voce di menu senza link prova questo con l'aiuto di js. http://www.kvcodes.com/2014/07/make-menu-link-wordpress-without-adding-page/

Kvvaradha Kvvaradha
16 feb 2016 06:53:04
Tutte le risposte alla domanda 1
6

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

Grazie MikO per il tuo aiuto

  1. Il mio Account non è una pagina, ho creato un link e l'ho aggiunto al menu attraverso le impostazioni del menu di wp admin

  2. Ho verificato il tuo codice creando una nuova pagina e passando il suo id alla funzione, ma non ha funzionato per me

  3. Ho cambiato la riga $my_account_page_id = in

$my_account_item_id

Hafsal Hafsal
4 mag 2014 16:58:21

Ho aggiunto tutto il tuo codice in function.php

Hafsal Hafsal
4 mag 2014 17:05:59

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

Hafsal Hafsal
4 mag 2014 17:12:41

Nessun problema, ho ottenuto l'ID dell'elemento del menu personalizzato controllando nel database

Quindi è risolto, grazie ancora

Hafsal Hafsal
4 mag 2014 17:56:53

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

MikO MikO
4 mag 2014 18:00:29

Quando provo a votare positivamente, dice che "Hai bisogno di 15 punti reputazione", ma non li ho

Hafsal Hafsal
4 mag 2014 18:08:28
Mostra i restanti 1 commenti