web-dev-qa-db-fra.com

Afficher un seul niveau de pages enfants, wp_list_pages woe

Je travaille sur un site qui a une structure de page assez grande à plusieurs niveaux - dans certaines sections, il y a beaucoup de pages.

La configuration de base est quelque chose comme ça ...

 Parent 
 Parent 
 Parent 
 - Enfant 
 - Enfant 
 - Petit-enfant 
 - Petit-enfant 
 - Petit-enfant 
 --- Grand-enfant 
 - Enfant 
 - Enfant 
 - Petit-enfant 
 - Petit-enfant 
 - Grand-enfant 
 --- Grand-enfant 
 - Enfant 
 Parent 
 - Enfant 
 Parent 
 Parent 
 - Enfant 
 - Enfant 
 - Petit-enfant 
 --- Grand-enfant 
 - Petit-enfant 

Vous obtenez l'image - imaginez juste beaucoup plus de pages!

Ma solution normale de sous-menus fonctionne normalement (prise directement du Codex), car je travaille sur des sites beaucoup plus petits. Ce site donne lieu à un menu extrêmement long qui est beaucoup trop grand pour être utile.

Ce que je voudrais faire est simplement d’afficher le niveau directement en dessous de la page en cours d’affichage. Fondamentalement, un menu "Dans cette section ...".

Quelle que soit la combinaison d'extrait de wp_list_pages que j'ai trouvée, je n'ai pu obtenir que tout ou rien.

De plus, étant donné que certaines sections n’ont pas d’enfants, il est nécessaire d’afficher uniquement les liens de niveau supérieur en l’absence d’enfants.

J'espère que cela a du sens - je me suis arraché les cheveux toute la journée pour ça! Toute aide grandement appréciée!

MODIFIER

D'accord, je vais le dire ici. Désolé d'être un noob!

Un immense merci à @ chip-bennet de m'avoir conduit jusque-là!

J'ai maintenant ce code qui fait presque tout ce dont j'ai besoin.

$output = wp_list_pages('echo=0&depth=1&title_li=Sections' );

        if (is_page( )) {

          $page = $post->ID;

          if ($post->post_parent) {
            $page = $post->post_parent;
          }

          $children=wp_list_pages( 'echo=0&child_of=' . $page . '&title_li=' );


          if ($children) {
            $output = wp_list_pages( array(
                // Only pages that are children of the current page
                'child_of' => $post->ID,
                // Only show one level of hierarchy
                'depth' => 1,
                'title_li' => 'In this Section'
            ) );
          }


        } 

        echo $output;

Cela fonctionne exactement comme je veux jusqu'à ce que je touche le bas de l'arbre, quand il ne génère rien.

Chip m'a redonné le code à montrer aux membres de la page plutôt que de rechercher davantage d'enfants. Cependant, mon manque de compétences PHP appropriées signifie que j'ai du mal à l'ajouter à ce code.

5
a_kc

Ceci devrait fonctionne sans rien de plus que les paramètres de tableau d'arguments disponibles pour wp_list_pages() : spécifiquement, depth et child_of.

Pour afficher un niveau de hiérarchie, pour les pages descendantes de la page en cours:

<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
    // Only pages that are children of the current page
    'child_of' => $post->ID,
    // Only show one level of hierarchy
    'depth' => 1
) );
?>

Il ne devrait pas être nécessaire de recourir à une classe de marcheur personnalisée.

EDIT

Pour afficher également les liens de niveau supérieur, modifiez simplement quelques paramètres:

<?php
// Globalize the $post variable;
// probably already available in this context, but just in case...
global $post;
wp_list_pages( array(
    // Only pages that are children of the current page's parent
    'child_of' => $post->post_parent,
    // Only show two level of hierarchy
    'depth' => 2
) );
?>

Notez le changement de 'child_of' => $post->ID en 'child_of' => $post->post_parent, qui inclura les pages de la page parent de la page actuelle, et le changement de 'depth' => 1 en 'depth' => 2, qui inclura les frères et sœurs de la page actuelle et leurs enfants.

EDIT 2

Ok, voici comment je gérerais le code que vous venez d'ajouter. Premièrement, j'utiliserais un tableau approprié, plutôt qu'une chaîne de tableau. Ensuite, je voudrais interroger context/child-pages before pour construire le tableau d'arguments wp_list_pages(), puis il suffit d'appeler wp_list_pages() une fois:

// Use parent page if exists, else use current page    
$child_of_value = ( $post->post_parent ? $post->post_parent : $post->ID );
// Depth of 2 if parent page, else depth of 1
$depth_value = ( $post->post_parent ? 2 : 1 );
// Build argument array
$wp_list_pages_args = array( 
    'child_of' => $child_of_value,
    'depth' => $depth_value,
    'title_li' => 'Sections'
);
// Now, output the result
wp_list_pages( $wp_list_pages_args );

Nous aurons besoin de code plus complexe, si vous devez réellement produire des listes séparées.

8
Chip Bennett

Eh bien, vous pouvez utiliser l'argument de profondeur pour contrôler le nombre de niveaux que vous souhaitez afficher. J'ai créé un programme de navigation Sous-menu, qui affiche le menu à partir des enfants directs de la page en cours. Code:

class My_Walker_Submenu extends Walker_Nav_Menu {


  function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {

    if (! $element)
      return;

    $itemId = null;

    if ( $depth == 0) {
        if (!isset($args[0]->child_of)){
         return;
        }
      foreach ( $children_elements as $id => $children ) {
        $data = get_post_meta ( $id, '_menu_item_object_id', true );
        if ($data == $args [0]->child_of) {
          $itemId = $id;
          break;
        }
      }
      if ($itemId == null) {
        return;
      }
      unset($args [0]->child_of);

      foreach ( $children_elements [$itemId] as $child ) {
        parent::display_element ( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
      }
      return;

    }
    return parent::display_element ( $element, $children_elements, $max_depth, $depth, $args, $output );
  }

Et utilisation (je l’utilise dans la barre latérale en fait):

echo wp_nav_menu( array(
              'container' => '',
              'theme_location' => 'header-menu',
              'walker' => new My_Walker_Submenu(),
              'child_of' => $page->ID, 
              'depth'   => 2
) );
2
Maxim Krizhanovsky

J'ai créé une fonction qui utilise wp_list_pages () pour y parvenir. Tweak les paramètres et vous êtes tous ensemble.

Essentiel

0
Simon

C’est un problème que je vois souvent. Je pense que les solutions WP_List_Pages que je vois un peu partout sont un peu anciennes, maintenant que Wordpress dispose d’un gestionnaire de menus approprié (Apparence -> Menus).

J'ai essayé de nombreuses solutions, y compris des plugins/widgets et des marcheurs comme celui-ci. Je n'ai jamais été très satisfait des solutions disponibles. J'ai créé mon propre plugin qui gère ces menus secondaires de la manière que je préfère et à laquelle je suis habitué. Lors de l’affichage du menu, vous pouvez définir une valeur start_depth afin d’informer le menu de manière à ignorer un certain nombre de "niveaux" au-dessus de votre page actuelle.

Ainsi, pour vos besoins, définissez start_depth sur 1 et ignore automatiquement les éléments de navigation de niveau supérieur lors de l'affichage de votre menu.

J'appelle le plugin WP Nav Plus, car il s'appuie sur la puissance et les options actuelles de wp_nav_menu, en ajoutant simplement l'argument start_depth pour l'affichage des menus enfants.

Pour ceux qui sont intéressés, il est disponible sur mon site web: https://mattkeys.me/products/wp-nav-plus/

0
Matt Keys