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?
la source
exclude
argument, mais, contrairement à dewp_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érieurwp_nav_menu
, n'est-ce pas?Réponses:
Méthode 1
Vous pouvez ajouter un constructeur à votre Walker personnalisé pour stocker des arguments d'exclusion supplémentaires, comme:
Ou déposez le constructeur et définissez sa
$exclude
propriété avant de le passer en tant que marcheur pour l'wp_nav_menu()
aimer ainsi:Selon ce que vous excluez, fournissez le bon formulaire à exclure.
Méthode 2
C'est ainsi que vous vous y prendrez en vous connectant au
wp_get_nav_menu_items
filtre.Remarque:
object_id
est l'objet vers lequel le menu pointe, tandis queID
l'ID du menu est différent.Dis moi ce que tu penses.
la source
in_array
fonction. Est-ce que je fais quelque chose de mal?$exclude
propriété doit être un tableau. Assurez-vous donc que vous passez un tableau dans le constructeur, ou regardez le code mis à jour dans ma réponse. Plus précisément le transtypage pour$this->exclude
, juste au cas où un tableau ne serait pas transmis.$exclude = array ('4', '7');
et d'utiliser les slugs aussi, mais cela n'a aucun effet sur la sortie du déambulateur. Je vais essayer la deuxième approche et je vous le ferai savoir.est-ce que cela aide
par exemple
la source
wp_nav_menu
n'a pas d'argument "exclure", mais je peux me tromper.wp_get_nav_menu_items
ne récupérera pas les images car les balises img ne sont pas stockées dans le menu personnalisé réel (seuls leurs noms de fichiers sont dans le champ de description, par exemple, "image1.png" ). Le marcheur personnalisé est ce qui me permet d'insérer les balises img dans la sortie du menu.