Navigazione Precedente/Successiva per le pagine figlie?

7 giu 2012, 03:31:10
Visualizzazioni: 15.5K
Voti: 4

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..)

0
Tutte le risposte alla domanda 7
0

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...

7 giu 2012 17:08:20
0

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();.

7 giu 2012 13:12:25
0

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">&larr;</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">&larr;</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">&rarr;</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">&rarr;</span></a>

</div>

1 mar 2014 18:08:32
0

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!

12 mar 2018 06:13:10
0

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.

7 giu 2012 05:38:27
0

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.

7 giu 2012 05:41:54
2

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>
24 mag 2013 14:38:54
Commenti

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

Johannes Pille Johannes Pille
24 mag 2013 15:12:24

Concordo - scusami - stavo lavorandoci su man mano e sono venuto qui principalmente per la risposta precedente in questa pagina. Ho seguito il tuo consiglio - grazie.

Chris Chris
28 mag 2013 11:42:12