web-dev-qa-db-fra.com

Nav Walker personnalisé pour montrer les frères et sœurs et les enfants de la branche actuelle?

J'ai vu des requêtes très similaires (sinon exactes) à Google dans tout cela, mais semble toujours trouver quelque chose de moins que ce dont j'ai besoin. J'essaie de créer mon menu vertical complet en utilisant wp_nav_menu dans mon modèle. Seulement, je voudrais seulement montrer la branche actuelle, les frères et soeurs et leurs enfants. Une sorte de menu de style accordéon. Je préfère le faire en PHP, sans utiliser CSS ni JQuery.

Exemple de menu complet:

- Home
- Products
   - Cool Item 1
      - Item 1 Details
      - Item 1 Gallery
   - Cool Item 2
      - Item 2 Details
      - Item 2 Gallery
- Services
   - Svc 1
   - Svc 2

Si, par exemple, je suis sur l'élément en cours "Élément cool 1", je souhaite afficher tous les éléments du menu racine, tous les produits, mais uniquement les enfants de "Élément cool 1", pas d'enfants du "Élément cool 2" ou de tout service. Comme ci-dessous:

- Home
- Products
   - Cool Item 1 (-current page-)
      - Item 1 Details
      - Item 1 Gallery
   - Cool Item 2
- Services

Si je clique sur Services, je veux voir:

- Home
- Products
- Services (-current page-)
   - Svc 1
   - Svc 2

Actuellement, dans mon lecteur personnalisé, j'ai la méthode star_el comme suit: (make_menu_item est un affichage de menu typique que vous verriez lors de la recherche de lecteurs)

function start_el(&$output, $item, $depth, $args) {

    // am I on the current Item?
    if($item->current_item_ancestor or $item->current_item_parent or $item->current){
        $cur_branch = true;
    }
    // this works for all current branch items, but not siblings or children
    if( $cur_branch || $depth == 0 ) {
        $output .= $this->make_menu_item($item, $depth, $args);
    } else  {
        // need to know if my parents are in current branch, then OK to show children
        // not sure how to do that from this point?
        if($item->menu_item_parent && $depth > 0) {
            // this currently shows everything, not what I want
            // if this is removed, no children objects show, even under cur_branch
            $output .= $this->make_menu_item($item, $depth, $args);
        }
    }

}

Je sais que cette logique n’est probablement pas la meilleure, mais c’est un début. Je peux facilement dire si je suis dans la "branche courante" du menu, et j'ai configuré $ item-> hasChildren dans la méthode display_elements, mais hasChildren ne me fait aucun bien pour les enfants de current. Il serait très utile que je sache à ce stade si mon objet parent est ou non dans la branche en cours, car je pourrais afficher l'élément de menu ou pas à ce moment-là, ce que je veux.

Je pourrais faire une requête SQL, mais je préfère ne pas le faire. Existe-t-il un moyen d’obtenir des informations sur les parents dans le tableau du promeneur et les objets disponibles ($ item ou $ elements?)? Peut-être que je vais à ce sujet tout faux On dirait qu'il devrait être facile d'obtenir des informations sur les parents, mais appeler get_ancestors () ici me donne un tableau vide.

Merci pour toute aide! Greg

2
gregthegeek

Eh bien, bien que je préfère avoir mon propre lecteur et le contrôle de la navigation, j'ai trouvé un plugin qui fait exactement ce que je veux: Advanced Menu Widget http://wordpress.org/extend/plugins/advanced-menu-widget/

Seulement testé légèrement mais son fonctionnement est conforme aux attentes, il suffit de sélectionner "Un sous-menu strictement lié" dans la configuration du widget de menu. Je devrais noter que, pour d’autres développeurs de thème débutant comme moi, j’avais déjà essayé ce plugin une fois et que je ne savais pas comment le configurer. (impossible de trouver la configuration du widget) Eh bien, cela était uniquement dû au fait que mon thème ne disposait pas encore de barres latérales, donc pas de widgets!

Quoi qu'il en soit, je n'aime pas dépendre d'un plugin pour mon thème de navigation, mais cela fonctionne très bien et je n'ai pas à le construire. :) Problème résolu.

1
gregthegeek