Custom Nav Walker affiche le point de menu actuel, enfants ou frères et sœurs sans enfants

13

Je fouille / cherche depuis des heures et je ne parviens toujours pas à faire fonctionner cela. Je finis donc par céder et demander de l'aide.

J'essaie d'écrire un programme personnalisé qui affiche uniquement les pages des enfants en cours ou, s'il n'y en a pas, affiche les pages des frères et sœurs.

Par exemple, prenez l’arborescence de menu suivante:

  • 1.0
    • 1.2.0
      • 1.3.0
      • 1.3.1
      • 1.3.2
    • 1.2.1
    • 1.2.2
  • 2.0

Supposons que je suis sur la page actuelle 1.2.0. Sur cette page, je veux afficher ses enfants (1.3.0, 1.3.1, 1.3.2)

Cependant, si je suis sur la page 1.2.2, comme il n’a pas d’enfants, il devrait afficher le niveau actuel de ses frères et sœurs, il devrait donc me montrer (1.2.0, 1.2.1, 1.2.2 ).

    
posée jchamb 27.01.2013 - 22:33

2 réponses

4

C’est le navigateur que j’utilisais pour afficher uniquement les enfants de l’élément de menu actuel. Ou les éléments de menu frères et soeurs s’il n’a pas d’enfants.

Des commentaires ont été formulés tout au long de la classe pour expliquer chaque section

<?php

class SH_Child_Only_Walker extends Walker_Nav_Menu {

private $ID;
private $depth;
private $classes = array();
private $child_count = 0;
private $have_current = false;


// Don't start the top level
function start_lvl(&$output, $depth=0, $args=array()) {

    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::start_lvl($output, $depth,$args);
}

// Don't end the top level
function end_lvl(&$output, $depth=0, $args=array()) {
    if( 0 == $depth || $this->depth != $depth )
        return;

    parent::end_lvl($output, $depth,$args);
}

// Don't print top-level elements
function start_el(&$output, $item, $depth=0, $args=array()) {

    $is_current = in_array('current-menu-item', $this->classes);

    if( 0 == $depth || ! $is_current )
        return;

    parent::start_el($output, $item, $depth, $args);
}

function end_el(&$output, $item, $depth=0, $args=array()) {
    if( 0 == $depth )
        return;

    parent::end_el($output, $item, $depth, $args);
}

// Only follow down one branch
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

    // Check if element is in the current tree to display
    $current_element_markers = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor' );
    $this->classes = array_intersect( $current_element_markers, $element->classes );

    // If element has a 'current' class, it is an ancestor of the current element
    $ancestor_of_current = !empty($this->classes);

    // check if the element is the actual page element we are on.
    $is_current = in_array('current-menu-item', $this->classes);

    // if it is the current element
    if($is_current) {

        // set the count / ID / and depth to use in the other functions.
        $this->child_count = ( isset($children_elements[$element->ID]) ) ? count($children_elements[$element->ID]) : 0;
        $this->ID = $element->ID;
        $this->depth = $depth;
        $this->have_current = true;

        if($this->child_count > 0) {

            // if there are children loop through them and display the kids.
            foreach( $children_elements[$element->ID] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        } else {
            // no children so loop through kids of parent item.
            foreach( $children_elements[$element->menu_item_parent] as $child ) {
                parent::display_element( $child, $children_elements, $max_depth, $depth, $args, $output );
            }

        }
    }

    // if depth is zero and not in current tree go to the next element
    if ( 0 == $depth && !$ancestor_of_current)
        return;

    // if we aren't on the current element proceed as normal
    if(! $this->have_current )
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}

Attachez-le comme vous le feriez avec tout autre lecteur personnalisé sur un wp_nav_menu

<?php
wp_nav_menu( array(
    'menu' => 'primary-menu'
    ,'container' => 'nav'
    ,'container_class' => 'subpages'
    ,'depth' => 0
    ,'walker' => new SH_Child_Only_Walker()
 ));
?>
    
réponse donnée jchamb 11.11.2013 - 22:20
0

J'ai eu une expérience similaire. Vous voudrez peut-être penser à déplacer la logique des pages hors du lecteur. Fondamentalement, compilez la hiérarchie de pages actuelle en tant qu’objet. Ensuite, utilisez le paramètre "exclude" dans la fonction wp_nav_menu. Maintenant, les pages exclues dépendent si la page en cours a des enfants. Si aucun enfant ne montre des frères; si les enfants & & ces enfants sont la fin de la ligne montrent des frères et des enfants; si les enfants & & et les petits-enfants existent excluent les frères et montrent des enfants et des petits-enfants.

    
réponse donnée Steve Fischer 21.02.2013 - 13:01

Lire d'autres questions sur les étiquettes