Navigazione Precedente/Successiva per le pagine figlie?
Come posso ottenere una navigazione Precedente / Successiva che navighi solo tra le pagine figlie della pagina corrente?
Intendo ad esempio url.com/pagina/figlia1, url.com/pagina/figlia2 e così via..
Ho cercato molto ma sono ancora confuso.
Sembra che non sia possibile farlo secondo WordPress (consigliano plugin..)

Ecco qui, completamente funzionante:
<?php
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
$pages[] += $page->ID;
}
$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>
<div class="navigation">
<?php if (!empty($prevID)) { ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>">Precedente</a>
</div>
<?php }
if (!empty($nextID)) { ?>
<div class="Next">
<a href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>">Successivo</a>
</div>
<?php } ?>
</div>
C'è una piccola cosa estetica da sistemare, ovvero i link "Precedente" e "Successivo" dovrebbero essere sempre visibili, indipendentemente dal fatto che ci siano altre pagine o meno...

Non testato, ma dovrebbe funzionare:
Prima usa get_pages
per trovare tutte le altre pagine (o CPT) con lo stesso genitore della pagina corrente. Poi trova le pagine 'precedente' e 'successiva'.
function wpse5422_the_page_siblings(){
$post_id = get_the_ID();
$parent_id = wp_get_post_parent_id($post_id);
$post_type = get_post_type($post_id);
$sibling_list = get_pages(array(
'sort_column'=>'menu_order',
'sort_order' =>'asc',
'child_of' =>$parent_id,
'post_type'=> $post_type
));
if( !$sibling_list || is_wp_error($sibling_list) )
return false;
$pages = array();
foreach ($sibling_list as $sibling ) {
$pages[] = $sibling->ID;
}
$current = array_search($post_id, $pages);
$prevID = isset($pages[$current-1]) ? $pages[$current-1] : false;
$nextID = isset($pages[$current+1]) ? $pages[$current+1] : false;
echo wpse5422_display_prev_next($prevID, $nextID);
}
La funzione sopra deve essere usata all'interno del loop - prende la pagina corrente (o qualsiasi post type gerarchico) e trova le pagine sorelle precedente e successiva (cioè con lo stesso genitore della pagina corrente) secondo il loro ordine nel menu (questo può essere cambiato in data, o titolo).
Poi usa la seguente funzione che prende due ID come argomento ed è semplicemente responsabile per produrre l'output:
function wpse5422_display_prev_next($prevID=false, $nextID=false){
if( empty($prevID) && empty($nextID) )
return false;
$html = '<div class="navigation">';
if( !empty($prevID) ){
$html .= '<div class="alignleft">';
$html .= '<a href="'.get_permalink($prevID).'">Precedente</a>';
$html .= '</div>';
}
if( !empty($nextID) ){
$html .= '<div class="alignright">';
$html .= '<a href="'.get_permalink($nextID).'">Successivo</a>';
$html .= '</div>';
}
$html .= '</div><!-- .navigation -->';
return $html;
}
Dove inserire questo codice
Idealmente dovresti crearne un plugin. Funzionerà in functions.php - ma in realtà, non dovrebbe stare lì.
Utilizzo
All'interno del Loop, dove vuoi visualizzare i link alle pagine: wpse5422_the_page_siblings();
.

Ottimo hack, ha fatto esattamente quello che cercavo. Pensavo che alcuni di voi potrebbero essere interessati a ciò che ho aggiunto, ovvero: link alternativi
- alla prima pagina figlia quando stai navigando la pagina genitore
- al genitore quando stai navigando la prima pagina figlia
La navigazione non viene visualizzata quando non necessaria, lo stile si adatta a quello che il tema Twenty Thirteen applica alla navigazione tra articoli.
<?php // mostra la nav solo se ci sono pagine figlie
if ($post->post_parent) { // si applica solo alle pagine figlie
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
$pages[] += $page->ID;
}
$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>
<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
<?php if (!empty($prevID)) { /* se stiamo navigando il primo figlio, allora link alla pagina genitore */ ?>
<a rel="prev" href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>"><span class="meta-nav">←</span> <?php echo get_the_title($prevID); ?></a>
<?php }
else { // altrimenti, link al figlio precedente ?>
<a rel="prev" href="<?php echo get_permalink($post->post_parent); ?>"><span class="meta-nav">←</span> <?php echo get_the_title($post->post_parent); ?></a>
<?php }
if (!empty($nextID)) { ?>
<a rel="next" href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>"><?php echo get_the_title($nextID); ?> <span class="meta-nav">→</span></a>
<?php } ?>
</div>
</nav>
<?php }
else { // se stiamo navigando la pagina genitore, allora link al primo figlio
$child_pages = get_pages("child_of=".$post->ID."&parent=".$post->ID."&sort_column=menu_order&sort_order=asc");
$first_child = $child_pages[0]; ?>
<?php if (!empty($first_child)) { ?>
<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
<a rel="next" href="<?php echo get_permalink($first_child->ID); ?>"><?php echo get_the_title($first_child->ID); ?> <span class="meta-nav">→</span></a>
</div>

La soluzione 'wpse5422_the_page_siblings()' funziona alla grande, non posso commentare perché la mia reputazione è troppo bassa, ma la mia unica modifica è rendere questa riga:
'sort_column'=>'menu_order',
In questo modo:
'sort_column'=>'menu_order title',
In questo modo, se l'utente lascia l'ordine di ordinamento di ogni pagina a 0, verrà utilizzato l'ordinamento alfabetico per titolo della pagina.
Grazie!

Potresti trovare la pagina genitore del post corrente utilizzando post->parent_page, quindi inserirlo in get_page_children, ottenendo tutti i fratelli della pagina genitore, e poi trovare gli elementi successivi e precedenti nell'array che viene restituito.

Se sei disposto a utilizzare un plugin, cosa che personalmente consiglio per questo tipo di funzionalità, il plugin Ambrosite Next/Previous Page Link Plus è davvero fantastico. Supporta la funzionalità che stai cercando, e molto altro ancora.

Per mostrare i collegamenti "precedente" e "successivo" indipendentemente dalla presenza di altre pagine, è necessario aggiungere delle istruzioni condizionali: (ho modificato la parte ridondante con elseif)
<div class="navigation">
<?php if (!empty($prevID)) : ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>"
title="<?php echo get_the_title($prevID); ?>">Precedente</a>
</div>
<?php else : ?>
<div class="previous disabled">
<a href="#">Precedente</a>
</div>
<?php endif; ?>
<?php if (!empty($nextID)) : ?>
<div class="next">
<a href="<?php echo get_permalink($nextID); ?>"
title="<?php echo get_the_title($nextID); ?>">Successivo</a>
</div>
<?php else : ?>
<div class="next disabled">
<a href="#">Successivo</a>
</div>
<?php endif; ?>
</div>

Perché il else
vuoto? Perché usare elseif
se la seconda condizione è esattamente l'opposto della prima? Un semplice costrutto if / else
sarebbe sufficiente qui.
