Lập trình thêm một menu Điều hướng và các mục menu


41

Thông qua các chức năng API, tôi muốn xác định menu Điều hướng mới , chọn nó trong chủ đề hiện tại và sau đó chèn một vài Trang làm các mục menu. Điều này được thực hiện ví dụ trên một kích hoạt chủ đề.

Thông qua quy trình (đau vừa phải) của kỹ thuật đảo ngược, cơ sở dữ liệu chèn và cập nhật sau khi thiết lập thủ công menu Điều hướng và các mục, tôi đã thực hiện các bước sau đây, trong đó 'footer-nav' là ID sên của menu Điều hướng I ' m đang tạo:

if (!term_exists('footer-nav', 'nav_menu')) {

    $menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));

    // Select this menu in the current theme
    update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));

    // Insert new page
    $page = wp_insert_post(array('post_title' => 'Blog',
                                 'post_content' => '',
                                 'post_status' => 'publish',
                                 'post_type' => 'page'));

    // Insert new nav_menu_item
    $nav_item = wp_insert_post(array('post_title' => 'News',
                                     'post_content' => '',
                                     'post_status' => 'publish',
                                     'post_type' => 'nav_menu_item'));


    add_post_meta($nav_item, '_menu_item_type', 'post_type');
    add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
    add_post_meta($nav_item, '_menu_item_object_id', $page);
    add_post_meta($nav_item, '_menu_item_object', 'page');
    add_post_meta($nav_item, '_menu_item_target', '');
    add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
    add_post_meta($nav_item, '_menu_item_xfn', '');
    add_post_meta($nav_item, '_menu_item_url', '');

    wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}

Điều này có vẻ hiệu quả, nhưng:

  • nó là một cách mạnh mẽ và thanh lịch để làm điều đó?
  • Tôi có thiếu một cái gì đó hoàn toàn rõ ràng sẽ làm tất cả điều này trong một dòng mã không?

Câu trả lời:


42

Tôi có thể hiểu lầm bạn, nhưng tại sao không sử dụng wp_create_nav_menu()?

Ví dụ, đây là những gì tôi làm để tạo menu BuddyPress tùy chỉnh khi tôi phát hiện BP là hoạt động:

    $menuname = $lblg_themename . ' BuddyPress Menu';
$bpmenulocation = 'lblgbpmenu';
// Does the menu exist already?
$menu_exists = wp_get_nav_menu_object( $menuname );

// If it doesn't exist, let's create it.
if( !$menu_exists){
    $menu_id = wp_create_nav_menu($menuname);

    // Set up default BuddyPress links and add them to the menu.
    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Activity'),
        'menu-item-classes' => 'activity',
        'menu-item-url' => home_url( '/activity/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Members'),
        'menu-item-classes' => 'members',
        'menu-item-url' => home_url( '/members/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Groups'),
        'menu-item-classes' => 'groups',
        'menu-item-url' => home_url( '/groups/' ), 
        'menu-item-status' => 'publish'));

    wp_update_nav_menu_item($menu_id, 0, array(
        'menu-item-title' =>  __('Forums'),
        'menu-item-classes' => 'forums',
        'menu-item-url' => home_url( '/forums/' ), 
        'menu-item-status' => 'publish'));

    // Grab the theme locations and assign our newly-created menu
    // to the BuddyPress menu location.
    if( !has_nav_menu( $bpmenulocation ) ){
        $locations = get_theme_mod('nav_menu_locations');
        $locations[$bpmenulocation] = $menu_id;
        set_theme_mod( 'nav_menu_locations', $locations );
    }

Tôi không biết về chức năng này. Vâng, tôi đoán nó sẽ làm cho đoạn mã trên ngắn hơn nhiều. Tôi đoán tôi nên vượt ra ngoài Codex và đi sâu vào mã thực tế, vì tôi thấy rằng các hàm API thường, như trong trường hợp này, ở mức quá thấp. Cảm ơn!
julien_c

@julien_c nếu điều này được giải quyết, hãy đánh dấu nó như vậy để cho phép những người đến sau bạn được hưởng lợi từ trải nghiệm của bạn ở đây.
mor7ifer

Tôi chỉ muốn thực sự thử nghiệm nó trong cuộc sống thực vì vậy tôi chắc chắn rằng nó làm những gì tôi muốn. Tôi sẽ nhớ đánh dấu nó là giải quyết ngay sau khi tôi hoàn thành!
julien_c

3
Nếu bạn thấy các hàm hữu ích như các hàm này không có trong codex, thì nên thêm chúng (yay wiki) = p
Tom J Nowell

Xin lỗi, tôi đã mất một thời gian dài để kiểm tra xem nó có hoạt động trong trường hợp của tôi không. Trả lời chấp nhận! Ngoài ra, bạn đang xác định các mục menu liên kết tùy chỉnh , tôi đã thêm một câu trả lời bên dưới để xác định các liên kết trang (chẳng hạn sẽ mạnh mẽ hơn đối với các thay đổi URL).
julien_c

12

Để bổ sung cho anwser của ZaMoose, đây là cách bạn sẽ tạo một mục trình đơn " Trang -type" (không phải là " Tùy chỉnh "):

wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'About',
                                           'menu-item-object' => 'page',
                                           'menu-item-object-id' => get_page_by_path('about')->ID,
                                           'menu-item-type' => 'post_type',
                                           'menu-item-status' => 'publish'));

Giả sử bạn chỉ biết sên trang chẳng hạn.


9

Tôi có một vài vấn đề với câu trả lời được chấp nhận - điều đó không làm cho nó sai, nhưng tôi sẽ đăng mã của riêng mình bên dưới mà tôi cảm thấy có thể có kết quả tốt hơn cho một số người vì tôi có cùng câu hỏi nhưng muốn làm như vậy điều với ít mã hơn.

Đầu tiên, đoạn mã trên tạo ra các mục điều hướng loại "URL", phù hợp với một số người nhưng tôi muốn liên kết với PAGES, không phải URL vì đây là một tính năng quan trọng của điều hướng WordPress và khách hàng không thể di chuyển mọi thứ xung quanh vì vậy tôi không bao giờ sử dụng URL loại mặt hàng điều hướng.

Ngoài ra, chỉ có một mảng phẳng của trẻ em được xử lý bởi mã được đăng. Tôi đã tạo một hàm để khai báo đệ quy các mục điều hướng mới, lưu trữ siêu dữ liệu được trả về của chúng (chủ yếu là ID sau khi được tạo trong vòng lặp) và một tham số để chấp nhận trẻ em.

Chỉ cần chỉnh sửa $nav_items_to_addvà phần còn lại được xử lý đệ quy. Có 3 khóa bắt buộc trong mỗi mảng. Đầu tiên, khóa mảng là sên, đó 'shop' => array( ... )là những gì bạn muốn cho một trang với sên shop. ['title']là cách mục điều hướng sẽ được dán nhãn ở mặt trước. pathlà đường dẫn đến trang trong hệ thống phân cấp trang WordPress, do đó, đây là giống hệt với sên nếu trang là cha mẹ cấp cao nhất và nếu shoplà con của homenó thì nó sẽ như vậy 'path' => 'home/shop'.

Khóa mảng tùy chọn cuối cùng là ['parent']nơi bạn có thể khai báo một khóa khác trong mảng là cha mẹ của khóa hiện tại. Điều quan trọng cần lưu ý là các mục được thêm theo cách đệ quy, vì vậy cha mẹ phải tồn tại trước khi bạn cố gắng tạo con. Điều này có nghĩa là việc khai báo sẽ xảy ra đối với mục điều hướng cha mẹ trước khi nó là con.

    $locations = get_nav_menu_locations();

    if (isset($locations['primary_navigation'])) {
        $menu_id = $locations['primary_navigation'];

        $new_menu_obj = array();

        $nav_items_to_add = array(
                'shop' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    ),
                'shop_l2' => array(
                    'title' => 'Shop',
                    'path' => 'shop',
                    'parent' => 'shop',
                    ),
                'cart' => array(
                    'title' => 'Cart',
                    'path' => 'shop/cart',
                    'parent' => 'shop',
                    ),
                'checkout' => array(
                    'title' => 'Checkout',
                    'path' => 'shop/checkout',
                    'parent' => 'shop',
                    ),
                'my-account' => array(
                    'title' => 'My Account',
                    'path' => 'shop/my-account',
                    'parent' => 'shop',
                    ),
                'lost-password' => array(
                    'title' => 'Lost Password',
                    'path' => 'shop/my-account/lost-password',
                    'parent' => 'my-account',
                    ),
                'edit-address' => array(
                    'title' => 'Edit My Address',
                    'path' => 'shop/my-account/edit-address',
                    'parent' => 'my-account',
                    ),
            );

    foreach ( $nav_items_to_add as $slug => $nav_item ) {
        $new_menu_obj[$slug] = array();
        if ( array_key_exists( 'parent', $nav_item ) )
            $new_menu_obj[$slug]['parent'] = $nav_item['parent'];
        $new_menu_obj[$slug]['id'] = wp_update_nav_menu_item($menu_id, 0,  array(
                'menu-item-title' => $nav_item['title'],
                'menu-item-object' => 'page',
                'menu-item-parent-id' => $new_menu_obj[ $nav_item['parent'] ]['id'],
                'menu-item-object-id' => get_page_by_path( $nav_item['path'] )->ID,
                'menu-item-type' => 'post_type',
                'menu-item-status' => 'publish')
        );
    }

    }

2

Để thêm một mục menu Lập trình. bạn có thể móc để wp_nav_menu_itemslọc. đặt mã bên dưới trong các chức năng chủ đề của bạn.php để thêm mục menu đăng nhập / đăng xuất trong menu chính. 'Chính' là tên / id của menu đã đăng ký.

/**
 * Add login logout menu item in the main menu.
 * ===========================================
 */

add_filter( 'wp_nav_menu_items', 'lunchbox_add_loginout_link', 10, 2 );
function lunchbox_add_loginout_link( $items, $args ) {
    /**
     * If menu primary menu is set & user is logged in.
     */
    if ( is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. wp_logout_url() .'">Log Out</a></li>';
    }
    /**
     * Else display login menu item.
     */
    elseif ( !is_user_logged_in() && $args->theme_location == 'primary' ) {
        $items .= '<li><a href="'. site_url('wp-login.php') .'">Log In</a></li>';
    }
    return $items;
}
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.