Mostrare solo un livello di pagine figlie, problematica con wp_list_pages
Sto lavorando su un sito che ha una struttura di pagine piuttosto ampia su più livelli - in alcune sezioni ci sono molte pagine.
La struttura base è qualcosa del genere...
Genitore Genitore Genitore -Figlio -Figlio --Nipote --Nipote --Nipote ---Pronipote -Figlio -Figlio --Nipote --Nipote --Nipote ---Pronipote -Figlio Genitore -Figlio Genitore Genitore -Figlio -Figlio --Nipote ---Pronipote --Nipote
Avete capito l'idea - immaginatelo con molte più pagine!
La mia soluzione normale dei sottomenu funziona bene normalmente (presa direttamente dal Codex), perché di solito lavoro su siti molto più piccoli. Questo sito risulta in un menu estremamente lungo che è troppo grande per essere utile.
Quello che vorrei fare è mostrare solo il livello direttamente sotto la pagina che si sta visualizzando. In pratica un menu "In questa sezione...".
Non importa quale combinazione di wp_list_pages ho trovato, sono riuscito a ottenere solo tutto o niente.
Inoltre, poiché ci sono alcune sezioni che non hanno figli, deve mostrare i link di primo livello quando non sono presenti figli.
Spero che abbia senso - mi sono strappato i capelli tutto il giorno per questo! Qualsiasi aiuto è molto apprezzato!
MODIFICA
Ok, lo aggiungo qui. Scusate per essere un novizio!
Quindi grazie mille a @chip-bennet per avermi portato fin qui!
Ora ho questo codice che fa quasi tutto ciò di cui ho bisogno.
$output = wp_list_pages('echo=0&depth=1&title_li=Sezioni' );
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(
// Solo pagine che sono figlie della pagina corrente
'child_of' => $post->ID,
// Mostra solo un livello di gerarchia
'depth' => 1,
'title_li' => 'In questa Sezione'
) );
}
}
echo $output;
Questo funziona esattamente come voglio fino a quando non arrivo alla fine dell'albero, quando non produce nessun output.
Chip mi ha dato di nuovo il codice per mostrare le pagine dello stesso livello invece di cercare più figli - tuttavia la mia mancanza di competenze PHP adeguate mi sta impedendo di aggiungerlo a questo codice.

Questo dovrebbe funzionare, utilizzando nient'altro che i parametri disponibili nell'array di argomenti per wp_list_pages()
: nello specifico, depth
e child_of
.
Per visualizzare un livello di gerarchia, per le pagine discendenti della pagina corrente:
<?php
// Globalizza la variabile $post;
// probabilmente già disponibile in questo contesto, ma per sicurezza...
global $post;
wp_list_pages( array(
// Solo pagine che sono figlie della pagina corrente
'child_of' => $post->ID,
// Mostra solo un livello di gerarchia
'depth' => 1
) );
?>
Non dovrebbe essere necessario ricorrere a una classe walker personalizzata.
MODIFICA
Per mostrare anche i link di livello superiore, basta cambiare un paio di parametri:
<?php
// Globalizza la variabile $post;
// probabilmente già disponibile in questo contesto, ma per sicurezza...
global $post;
wp_list_pages( array(
// Solo pagine che sono figlie del genitore della pagina corrente
'child_of' => $post->post_parent,
// Mostra due livelli di gerarchia
'depth' => 2
) );
?>
Nota il cambiamento da 'child_of' => $post->ID
a 'child_of' => $post->post_parent
, che includerà le pagine del genitore della pagina corrente, e il cambiamento da 'depth' => 1
a 'depth' => 2
, che includerà i fratelli della pagina corrente e i loro figli.
MODIFICA 2
Ok, ecco come gestirei il codice che hai appena aggiunto. Per prima cosa, userei un array corretto, piuttosto che una stringa di array. Poi, farei una query per il contesto/le pagine figlie prima di costruire l'array di argomenti per wp_list_pages()
, quindi chiamerei wp_list_pages()
una sola volta:
// Usa la pagina genitore se esiste, altrimenti usa la pagina corrente
$child_of_value = ( $post->post_parent ? $post->post_parent : $post->ID );
// Profondità di 2 se c'è una pagina genitore, altrimenti profondità di 1
$depth_value = ( $post->post_parent ? 2 : 1 );
// Costruisci l'array di argomenti
$wp_list_pages_args = array(
'child_of' => $child_of_value,
'depth' => $depth_value,
'title_li' => 'Sezioni'
);
// Ora, mostra il risultato
wp_list_pages( $wp_list_pages_args );
Avremo bisogno di un codice più complesso, se effettivamente hai bisogno di mostrare liste separate.

Fantastico, questo mi ha sicuramente messo sulla strada giusta!
Usando una combinazione da un altro pezzo di codice sono riuscito a fargli fare il 90% di quello che mi serve...

Ho impostato il codice in modo che quando non ci sono pagine figlie mostri le pagine di livello superiore. Questo è ottimo, fino a quando non raggiunge il fondo della struttura - attualmente in quel caso non mostra nulla.
Idealmente dovrebbe mostrare le pagine allo stesso livello (peer), o in alternativa i genitori.

Non posso pubblicare facilmente il codice qui, vero?
Fondamentalmente, riesco a capire come funziona tutto! Purtroppo sono molto orientato al frontend e la mia mancanza di conoscenza del PHP mi impedisce di mettere tutto insieme!

Cos'è quello? Hai bisogno che lo aggiunga alla tua domanda originale? È codice funzionante/non funzionante?

Ho aggiornato il post per aiutare a chiarire un po' di più che il sito è in fase di sviluppo all'indirizzo http://cheshirewestlscb-org-uk.temp.connectedcheshire.org.uk/?page_id=365 (questo è un esempio in fondo alla struttura).

Bene, puoi utilizzare l'argomento depth per controllare quanti livelli in profondità desideri mostrare, e ho creato un SubMenu walker, che mostra il menu a partire dai figli diretti della pagina corrente. Codice:
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 );
}
E l'utilizzo (lo sto usando effettivamente nella sidebar):
echo wp_nav_menu( array(
'container' => '',
'theme_location' => 'header-menu',
'walker' => new My_Walker_Submenu(),
'child_of' => $page->ID,
'depth' => 2
) );

Questo è un problema che vedo sorgere abbastanza spesso. Penso che le soluzioni basate su WP_List_Pages che si trovano in giro siano un po' datate ora che Wordpress ha un gestionale di menu vero e proprio (Aspetto -> Menu).
Ho provato numerose soluzioni inclusi alcuni plugin/widget e walker come quello sopra. Non sono mai stato molto soddisfatto delle soluzioni disponibili. Ho creato il mio plugin che gestisce questi menu secondari nel modo che preferisco e a cui sono abituato. Quando visualizzi il menu puoi impostare un start_depth per far ignorare al menu un certo numero di 'livelli' sopra la pagina corrente.
Quindi per le tue esigenze imposteresti start_depth a 1, e ignorerebbe automaticamente gli elementi di navigazione di livello superiore quando visualizzi il tuo menu.
Ho chiamato il plugin WP Nav Plus perché si basa sulla potenza e le opzioni attuali di wp_nav_menu, solo con l'aggiunta dell'argomento start_depth per visualizzare i menu figli.
Per chi fosse interessato è disponibile sul mio sito: https://mattkeys.me/products/wp-nav-plus/

Ho creato una funzione che utilizza wp_list_pages() per ottenere questo risultato. Modifica i parametri e il gioco è fatto.
