Tôi đã cố gắng tìm kiếm thông tin về cách loại trừ / loại bỏ các mục menu điều hướng khỏi các menu tùy chỉnh và chủ đề duy nhất tôi tìm thấy không có bất kỳ câu trả lời nào hữu ích cho tôi.
1. Bối cảnh:
Tôi kết hợp một menu Dock bằng các menu tùy chỉnh WP (wp_nav_menu) và jqDock trên trang web của tôi. Vì jqDock cần hình ảnh liên kết hoặc liên kết hình ảnh để thực hiện phép thuật của mình, tôi sử dụng một trình đi bộ tùy chỉnh để đầu ra HTML của menu điều hướng trông giống như thế này:
<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>
Mã cho walker tùy chỉnh của tôi là:
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 .= "";
}
}
Tập lệnh jqDock sau đó bắt ID menu ('menu-first') và thay thế đầu ra wp_nav_menu bằng menu Dock. Đầu ra HTML của menu Dock thay đổi dựa trên các tùy chọn được chỉ định khi tải jqDock.
2. Câu hỏi:
Tôi muốn không hiển thị (nghĩa là loại trừ) một số mục menu nhất định theo nơi người dùng đang ở trên trang web. Ví dụ: tôi muốn chỉ hiển thị mục Trang chủ khi người dùng không ở trong Trang chủ và mục đăng bài Ngẫu nhiên chỉ khi có.
3. Các giải pháp bị loại bỏ:
a. Menu Mulipl: Đăng ký và tạo nhiều menu và sau đó gọi chúng theo điều kiện có thể hoạt động; tuy nhiên, tôi không nghĩ rằng đây là một lý tưởng hay một giải pháp sạch vì nhiều lý do. Ngoài ra, nhiều menu không dễ bảo trì hoặc cập nhật.
b. Tìm kiếm và thay thế Regex: Điều này có thể buộc tôi thay đổi tham số kim mỗi khi tôi thay đổi tùy chọn jqDock vì đầu ra HTML bị sửa đổi.
c. Thuộc tính 'display' CSS: Ẩn các mục thông qua thuộc tính hiển thị CSS hoạt động, nhưng vì nó phải được áp dụng cho đầu ra menu jqDock, nó ảnh hưởng đến kết xuất trực quan của menu.
4. Giải pháp thất bại:
a. Bộ lọc cho wp_nav_menu_items : Tôi đã thử bắt biến '$ items' (chuỗi) và gán cho nó các giá trị khác nhau thông qua các thẻ có điều kiện với mã sau:
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');
Điều này chỉ hoạt động một phần, vì các mục menu thay đổi, nhưng các thẻ điều kiện bị bỏ qua. Tôi đoán điều này có ý nghĩa vì thời điểm mà bộ lọc được áp dụng.
b. Chức năng menu điều hướng tùy chỉnh : Tôi đã thử tạo chức năng menu điều hướng tùy chỉnh của riêng mình để có thể thêm đối số loại trừ vào mảng $ mặc định và sử dụng mã được sửa đổi một chút này wp_list_pages
để điền vào đối số bổ sung:
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
Có ý kiến gì không?
exclude
đối số quá, nhưng, trái với wp_list_pages
và nhiều hàm WP khác, wp_nav_menu
không bao gồm một đối số. Vì vậy, ngay cả khi tôi chỉ định một cái khi gọi menu hoặc trong khung tập đi, nó sẽ không được chọn bên trong wp_nav_menu
, phải không?