Ajouter un élément de menu personnalisé à l'aide du filtre wp_nav_menu_items

8

J'ai ajouté un extrait pour ajouter un lien "Profil" au menu de navigation de mon site Web. Mon code:

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;
    }
}

Ce code affiche correctement le lien de profil dans mon menu, mais maintenant je veux déplacer ce lien "profil" comme sous-menu d'un autre menu principal.

Ma structure de menu est la suivante:

Accueil | Mon compte | Les catégories

Je voudrais ajouter le lien "profil" sous "Mon compte". Des suggestions pour résoudre ce problème?

Hafsal
la source
Jetez un œil à codex.wordpress.org/Function_Reference/add_submenu_page
bestprogrammerintheworld
@bestprogrammerintheworld - c'est pour le menu administrateur, pas le menu frontal.
Stephen Harris
si vous souhaitez ajouter un élément de menu sans lien, essayez celui-ci à l'aide de js. kvcodes.com/2014/07/…
Kvvaradha

Réponses:

6

J'ai créé ces deux fonctions que vous pouvez utiliser pour ajouter des éléments personnalisés à un élément de menu donné présent dans votre menu (page, publication, lien ...).

Dans votre cas, vous pouvez ajouter ces fonctions à votre functions.php et les appeler comme ceci:

$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;
}
MikO
la source
Merci MikO pour votre aide 1. Mon compte n'est pas une page, j'ai créé un lien et je l'ai ajouté au menu via les paramètres du menu admin wp 2. J'ai vérifié votre code en créant une nouvelle page et en passant son identifiant pour fonctionner, mais n'a pas fonctionné pour moi 3. J'ai changé la ligne $ my_account_page_id = en $ my_account_item_id
Hafsal
J'ai ajouté tout votre code dans function.php
Hafsal
Ohh Miko, cela fonctionne maintenant, merci beaucoup pour le code .. Mais au lieu d'utiliser l'identifiant de la page, je voudrais ajouter un profil sous un lien, que j'ai créé dans les paramètres du menu d'administration de wp
Hafsal
Pas probs, je me suis id élément de menu personnalisé en vérifiant db Il est fixé, Merci encore
Hafsal
@Hafsal, vous êtes les bienvenus. J'ai modifié ma réponse en ajoutant une fonction antoher, que vous pouvez utiliser pour obtenir l'ID de n'importe quelle page, publication ou élément de menu WordPress, et j'ai mis à jour la façon dont vous devez appeler ces fonctions. Sinon, vous pouvez vérifier directement l'ID dans la base de données comme vous l'avez fait ...
MikO