Intenté buscar información sobre cómo excluir / eliminar elementos del menú de navegación de menús personalizados, y el único hilo encontré que no tenía ninguna respuesta que me fuera útil.
1. Antecedentes:
Reuní un menú Dock utilizando los menús personalizados de WP (wp_nav_menu) y jqDock en mi sitio. Ya que jqDock necesita imágenes continuas o enlaces de imágenes para hacer su magia, estoy usando un andador personalizado para que la salida HTML del menú de navegación se vea así:
<div id="menu-first" class="nav">
<a><img src="http://path/to/image-1.png"/></a><a><imgsrc="http://path/to/image-2.png"/></a>
<a><img src="http://path/to/image-3.png"/></a>etc...</div>
Elcódigoparamicaminantepersonalizadoes:
classcustom_nav_walkerextendsWalker_Nav_Menu{var$tree_type=array('post_type','taxonomy','custom');var$db_fields=array('parent'=>'menu_item_parent','id'=>'db_id');functionstart_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 .= "";
}
}
La secuencia de comandos jqDock luego captura el ID de menú ('menu-first') y reemplaza la salida de wp_nav_menu con los menús del Dock. La salida HTML del menú Dock cambia según las opciones especificadas al cargar jqDock.
2. La pregunta:
Me gustaría no mostrar (es decir, excluir) ciertos elementos del menú según el lugar en el que se encuentre el usuario. Por ejemplo, me gustaría mostrar solo el elemento de inicio cuando el usuario no está en el inicio y el elemento de publicación aleatoria solo cuando está.
3. Soluciones descartadas:
a. Múltiples menús: Registrar y crear múltiples menús y luego llamarlos condicionalmente podría funcionar; sin embargo, no creo que esta sea una solución ideal ni limpia en absoluto por muchas razones. Además, los menús múltiples no son fáciles de mantener o actualizar.
b. Regex Search and Replace: Esto podría forzarme a cambiar el parámetro needle cada vez que cambio las opciones de jqDock porque se modifica la salida HTML.
c. Propiedad 'display' de CSS: La ocultación de los elementos a través de la propiedad de visualización de CSS funciona, pero como debe aplicarse a la salida del menú jqDock, afecta la representación visual del menú.
4. Soluciones fallidas:
a. Filtrar a wp_nav_menu_items : intenté capturar la variable (cadena) '$ items' y asignarle valores diferentes mediante etiquetas condicionales con el siguiente código:
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');
Esto funciona solo parcialmente, porque los elementos del menú sí cambian, pero las etiquetas condicionales se ignoran. Supongo que esto tiene sentido debido al momento en que se aplica el filtro.
b. Función de menú de navegación personalizada : intenté crear mi propia función de menú de navegación personalizada para poder agregar un argumento de exclusión a la matriz $ por defecto y usar este código ligeramente modificado de wp_list_pages
para completar el argumento adicional:
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
¿Alguna idea?