Aggiungi la voce di menu personalizzata usando il filtro wp_nav_menu_items


8

Ho aggiunto uno snippet per aggiungere un link "Profilo" al menu di navigazione del mio sito Web. 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" >Profile</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" in "Il mio account". Qualche suggerimento per risolvere questo problema?



@bestprogrammerintheworld: è per il menu di amministrazione, non per il menu di front-end.
Stephen Harris,

se desideri aggiungere una voce di menu senza link, prova questo con l'aiuto di js. kvcodes.com/2014/07/…
Kvvaradha,

Risposte:


6

Ho creato queste due funzioni che puoi utilizzare per aggiungere elementi personalizzati a una determinata voce di menu presente nel tuo menu (pagina, post, link ...).

Nel tuo caso, puoi aggiungere queste funzioni al tuo function.php e chiamarle così:

$menu_name = 'Your Menu Name';
$name_of_menu_item_to_append_to = 'My 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' => 'Profile',
    'url'  => 'http://someurl.com'
);

add_subitems_to_menu( 
    $menu_name,
    $id_of_menu_item_to_append_to,
    array( $new_submenu_item ) 
);

add_subitems_to_menu ()

/**
 * Adds custom items to a navigation menu
 * Partially based on: 
 * http://teleogistic.net/2013/02/dynamically-add-items-to-a-wp_nav_menu-list/
 * 
 * @param string    $menu_name          The name or slug of the navigation menu
 * @param int       $parent_object_id   The id of the post/page, which must be present 
 *                                      in the menu, and to which we want to add subitems 
 * @param array     $subitems           The sub-items to be added to the menu, as an
 *                                      array( array( 'text' => 'foo', 'url' => '/bar') )
 */
public function add_subitems_to_menu( $menu_name, $parent_object_id, $subitems ) {
    // Don't add anything in admin area. Otherwise WP will try to display the items in the 
    // Menu editor and it won't work fine and cause strange behaviour
    if ( is_admin() ) {
        return;
    }

    // Use wp_get_nav_menu_items filter, is used by Timber to get WP menu items
    add_filter( 'wp_get_nav_menu_items', function( $items, $menu ) 
            use( $menu_name, $parent_object_id, $subitems ) {

        // If no menu found, just return the items without adding anything
        if ( $menu->name != $menu_name && $menu->slug != $menu_name ) {
            return $items;
        }

        // Find the menu item ID corresponding to the given post/page object ID
        // If no post/page found, the subitems won't have any parent (will be on 1st level)
        $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 ) {
            // Create objects containing all (and only) those properties from WP_Post 
            // used by WP to create a menu item
            $items[] = (object) array(
                'ID'                => $menu_order + 1000000000, // ID that WP won't use
                'title'             => $subitem['text'],
                'url'               => $subitem['url'],
                'menu_item_parent'  => $parent_menu_item_id,
                'menu_order'        => $menu_order,
                // These are not necessary, but PHP warning will be thrown if undefined
                'type'              => '',
                'object'            => '',
                'object_id'         => '',
                'db_id'             => '',
                'classes'           => '',
            );
            $menu_order++;
        }
        return $items;
    }, 10, 2);
}

get_wp_object_id ()

 /**
 * Returns the WordPress ID of any post type or page by its title or name
 * In the case you provide an ID it will "validate" it looking for any post with that ID
 *
 * @param mixed     $post_identifier    The title, name or ID of the post/page
 * @param string    $post_type          The post type to look for (default: page)
 *
 * @return int The ID of the post/page if any, or 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 1. Il mio account non è una pagina, ho desiderato un link e l'ho aggiunto al menu tramite le impostazioni del menu admin di wp 2. Ho controllato il tuo codice creando una nuova pagina e passando il suo ID per funzionare, ma non ha funzionato per me 3. Ho cambiato la riga $ my_account_page_id = in $ my_account_item_id
Hafsal

Ho aggiunto tutto il tuo codice in function.php
Hafsal

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

Nessun problema, ho ottenuto l'ID della voce di menu personalizzata controllando in db Quindi è stato risolto, Grazie ancora
Hafsal

@Hafsal, prego. Ho modificato la mia risposta aggiungendo un'altra funzione, che puoi utilizzare per ottenere l'ID di qualsiasi pagina, post o voce di menu di WordPress e ho aggiornato il modo in cui dovresti chiamare queste funzioni. Altrimenti, puoi controllare direttamente l'ID nel DB come hai fatto ...
MikO
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.