Cara Hard Item item menu Kustom

22

Apakah ada cara saya dapat membuat kode item menu kustom saat tema pertama kali diinstal? Saya membuat tema yang secara otomatis akan membuat beberapa halaman umum ketika diinstal. Jadi saya perlu tahu apakah saya juga bisa menambahkannya ke menu khusus Wordpress sehingga klien tidak perlu menambahkannya secara manual?

Dengan kata lain: bagaimana cara memasukkan / membuat item menu kustom secara terprogram?

Beritahu saya jika ada yang tidak jelas. Panduan untuk halaman codex yang sesuai dipersilahkan. Terima kasih!


perbarui: mencoba kode dari sini Menargetkan menu tertentu dengan wp_nav_menu_items

Registrasi menu:

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

add_action( 'init', 'register_my_menus' );

Penggunaan template:

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

Kode untuk menambahkan item baru:

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

ketika menambahkan kode untuk menambahkan item baru di menu nav di functions.phpnothings file terjadi di halaman menu di panel admin tetapi item menu saat ini hilang di situs!

Sisir
sumber

Jawaban:

23

Masalah dengan kode Anda adalah bahwa itu tidak benar-benar menambahkan tautan ke menu dan hanya ke output menu, maka penggunaan filter (add_filter) sehingga Anda hanya memfilter output dari menu sebenarnya bahkan jika Anda tidak miliki menu tautan Anda akan ditampilkan dengan kode yang Anda gunakan. Tetapi untuk membuat tautan dan menambahkannya ke menu Anda dapat menggunakan kode ini:

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

Saya berkomentar di seluruh untuk membuatnya lebih sederhana.

Untuk membuat menu anak / sub halaman / menu tingkat kedua (bagaimana pun Anda menyebutnya), Anda hanya perlu mengatur menu-item-parent-iditem baru misalnya:

//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,
    ));

Anda juga dapat mengatur posisi dengan kode dengan menu-item-position dan saya pikir itu dilakukan seperti ini:

  • Item pertama - 'menu-item-position' => 1
    • Item pertama, anak pertama - 'menu-item-position' => 1
    • Item pertama anak kedua - 'menu-item-position' => 1
      • Item pertama anak pertama, anak pertama - 'menu-item-position' => 1
  • Item kedua - 'menu-item-position' => 2
  • Item ke-3 - 'menu-item-posisi' => 3
  • Item ke-4 - 'menu-item-posisi' => 4
Bainternet
sumber
Itulah fungsi yang saya cari :) codex tidak termasuk ini :( Satu pertanyaan lagi bagaimana saya bisa menambahkan item anak ke item Home. Saya akan memberi tahu Anda begitu saya sampai di pc saya. Terima kasih!
Sisir
@Sisir: saya memperbarui dengan contoh cara membuat halaman anak
Bainternet
@Bainternet: dapatkan kesalahan ini saat pertama kali menjalankan kode Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Tetapi menu dibuat dan ketika halaman di-refresh semuanya berfungsi tetapi tidak ada yang ditampilkan di Appearance -> Menu Theme Locationbagian. Kami sangat dekat :) Terima kasih!
Sisir
@Bainternet: Tebakan saya adalah kode mendapatkan kesalahan ketika mencoba menjalankan kode $locations = get_theme_mod('nav_menu_locations');Jadi, kode sebelum itu (semua penyisipan menu selesai) dieksekusi dan kode setelah itu (setel lokasi tema yang diinginkan) jangan dieksekusi .
Sisir
@Sisir: kode berfungsi dengan baik, apa nama lokasi tema Anda dan tunjukkan kode persis yang Anda gunakan, saya akan melihat apakah saya dapat membantu.
Bainternet
8

Kode asli Anda sangat dekat dengan uang dan saya serius berpikir solusi panjang ini oleh @Bainternet (jangan tersinggung) terlalu banyak, jadi lihat ini:

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

Satu-satunya masalah Anda adalah bahwa Anda tidak mengembalikan $ item setelah fungsi memeriksa menu yang benar, dan Anda kehilangan argumen panggilan balik kedua yang diperlukan untuk melakukan pemeriksaan ( $ args ).

Foxinni
sumber
Bagaimana Anda mengatur lokasi item menu menggunakan metode ini?
Michael N
1

Ada bug di Wordpress 3.4.2:

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

Anda harus membuat istilah relasi secara manual:

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

Lihat https://gist.github.com/4148529 untuk contoh kelas Menu untuk pembuatan menu sederhana.

OzzyCzech
sumber
0

Sebagai informasi, pengguna saat ini harus mendapatkan hak untuk menambahkan istilah, menu_items saya dibuat tetapi tidak ditambahkan dalam tabel wp_terms_relationship sebelum saya menambahkan panggilan ke wp_set_current_user (1);

Grégocentrique
sumber