我尝试查找有关如何从自定义菜单中排除/删除导航菜单项的信息,而我发现的唯一线程没有任何对我有用的答案。
1.背景:
我在网站上使用WP自定义菜单(wp_nav_menu)和jqDock组合了一个Dock菜单。由于jqDock需要连续的图像或图像链接来发挥其魔力,因此我使用了自定义的Walker,因此导航菜单HTML输出看起来像这样:
<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>
我的自定义沃克代码是:
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 .= "";
}
}
然后,jqDock脚本捕获菜单ID(“菜单优先”),并将wp_nav_menu输出替换为Dock菜单。Dock菜单的HTML输出根据加载jqDock时指定的选项而变化。
2.问题:
我不想根据用户在网站上的位置显示(即排除)某些菜单项。例如,我只想在用户不在主页中时显示主页项,而在用户不在时显示随机帖子项。
3.废弃的解决方案:
一种。多个菜单:注册并创建多个菜单,然后有条件地调用它们是可行的;但是,出于多种原因,我认为这既不是理想的解决方案也不是干净的解决方案。另外,多个菜单也不容易维护或更新。
b。正则表达式搜索和替换:由于HTML输出已修改,因此每次更改jqDock选项时,这可能迫使我更改needle参数。
C。CSS'display '属性:通过CSS display属性隐藏项目是可行的,但是由于必须将其应用于jqDock菜单输出,因此会影响菜单的视觉呈现。
4.失败的解决方案:
一种。过滤到wp_nav_menu_items:我尝试捕获'$ items'变量(字符串),并使用以下代码通过条件标签为其分配不同的值:
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');
这仅部分起作用,因为菜单项确实发生了变化,但是条件标签被忽略了。我认为这是有道理的,因为应用了滤镜的那一刻。
b。自定义导航菜单功能:我尝试创建自己的自定义导航菜单功能,以便能够向$ defaults数组中添加一个exclude参数,并使用此经过稍微修改的代码wp_list_pages
填充其他参数:
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
有任何想法吗?
exclude
参数,但是wp_list_pages
与许多其他WP函数相反,wp_nav_menu
它不包含一个参数。因此,即使我在调用菜单时或在助行器中确实指定了一个菜单,也不会在菜单中找到wp_nav_menu
它,对吗?