Saya mencoba mencari info tentang cara mengecualikan / menghapus item menu nav dari menu kustom, dan satu-satunya utas yang saya temukan tidak memiliki jawaban yang berguna bagi saya.
1. Latar Belakang:
Saya mengumpulkan menu Dock menggunakan menu khusus WP (wp_nav_menu) dan jqDock di situs saya. Karena jqDock membutuhkan gambar terus menerus atau tautan gambar untuk menjalankan keajaibannya, saya menggunakan walker khusus sehingga keluaran menu HTML nav terlihat seperti ini:
<div id="menu-first" class="nav">
<a><img src="http://path/to/image-1.png"/></a>
<a><img src="http://path/to/image-2.png"/></a>
<a><img src="http://path/to/image-3.png"/></a>
etc...
</div>
Kode untuk alat bantu khusus saya adalah:
class custom_nav_walker extends Walker_Nav_Menu
{
var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );
function start_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"sub-menu\">\n";
}
function end_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = ' class="' . esc_attr( $class_names ) . '"';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';
//$output .= $indent . '<li' . $id . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$description = ! empty( $item->description ) ? esc_attr( strtolower( $item->description )) : '';
$item_title = ! empty( $item->attr_title ) ? esc_attr( $item->attr_title ) : '';
if ( strpos($description, ';') !== false ) {
$description_array = explode (';', $description);
$image_name = $description_array[0];
$image_alt = $description_array[1];
} else {
$image_name = $description;
$image_alt = $item_title;
}
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .'<img src="'.get_bloginfo('template_url').'/images/skin1/'.$image_name.'" alt="'.$image_alt.'" title="'.$item_title.'" />'.$args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
function end_el(&$output, $item, $depth) {
$output .= "";
}
}
Skrip jqDock kemudian menangkap ID menu ('menu-first') dan menggantikan output wp_nav_menu dengan menu Dock. Output HTML menu Dock berubah berdasarkan opsi yang ditentukan saat memuat jqDock.
2. Pertanyaan:
Saya ingin tidak menampilkan (yaitu, mengecualikan) item menu tertentu sesuai dengan di mana pengguna berada di situs. Misalnya, saya hanya ingin menampilkan item Beranda saat pengguna tidak ada di Beranda, dan item posting Acak hanya ketika dia berada.
3. Solusi yang dibuang:
Sebuah. Menu muliple: Mendaftarkan dan membuat beberapa menu dan kemudian memanggilnya secara kondisional dapat bekerja; Namun, saya tidak berpikir ini adalah solusi ideal atau bersih sama sekali karena berbagai alasan. Selain itu, banyak menu tidak mudah dipelihara atau diperbarui.
b. Regex Search and Replace: Ini mungkin memaksa saya untuk mengubah parameter jarum setiap kali saya mengubah opsi jqDock karena output HTML dimodifikasi.
c. Properti 'display' CSS: Menyembunyikan item melalui properti display CSS berfungsi, tetapi karena itu harus diterapkan pada output menu jqDock, itu mempengaruhi rendering visual menu.
4. Solusi Gagal:
Sebuah. Memfilter ke wp_nav_menu_items : Saya mencoba menangkap variabel '$ items' (string) dan menetapkan nilai yang berbeda melalui tag kondisional dengan kode berikut:
function userf_dynamic_nav_menu ($items) {
$items_array_home = explode('<a', $items);
$items_array_nothome = $items_array_home;
unset($items_array_home[1]);
unset($items_array_nothome[2]);
$items_home = implode('<a', $items_array_home);
$items_nothome = implode('<a', $items_array_nothome);
if ( is_home() ) {
$items = $items_home;
} else {
$items = $items_nothome;
}
return $items;
}
add_filter('wp_nav_menu_first_items', 'userf_dynamic_nav_menu');
Ini hanya berfungsi sebagian, karena item menu memang berubah, tetapi tag kondisional diabaikan. Saya kira ini masuk akal karena saat di mana filter diterapkan.
b. Fungsi menu nav kustom : Saya mencoba membuat fungsi menu kustom nav saya sendiri untuk dapat menambahkan argumen kecualikan ke array $ default dan menggunakan kode yang sedikit dimodifikasi ini wp_list_pages
untuk mengisi argumen tambahan:
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
Ada ide?
sumber
exclude
argumen juga, tetapi, berlawanan denganwp_list_pages
dan banyak fungsi WP lainnya,wp_nav_menu
tidak termasuk satu. Jadi, bahkan jika saya menentukan satu ketika memanggil menu atau di walker, itu tidak akan dijemput di dalamwp_nav_menu
, bukan?Jawaban:
Metode 1
Anda dapat menambahkan konstruktor ke Walker kustom Anda untuk menyimpan beberapa argumen pengecualian tambahan, seperti:
Atau jatuhkan konstruktor dan atur
$exclude
propertinya sebelum melewatinya sebagai alat bantu jalan agarwp_nav_menu()
suka:Bergantung pada apa yang Anda kecualikan, berikan formulir yang benar untuk pengecualian.
Metode 2
Ini adalah bagaimana Anda akan melakukan ini dengan menghubungkan ke
wp_get_nav_menu_items
filter.Catatan:
object_id
adalah objek yang ditunjukkan menu, sedangkanID
ID menu berbeda.Beri tau aku isi pikiranmu.
sumber
in_array
fungsi. Apakah saya melakukan sesuatu yang salah?$exclude
properti harus array. Jadi pastikan Anda mengirimkan array ke konstruktor, atau perhatikan kode yang diperbarui dalam jawaban saya. Khusus typecast untuk$this->exclude
, kalau-kalau array tidak lulus.$exclude = array ('4', '7');
dan menggunakan siput juga, tetapi tidak memiliki efek pada output walker. Saya akan mencoba pendekatan kedua dan memberi tahu Anda.Apakah ini membantu
sebagai contoh
sumber
wp_nav_menu
tidak memiliki argumen "mengecualikan", tetapi saya bisa saja salah.wp_get_nav_menu_items
tidak akan mengambil gambar karena tag img tidak disimpan dalam menu kustom yang sebenarnya (hanya nama file mereka di bidang deskripsi, misalnya, "image1.png" ). Walker kustom adalah yang memungkinkan saya untuk memasukkan tag img di output menu.