Fügen Sie mithilfe des Filters wp_nav_menu_items einen benutzerdefinierten Menüpunkt hinzu

8

Ich habe ein Snippet hinzugefügt, um meinem Website-Navigationsmenü einen Link "Profil" hinzuzufügen. Mein 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;
    }
}

Dieser Code zeigt den Profillink in meinem Menü korrekt an, aber jetzt möchte ich diesen "Profil" -Link als Untermenü eines anderen Hauptmenüs verschieben.

Meine Menüstruktur ist wie folgt:

Startseite | Mein Konto | Kategorien

Ich möchte den Link "Profil" unter "Mein Konto" hinzufügen. Irgendwelche Vorschläge zur Lösung dieses Problems?

Hafsal
quelle
Werfen
bestprogrammerintheworld
@bestprogrammerintheworld - das ist für das Admin-Menü, nicht für das Front-End-Menü.
Stephen Harris
Wenn Sie einen Menüpunkt ohne Link hinzufügen möchten, versuchen Sie diesen mit Hilfe von js. kvcodes.com/2014/07/…
Kvvaradha

Antworten:

6

Ich habe diese beiden Funktionen erstellt, mit denen Sie einem bestimmten Menüelement in Ihrem Menü (Seite, Beitrag, Link ...) benutzerdefinierte Elemente hinzufügen können.

In Ihrem Fall können Sie diese Funktion zu Ihrer functions.php hinzufügen und wie folgt aufrufen:

$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
quelle
Vielen Dank an MikO für Ihre Hilfe. 1. Mein Konto ist keine Seite. Ich habe einen Link erstellt und ihn über die Menüeinstellungen von wp admin zum Menü hinzugefügt. 2. Ich habe Ihren Code überprüft, indem ich eine neue Seite erstellt und seine ID an die Funktion übergeben habe hat bei mir nicht funktioniert 3. Ich habe die Zeile $ my_account_page_id = in $ my_account_item_id geändert
Hafsal
Ich habe Ihren gesamten Code in function.php
Hafsal
Ohh Miko, es funktioniert jetzt. Vielen Dank für den Code. Aber anstatt die Seiten-ID zu verwenden, möchte ich ein Profil unter einem Link hinzufügen, den ich in den Einstellungen des wp-Administratormenüs erstellt habe
Hafsal
Keine Probleme, ich habe eine benutzerdefinierte Menüelement-ID durch Einchecken in db erhalten. Es ist also behoben.
Nochmals vielen
@ Hafsal, du bist willkommen. Ich habe meine Antwort bearbeitet und eine weitere Funktion hinzugefügt, mit der Sie die ID jeder WordPress-Seite, jedes Posts oder jedes Menüelements abrufen können. Außerdem habe ich die Art und Weise aktualisiert, wie Sie diese Funktionen aufrufen sollten. Andernfalls können Sie die ID in der
Datenbank