Navigare anterioară/următoare pentru paginile copil ale paginii curente?
Cum pot obține o navigare Anterior / Următor care funcționează doar între paginile copil ale paginii curente?
Mă refer la structura de genul url.com/pagina/copil1, url.com/pagina/copil2 și așa mai departe..
Am căutat mult dar încă nu am găsit soluția.
Se pare că acest lucru nu este posibil conform WordPress (ei recomandă pluginuri..)

În regulă, iată-l, funcționând perfect:
<?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); ?>">Anterior</a>
</div>
<?php }
if (!empty($nextID)) { ?>
<div class="Next">
<a href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>">Următor</a>
</div>
<?php } ?>
</div>
Un mic detaliu cosmetic trebuie rezolvat, și anume faptul că link-urile "Anterior" și "Următor" ar trebui să fie mereu afișate, indiferent dacă există sau nu alte pagini...

Netestat, dar acest cod ar trebui să funcționeze:
Mai întâi folosește get_pages
pentru a găsi toate celelalte pagini (sau tipuri de postări personalizate - CPT) cu același părinte ca pagina curentă. Apoi găsește paginile 'anterioară' și 'următoare'.
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);
}
Funcția de mai sus trebuie utilizată în interiorul loop-ului - ia pagina curentă (sau orice tip de postare ierarhică) și găsește pagina anterioară și următoare din aceeași ramură (adică cu același părinte ca pagina curentă) în funcție de ordinea din meniu (aceasta poate fi schimbată în dată, sau titlu).
Apoi folosește următoarea funcție care primește două ID-uri ca argument și este responsabilă pentru afișarea rezultatului:
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).'">Anterior</a>';
$html .= '</div>';
}
if( !empty($nextID) ){
$html .= '<div class="alignright">';
$html .= '<a href="'.get_permalink($nextID).'">Următor</a>';
$html .= '</div>';
}
$html .= '</div><!-- .navigation -->';
return $html;
}
Unde să plasezi acest cod
În mod ideal ar trebui să creezi un plugin din acesta. Va funcționa și în functions.php - dar pe bune, nu ar trebui să locuiască acolo.
Utilizare
În interiorul Loop-ului, oriunde dorești să afișezi link-urile către pagini: wpse5422_the_page_siblings();
.

Excelent hack, a făcut exact ceea ce căutam. Am crezut că unii dintre voi ați putea fi interesați de ceea ce am adăugat, și anume: link-uri alternative
- către prima pagină copil când navigați pe pagina părinte
- către părinte când navigați pe prima pagină copil
Navigația nu este afișată când nu este necesar, iar stilizarea se potrivește cu cea aplicată de tema twenty-thirteen pentru navigația între articole.
<?php // afișează navigația doar dacă există pagini copii
if ($post->post_parent) { // se aplică doar paginilor copii
$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)) { /* dacă suntem pe prima pagină copil, atunci link către pagina părinte */ ?>
<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 { // altfel, link către pagina copil anterioară ?>
<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 { // dacă suntem pe pagina părinte, atunci link către prima pagină copil
$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>

Soluția 'wpse5422_the_page_siblings()' funcționează excelent, nu pot comenta deoarece reputația mea este prea mică, dar singura mea modificare este să transform această linie:
'sort_column'=>'menu_order',
În aceasta:
'sort_column'=>'menu_order title',
În acest fel, dacă utilizatorul lasă ordinea de sortare pentru fiecare pagină ca 0, aceasta va reveni implicit la sortarea alfabetică după titlul paginii.
Mulțumesc!

Poți găsi pagina părinte a postării curente folosind post->parent_page, apoi să o introduci în get_page_children, obținând toate paginile surori ale paginii părinte, iar apoi să găsești elementele următoare și anterioare din tabloul returnat.

Dacă ești deschis să folosești un plugin, ceea ce personal recomand pentru acest gen de situații, plugin-ul Ambrosite Next/Previous Page Link Plus este destul de impresionant. Acesta suportă funcționalitatea pe care o cauți, plus multe altele.

Pentru a afișa linkurile de "înainte" și "înapoi" independent de existența altor pagini, trebuie să adăugați câteva instrucțiuni condiționale: (am editat partea inutilă cu 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); ?>">Înapoi</a>
</div>
<?php else : ?>
<div class="previous disabled">
<a href="#">Înapoi</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); ?>">Înainte</a>
</div>
<?php else : ?>
<div class="next disabled">
<a href="#">Înainte</a>
</div>
<?php endif; ?>
</div>

De ce else
gol? De ce elseif
deloc, dacă a doua condiție este exact opusul primei? Simple construcții if / else
ar fi suficiente aici.
