J'ai essayé de chercher des informations sur la façon d'exclure / supprimer des éléments de menu nav des menus personnalisés, et le seul fil que j'ai trouvé n'a pas de réponses qui m'ont été utiles.
1. Origines:
J'ai mis en place un menu Dock en utilisant les menus personnalisés WP (wp_nav_menu) et jqDock sur mon site. Étant donné que jqDock a besoin d'images continues ou de liens d'image pour fonctionner sa magie, j'utilise un marcheur personnalisé de sorte que la sortie HTML du menu de navigation ressemble à ceci:
<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>
Le code de mon déambulateur personnalisé est:
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 .= "";
}
}
Le script jqDock intercepte ensuite l'ID de menu ('menu-first') et remplace la sortie wp_nav_menu par celle du menu Dock. La sortie HTML du menu Dock change en fonction des options spécifiées lors du chargement de jqDock.
2. La question:
Je souhaite ne pas afficher (c'est-à-dire exclure) certains éléments de menu en fonction de l'emplacement de l'utilisateur sur le site. Par exemple, je voudrais afficher uniquement l'élément d'accueil lorsque l'utilisateur n'est pas dans l'accueil et l'élément de publication aléatoire uniquement lorsqu'il l'est.
3. Solutions rejetées:
une. Menus multiples: L' enregistrement et la création de plusieurs menus, puis leur appel conditionnel pourraient fonctionner; cependant, je ne pense pas que ce soit une solution idéale ni propre du tout pour de nombreuses raisons. De plus, plusieurs menus ne sont pas faciles à maintenir ou à mettre à jour.
b. Recherche et remplacement d' expressions régulières : cela peut m'obliger à modifier le paramètre de l' aiguille chaque fois que je modifie les options de jqDock car la sortie HTML est modifiée.
c. Propriété d'affichage CSS: masquer les éléments via la propriété d'affichage CSS fonctionne, mais comme elle doit être appliquée à la sortie du menu jqDock, elle affecte le rendu visuel du menu.
4. Solutions ayant échoué:
une. Filtrer vers wp_nav_menu_items : j'ai essayé d'attraper la variable ($ items) (chaîne) et de lui affecter des valeurs différentes via des balises conditionnelles avec le code suivant:
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');
Cela ne fonctionne que partiellement, car les éléments de menu changent, mais les balises conditionnelles sont ignorées. Je suppose que cela a du sens en raison du moment où le filtre est appliqué.
b. Fonction de menu de navigation personnalisée : J'ai essayé de créer ma propre fonction de menu de navigation personnalisée pour pouvoir ajouter un argument d'exclusion au tableau $ defaults et utiliser ce code légèrement modifié wp_list_pages
pour remplir l'argument supplémentaire:
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
Des idées?
exclude
argument, mais, contrairement à de wp_list_pages
nombreuses autres fonctions WP, wp_nav_menu
n'en inclut pas. Donc, même si j'en spécifie un lors de l'appel du menu ou dans le déambulateur, il ne serait pas récupéré à l'intérieur wp_nav_menu
, n'est-ce pas?