Làm thế nào để Hard Code Các mục menu tùy chỉnh


22

Có cách nào để tôi có thể mã cứng các mục menu tùy chỉnh khi cài đặt chủ đề đầu tiên không? Tôi đang tạo một chủ đề sẽ tự động tạo một số trang phổ biến khi cài đặt. Vì vậy, tôi cần biết nếu tôi cũng có thể thêm chúng vào menu tùy chỉnh Wordpress để khách hàng không cần thêm chúng theo cách thủ công?

Nói cách khác: làm thế nào để chèn / tạo mục menu tùy chỉnh theo chương trình?

Hãy cho tôi biết nếu có gì không rõ ràng. Hướng dẫn đến trang codex thích hợp được chào đón. Cảm ơn!


cập nhật: đã thử mã từ đây Nhắm mục tiêu menu cụ thể với wp_nav_menu_items

Đăng ký thực đơn:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

Mẫu sử dụng:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

Mã để thêm các mục mới:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

khi thêm mã để thêm các mục mới trong menu điều hướng trong thông báo functions.phptệp xảy ra trong trang menu trong bảng quản trị nhưng các mục menu hiện tại đã biến mất trong trang web!

Câu trả lời:


23

Vấn đề với mã của bạn là nó không thực sự thêm các liên kết vào menu và chỉ vào đầu ra của menu, do đó việc sử dụng bộ lọc (add_filter) vì vậy thực tế bạn chỉ lọc đầu ra của menu ngay cả khi bạn không có một menu liên kết của bạn sẽ được hiển thị với mã bạn đang sử dụng. Nhưng để tạo một liên kết và thêm nó vào một menu, bạn có thể sử dụng mã này:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

Tôi nhận xét tất cả để làm cho nó đơn giản hơn.

Để tạo một trang con / trang phụ / menu cấp hai (bao giờ bạn có thể gọi nó), bạn chỉ cần đặt mục menu-item-parent-idtrong mục mới chẳng hạn:

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

Ngoài ra, bạn có thể đặt vị trí theo mã menu-item-position và tôi nghĩ rằng nó được thực hiện như thế này:

  • Mục đầu tiên - 'menu-item-vị trí' => 1
    • Mục đầu tiên con đầu tiên - 'menu-item-vị trí' => 1
    • Mục thứ nhất con thứ hai - 'menu-item-vị trí' => 1
      • Mục đầu tiên con thứ hai con đầu lòng - 'menu-item-location' => 1
  • Mục thứ hai - 'menu-item-vị trí' => 2
  • Mục thứ 3 - 'menu-item-vị trí' => 3
  • Mục thứ 4 - 'menu-item-vị trí' => 4

. Đó là những chức năng tôi đang tìm kiếm :) codex không bao gồm những :( Một câu hỏi làm thế nào tôi có thể thêm một đứa trẻ mục vào mục Home tôi sẽ cho bạn biết càng sớm càng tôi nhận được vào máy của tôi Cảm ơn.!
Sisir

@Sisir: tôi đã cập nhật với một ví dụ về cách tạo các trang con
Bai Internet

@BaiNET: gặp lỗi này khi lần đầu chạy mã Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Nhưng menu được tạo và khi trang được làm mới, mọi thứ đều hoạt động nhưng không có gì hiển thị trong Appearance -> Menu Theme Locationphần. Chúng tôi rất thân nhau :) Cảm ơn!
Sisir

@BaiNET: Tôi đoán là mã đang bị lỗi khi nó cố chạy mã $locations = get_theme_mod('nav_menu_locations');Vì vậy, các mã trước đó (tất cả các thao tác chèn menu đã được thực hiện) được thực thi và mã sau đó (đặt vị trí chủ đề mong muốn) không được thực thi .
Sisir

@Sisir: mã đang hoạt động tốt, tên vị trí chủ đề của bạn là gì và cho tôi biết mã chính xác bạn đang sử dụng, tôi sẽ xem liệu tôi có thể giúp gì không.
Bai Internet

8

Mã ban đầu của bạn rất gần với tiền và tôi thực sự nghĩ rằng giải pháp dài này của @Bai Internet (không vi phạm) là quá mức cần thiết, vì vậy hãy xem xét điều này thay vào đó:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Vấn đề duy nhất của bạn là bạn đã không trả lại các mục $ sau khi chức năng được kiểm tra cho menu chính xác và bạn đã bỏ lỡ đối số gọi lại thứ hai cần thiết để thực hiện kiểm tra ( $ args ).


Làm thế nào bạn sẽ thiết lập vị trí của mục menu bằng phương pháp này?
Michael N

1

Có một lỗi trong Wordpress 3.4.2:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

Bạn cần tạo thuật ngữ quan hệ bằng tay:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

Xem https://gist.github.com/4148529 để biết ví dụ về lớp Menu để tạo menu đơn giản.


0

Để biết thông tin, người dùng hiện tại phải có quyền thêm điều khoản, menu_items của tôi đã được tạo nhưng không được thêm vào bảng wp_terms_relationship trước khi tôi thêm lệnh gọi vào wp_set_cản_user (1);

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.