Afișarea unui singur nivel de pagini copil în wp_list_pages WordPress

24 oct. 2011, 17:05:36
Vizualizări: 25.1K
Voturi: 5

Lucrez la un site care are o structură destul de mare de pagini pe mai multe niveluri - în unele secțiuni există multe pagini.

Structura de bază arată cam așa...

Părinte
Părinte 
Părinte
-Copil
-Copil
--Nepot
--Nepot
--Nepot
---Strănepot
-Copil
-Copil
--Nepot
--Nepot
--Nepot
---Strănepot
-Copil
Părinte
-Copil
Părinte
Părinte
-Copil
-Copil
--Nepot
---Strănepot
--Nepot

Înțelegeți ideea - imaginați-vă mult mai multe pagini!

Soluția mea obișnuită cu submeniuri funcționează bine în mod normal (luată direct din Codex), pentru că lucrez pe site-uri mult mai mici. Acest site rezultă într-un meniu extrem de lung care este prea mare pentru a fi util.

Ceea ce aș dori să fac este să afișez doar nivelul direct sub pagina care este vizualizată în prezent. Practic un meniu de tip 'În această secțiune...'.

Indiferent ce combinație de cod wp_list_pages am găsit, am reușit să obțin doar totul sau nimic.

De asemenea, deoarece există unele secțiuni care nu au pagini copil, trebuie să afișeze doar linkurile de nivel superior când nu există pagini copil.

Sper că are sens - mi-am smuls părul toată ziua din cauza asta! Orice ajutor este apreciat!

EDITARE

Bine, voi adăuga aici. Îmi cer scuze că sunt începător!

Așadar mulțumiri imense lui @chip-bennet pentru că m-a ajutat să ajung până aici!

Acum am acest cod care face aproape tot ce am nevoie.

$output = wp_list_pages('echo=0&depth=1&title_li=Secțiuni' );

        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(
                // Doar paginile care sunt copii ai paginii curente
                'child_of' => $post->ID,
                // Arată doar un nivel de ierarhie
                'depth' => 1,
                'title_li' => 'În această Secțiune'
            ) );
          }


        } 

        echo $output;

Acest cod funcționează exact așa cum vreau până ajung la baza arborelui, când nu afișează nimic.

Chip mi-a dat din nou codul pentru a afișa paginile de același nivel în loc să caute mai mulți copii - totuși, lipsa mea de abilități PHP adecvate îmi face dificilă adăugarea acestuia la acest cod.

0
Toate răspunsurile la întrebare 4
9

Acest lucru ar trebui să funcționeze, folosind doar parametrii disponibili în array-ul de argumente pentru wp_list_pages(): în special, depth și child_of.

Pentru a afișa un nivel de ierarhie, pentru paginile descendente ale paginii curente:

<?php
// Globalizează variabila $post;
// probabil deja disponibilă în acest context, dar doar pentru siguranță...
global $post;
wp_list_pages( array(
    // Doar paginile care sunt copii ale paginii curente
    'child_of' => $post->ID,
    // Afișează doar un nivel de ierarhie
    'depth' => 1
) );
?>

Nu ar trebui să fie nevoie să recurgi la o clasă custom walker.

EDIT

Pentru a afișa și link-urile de nivel superior, schimbă doar câțiva parametri:

<?php
// Globalizează variabila $post;
// probabil deja disponibilă în acest context, dar doar pentru siguranță...
global $post;
wp_list_pages( array(
    // Doar paginile care sunt copii ale părintelui paginii curente
    'child_of' => $post->post_parent,
    // Afișează două niveluri de ierarhie
    'depth' => 2
) );
?>

Observă schimbarea de la 'child_of' => $post->ID la 'child_of' => $post->post_parent, care va include paginile părintelui paginii curente, și schimbarea de la 'depth' => 1 la 'depth' => 2, care va include frații paginii curente și copiii acestora.

EDIT 2

OK, iată cum aș gestiona codul pe care l-ai adăugat. În primul rând, aș folosi un array propriu-zis, în loc de un șir de caractere reprezentând un array. Apoi, aș interoga pentru context/pagini copii înainte de a construi array-ul de argumente pentru wp_list_pages(), apoi aș apela wp_list_pages() o singură dată:

// Folosește pagina părinte dacă există, altfel folosește pagina curentă    
$child_of_value = ( $post->post_parent ? $post->post_parent : $post->ID );
// Adâncime de 2 dacă există pagină părinte, altfel adâncime de 1
$depth_value = ( $post->post_parent ? 2 : 1 );
// Construiește array-ul de argumente
$wp_list_pages_args = array( 
    'child_of' => $child_of_value,
    'depth' => $depth_value,
    'title_li' => 'Secțiuni'
);
// Acum, afișează rezultatul
wp_list_pages( $wp_list_pages_args );

Vom avea nevoie de cod mai complex dacă chiar trebuie să afișezi liste separate.

24 oct. 2011 17:28:08
Comentarii

Minunat, asta m-a pus cu siguranță pe drumul cel bun!

Folosind o combinație dintr-un alt fragment de cod, am reușit să facă aproximativ 90% din ceea ce am nevoie...

a_kc a_kc
24 oct. 2011 17:47:32

Deci, care sunt cele 10% care îți lipsesc? :)

Chip Bennett Chip Bennett
24 oct. 2011 17:50:03

Am configurat astfel încât atunci când nu există pagini copil, să afișeze paginile de nivel superior. Este minunat, până când ajunge la baza ierarhiei - moment în care acum nu afișează nimic.

În mod ideal, ar trebui să listeze fie paginile de același nivel (peer), fie, în caz contrar, paginile părinte.

a_kc a_kc
24 oct. 2011 18:04:43

Vezi răspunsul actualizat. :)

Chip Bennett Chip Bennett
24 oct. 2011 18:27:20

Nu pot posta codul aici ușor, nu-i așa?

Practic, înțeleg cum funcționează totul! Din păcate, sunt mai mult pe partea de frontend, iar lipsa mea de cunoștințe PHP mă împiedică să le pun cap la cap!

a_kc a_kc
24 oct. 2011 18:47:45

Ce este asta? Ai nevoie să-l adaug la întrebarea ta originală? Este cod funcțional sau nefuncțional?

Chip Bennett Chip Bennett
24 oct. 2011 18:50:00

Am actualizat postarea pentru a ajuta la clarificare, site-ul este în stadiu de dezvoltare la http://cheshirewestlscb-org-uk.temp.connectedcheshire.org.uk/?page_id=365 (acesta este un exemplu din partea de jos a structurii).

a_kc a_kc
24 oct. 2011 19:11:26

Bine, vezi răspunsul actualizat (din nou)...

Chip Bennett Chip Bennett
24 oct. 2011 19:23:52

Acum este perfect! Domnule, sunteți un gentleman și un învățat! Sau altfel spus, într-un mod vechi, asta este foarte amabil din partea dumneavoastră :D

a_kc a_kc
25 oct. 2011 11:40:38
Arată celelalte 4 comentarii
0

Ei bine, poți folosi argumentul depth pentru a controla câte niveluri adâncime dorești să afișezi, iar eu am creat un SubMenu walker, care afișează meniul începând de la copiii direcți ai paginii curente. Cod:

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

Și utilizarea (o folosesc de fapt în bara laterală):

echo wp_nav_menu( array(
              'container' => '',
              'theme_location' => 'header-menu',
              'walker' => new My_Walker_Submenu(),
              'child_of' => $page->ID, 
              'depth'   => 2
) );
24 oct. 2011 17:14:30
0

Acesta este o problemă pe care o întâlnesc destul de des. Cred că soluțiile bazate pe WP_List_Pages pe care le văd peste tot sunt puțin învechite acum că WordPress are un manager de meniuri propriu-zis (Aspect -> Meniuri).

Am încercat numeroase soluții, inclusiv unele plugin-uri/widget-uri și walkere precum cel menționat mai sus. Niciodată nu am fost prea mulțumit de soluțiile disponibile. Am creat propriul meu plugin care gestionează aceste meniuri secundare în modul pe care îl prefer și la care sunt obișnuit. Când afișezi meniul, poți seta un start_depth pentru a ignora un anumit număr de 'niveluri' deasupra paginii curente.

Deci, pentru nevoile tale, ai seta start_depth la 1, iar acesta ar ignora automat elementele de navigare de nivel superior atunci când afișează meniul tău.

Am numit plugin-ul WP Nav Plus deoarece se bazează pe puterea și opțiunile existente ale wp_nav_menu, doar cu adăugarea argumentului start_depth pentru afișarea meniurilor copil.

Pentru cei interesați, este disponibil pe site-ul meu: https://mattkeys.me/products/wp-nav-plus/

19 mai 2013 22:50:42
0

Am creat o funcție care folosește wp_list_pages() pentru a realiza acest lucru. Modifică parametrii și ești gata.

Gist

19 feb. 2017 15:37:58