wake-up-neo.net

Zeigen Sie nur eine Ebene von untergeordneten Seiten an, wp_list_pages woe

Ich arbeite an einer Site mit einer ziemlich großen Seitenstruktur, die einige Ebenen tief ist - in einigen Abschnitten gibt es viele Seiten.

Das Grundsetup sieht ungefähr so ​​aus ...

 Elternteil 
 Elternteil 
 Elternteil 
 - Kind 
 - Kind 
 - Enkelkind 
 - Enkelkind 
 - Enkelkind 
 --- Urgroßkind 
 - Kind 
 - Kind 
 - Enkelkind 
 - Enkelkind 
 --Großkind 
 --- Urgroßkind 
 - Kind 
 Elternteil 
 - Kind 
 Elternteil 
 Elternteil 
 - Kind 
 - Kind 
 - Enkelkind 
 --- Urgroßkind 
 - Enkelkind 

Sie bekommen das Bild - stellen Sie sich einfach viel mehr Seiten vor!

Meine normale Lösung von Untermenüs funktioniert normal (direkt aus dem Codex entnommen), da ich an viel kleineren Sites arbeite. Diese Seite führt zu einem sehr langen Menü, das viel zu groß ist, um nützlich zu sein.

Ich möchte nur die Ebene direkt unterhalb der Seite anzeigen, die gerade angezeigt wird. Grundsätzlich ein Menü 'In diesem Abschnitt ...'.

Egal welche Kombination von wp_list_pages-Snippet ich gefunden habe, ich konnte nur alles oder nichts bekommen.

Da in einigen Abschnitten keine Kinder vorhanden sind, müssen nur die Links der obersten Ebene angezeigt werden, wenn keine Kinder vorhanden sind.

Hoffentlich macht das Sinn - ich habe mir den ganzen Tag über die Haare ausgerissen! Jede Hilfe sehr geschätzt!

BEARBEITEN

Richtig, ich werde es hier anzeigen. Sorry, dass du ein Noob bist!

Vielen Dank an @ chip-bennet, der mich so weit gebracht hat!

Ich habe jetzt diesen Code, der fast alles macht, was ich dazu brauche.

$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;

Dies funktioniert genau so, wie ich es möchte, bis ich den unteren Rand des Baums erreicht habe und nichts mehr ausgegeben wird.

Chip hat mir den Code erneut gegeben, um die Kollegen auf der Seite zu zeigen, anstatt nach mehr Kindern zu suchen. Aufgrund meiner mangelnden PHP Fähigkeiten habe ich jedoch Probleme, ihn diesem Code hinzuzufügen.

5
a_kc

Dies sollte funktioniert nur mit den verfügbaren Argument-Array-Parametern für wp_list_pages() : Insbesondere depth und child_of.

So zeigen Sie eine Hierarchieebene für untergeordnete Seiten der aktuellen Seite an:

<?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
) );
?>

Es sollte nicht erforderlich sein, auf eine benutzerdefinierte Walker-Klasse zurückzugreifen.

EDIT

Um auch die Links der obersten Ebene anzuzeigen, ändern Sie einfach einige der Parameter:

<?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
) );
?>

Beachten Sie die Änderung von 'child_of' => $post->ID in 'child_of' => $post->post_parent, die Seiten der übergeordneten Seite der aktuellen Seite enthält, und die Änderung von 'depth' => 1 in 'depth' => 2, die die Geschwister der aktuellen Seite und ihre untergeordneten Seiten enthält.

EDIT 2

Okay, hier ist, wie ich mit dem Code umgehen würde, den Sie gerade hinzugefügt haben. Zuerst würde ich ein richtiges Array anstelle einer Array-Zeichenfolge verwenden. Dann würde ich nach context/child-pages before fragen, um das Argument-Array wp_list_pages() zu erstellen, und dann einfach einmal wp_list_pages() aufrufen:

// 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 );

Wir benötigen komplexeren Code, wenn Sie separate Listen ausgeben müssen.

8
Chip Bennett

Nun, Sie können das depth-Argument verwenden, um zu steuern, wie viele Ebenen tief Sie anzeigen möchten, und ich habe einen SubMenu-Walker erstellt, der das Menü beginnend mit den direkten untergeordneten Elementen der aktuellen Seite anzeigt. 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 );
  }

Und Verwendung (ich benutze es tatsächlich in der Seitenleiste):

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

Ich habe eine Funktion erstellt, die die wp_list_pages () verwendet, um dies zu erreichen. Passen Sie die Parameter an und schon sind Sie fertig.

Kern

0
Simon

Dies ist ein Problem, das ich ziemlich oft sehe. Ich denke, dass die WP_List_Pages-Lösungen, die ich überall sehe, ein bisschen altmodisch sind, jetzt wo Wordpress einen richtigen Menü-Manager hat (Aussehen -> Menüs).

Ich habe zahlreiche Lösungen ausprobiert, darunter einige Plugins/Widgets und Walker wie die oben genannten. Ich war noch nie sehr zufrieden mit den verfügbaren Lösungen. Ich habe mein eigenes Plugin erstellt, das diese sekundären Menüs so behandelt, wie ich es vorgezogen habe und es gewohnt bin. Wenn Sie das Menü anzeigen, können Sie eine Start_Tiefe festlegen, um das Menü darüber zu informieren, dass eine bestimmte Anzahl von "Ebenen" über Ihrer aktuellen Seite ignoriert werden soll.

Für Ihre Anforderungen würden Sie also start_depth auf 1 setzen und die Navigationselemente der obersten Ebene beim Anzeigen Ihres Menüs automatisch ignorieren.

Ich nenne das Plugin WP Nav Plus, weil es auf der aktuellen Leistung und den Optionen von wp_nav_menu aufbaut, nur mit dem zusätzlichen Argument start_depth zum Anzeigen von Untermenüs.

Für alle Interessierten ist es auf meiner Website verfügbar: https://mattkeys.me/products/wp-nav-plus/

0
Matt Keys