Tambahkan item menu khusus menggunakan filter wp_nav_menu_items

8

Saya telah menambahkan cuplikan untuk menambahkan tautan "Profil" ke menu navigasi situs web saya. Kode saya:

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

Kode ini dengan benar menampilkan tautan profil di menu saya, tetapi sekarang saya ingin memindahkan tautan "profil" ini sebagai sub menu dari menu utama lainnya.

Struktur Menu saya adalah sebagai berikut:

Beranda | Akun Saya | Kategori

Saya ingin menambahkan tautan "profil" di bawah "Akun Saya". Ada saran untuk mengatasi masalah ini?

Hafsal
sumber
@bestprogrammerintheworld - itu untuk menu admin, bukan menu front-end.
Stephen Harris
jika Anda ingin menambahkan item menu tanpa tautan coba yang ini dengan bantuan js. kvcodes.com/2014/07/…
Kvvaradha

Jawaban:

6

Saya telah membuat dua fungsi ini yang dapat Anda gunakan untuk menambahkan item khusus ke item menu tertentu yang ada di menu Anda (halaman, posting, tautan ...).

Dalam kasus Anda, Anda dapat menambahkan fungsi ini ke functions.php Anda dan memanggilnya seperti ini:

$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
sumber
Terima kasih MikO atas bantuan Anda 1. Akun Saya bukan halaman, saya telah membuat tautan dan menambahkannya ke menu melalui pengaturan menu admin wp 2. Saya telah memeriksa kode Anda dengan membuat halaman baru dan dengan mengirimkan idnya berfungsi, tetapi tidak bekerja untuk saya 3. Saya telah mengubah baris $ my_account_page_id = menjadi $ my_account_item_id
Hafsal
Saya telah menambahkan semua kode Anda di function.php
Hafsal
Ohh Miko, Ini berfungsi sekarang, Terima kasih banyak untuk kodenya .. Tapi Alih-alih menggunakan id halaman, saya ingin menambahkan Profil di bawah tautan, yang telah saya buat di pengaturan menu wp admin
Hafsal
Tidak masalah, saya mendapat id item menu kustom dengan memeriksa db Jadi sudah diperbaiki, Terima kasih lagi
Hafsal
@ Hafsal, sama-sama. Saya mengedit jawaban saya menambahkan fungsi antoher, yang dapat Anda gunakan untuk mendapatkan ID dari setiap halaman WordPress, pos atau item menu, dan saya memperbarui cara Anda harus memanggil fungsi-fungsi ini. Jika tidak, Anda dapat memeriksa secara langsung ID di DB seperti yang Anda lakukan ...
MikO