Intenté buscar información sobre cómo excluir / eliminar elementos del menú de navegación de los menús personalizados, y el único hilo que encontré no tenía ninguna respuesta que me fuera útil.
1. Antecedentes:
Creé un menú Dock usando los menús personalizados de WP (wp_nav_menu) y jqDock en mi sitio. Como 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 algo así:
<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>
El código para mi andador personalizado es:
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 .= "";
}
}
El script jqDock luego captura la ID del menú ('menu-first') y reemplaza la salida wp_nav_menu con la del menú 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ú de acuerdo con la ubicación del usuario en el sitio. 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 lo está.
3. Soluciones desechadas:
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.
si. Búsqueda y reemplazo de expresiones regulares: esto podría obligarme a cambiar el parámetro de la aguja cada vez que cambie las opciones de jqDock porque se modifica la salida HTML.
C. Propiedad de 'visualización' de CSS: Ocultar los elementos a través de la propiedad de visualización de CSS funciona, pero dado que debe aplicarse a la salida del menú jqDock, afecta la representación visual del menú.
4. Soluciones perdidos:
a. Filtrar a wp_nav_menu_items : intenté atrapar la variable (cadena) '$ items' y asignarle diferentes valores a través de 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ú cambian, pero las etiquetas condicionales se ignoran. Supongo que esto tiene sentido debido al momento en que se aplica el filtro.
si. 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 $ defaults y usar este código ligeramente modificado 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) );
¿Algunas ideas?
exclude
argumento también, pero, a diferencia de wp_list_pages
muchas otras funciones de WP, wp_nav_menu
no incluye una. Entonces, incluso si especifico uno cuando llamo al menú o en el andador, no lo recogerán dentro wp_nav_menu
, ¿verdad?