Thêm mục menu tùy chỉnh bằng bộ lọc wp_nav_menu_items


8

Tôi đã thêm một đoạn để thêm liên kết "Hồ sơ" vào menu điều hướng trang web của mình. Mã của tôi:

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

Mã này hiển thị chính xác liên kết hồ sơ trong menu của tôi, nhưng bây giờ tôi muốn di chuyển liên kết "hồ sơ" này làm menu phụ của menu chính khác.

Cấu trúc Menu của tôi như sau:

Trang chủ | Tài khoản của tôi | Thể loại

Tôi muốn thêm liên kết "hồ sơ" trong "Tài khoản của tôi". Bất kỳ đề xuất để giải quyết vấn đề này?



@bestprogrammerintheworld - đó là cho menu quản trị, không phải menu phía trước.
Stephen Harris

nếu bạn muốn thêm mục menu mà không có liên kết, hãy thử cái này với sự giúp đỡ của js. kvcodes.com/2014/07/ từ
Kvvaradha 16/2/2016

Câu trả lời:


6

Tôi đã tạo hai chức năng này mà bạn có thể sử dụng để thêm các mục tùy chỉnh vào một mục menu nhất định có trong menu của bạn (trang, bài đăng, liên kết ...).

Trong trường hợp của bạn, bạn có thể thêm các hàm này vào hàm.php và gọi chúng như thế này:

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

Cảm ơn MikO vì sự giúp đỡ của bạn 1. Tài khoản của tôi không phải là trang, tôi đã thèm một liên kết và thêm nó vào menu thông qua cài đặt menu quản trị wp 2. Tôi đã kiểm tra mã của bạn bằng cách tạo một trang mới và bằng cách chuyển id của nó sang chức năng, nhưng không hoạt động với tôi 3. Tôi đã thay đổi dòng $ my_account_page_id = thành $ my_account_item_id
Hafsal

Tôi đã thêm tất cả mã của bạn vào
hàm.php

Ohh Miko, hiện đang hoạt động, Cảm ơn bạn rất nhiều về mã .. Nhưng thay vì sử dụng id trang, tôi muốn thêm Hồ sơ theo một liên kết, mà tôi đã tạo trong cài đặt menu quản trị wp
Hafsal

Không có probs, tôi đã nhận được id mục menu tùy chỉnh bằng cách kiểm tra db Vì vậy, nó đã được sửa, Cảm ơn một lần nữa
Hafsal

@Hafsal, bạn được chào đón. Tôi đã chỉnh sửa câu trả lời của mình bằng cách thêm chức năng antoher, mà bạn có thể sử dụng để lấy ID của bất kỳ trang WordPress, bài đăng hoặc mục menu nào và tôi đã cập nhật cách bạn nên gọi các chức năng này.
Mặt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.