Navegación anterior/siguiente para páginas hijas de la página actual

7 jun 2012, 03:31:10
Vistas: 15.5K
Votos: 4

¿Cómo puedo obtener una navegación Anterior / Siguiente que solo navegue entre las páginas hijas de la página actual?

Me refiero a url.com/pagina/hija1, url.com/pagina/hija2 y así sucesivamente...

He estado buscando mucho pero todavía estoy perdido.

Parece que no se puede hacer según WordPress (ellos recomiendan plugins..)

0
Todas las respuestas a la pregunta 7
0

Muy bien, aquí está, completamente funcional:

<?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 } else { ?>
<div class="previous disabled">
<span>Anterior</span>
</div>
<?php }
if (!empty($nextID)) { ?>
<div class="next">
<a href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>">Siguiente</a>
</div>
<?php } else { ?>
<div class="next disabled">
<span>Siguiente</span>
</div>
<?php } ?>
</div>

Queda un pequeño detalle cosmético por arreglar, y es que los enlaces "Anterior" y "Siguiente" siempre deberían mostrarse, haya o no más páginas disponibles...

7 jun 2012 17:08:20
0

No probado, pero esto debería funcionar:

Primero usa get_pages para encontrar todas las demás páginas (o CPT) con el mismo padre que la página actual. Luego encuentra las páginas 'anterior' y 'siguiente'.

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 función anterior debe usarse dentro del loop - toma la página actual (o cualquier tipo de publicación jerárquica) y encuentra las páginas hermanas anterior y siguiente (es decir, con el mismo padre que la página actual) según su orden de menú (esto se puede cambiar a fecha o título).

Luego utiliza la siguiente función que toma dos IDs como argumento y simplemente se encarga de producir la salida:

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).'">Siguiente</a>';
         $html .= '</div>';
     }

    $html .= '</div><!-- .navigation -->';

    return $html;
}

Dónde colocar este código

Idealmente deberías crear un plugin con él. Funcionará en functions.php, pero realmente no debería estar ahí.

Uso

Dentro del Loop, donde quieras mostrar los enlaces de página: wpse5422_the_page_siblings();.

7 jun 2012 13:12:25
0

Gran truco, hizo exactamente lo que necesitaba. Pensé que a algunos les podría interesar lo que agregué, que es: enlaces alternativos

  • a la primera página hija cuando estás navegando en la página padre
  • al padre cuando estás navegando en la primera página hija

La navegación no se muestra cuando no es necesaria, y el estilo coincide con el que el tema twenty-thirteen aplica a la navegación de entradas.

<?php // mostrar navegación solo si hay páginas hijas
if ($post->post_parent) { // aplica solo a páginas hijas
$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)) { /* si estamos en la primera hija, enlazar a la página padre */ ?>
        <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 { // sino, enlazar a la hija anterior ?>
        <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 { // si estamos en la página padre, enlazar a la primera hija
$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 solución 'wpse5422_the_page_siblings()' funciona muy bien, no puedo comentar porque mi reputación es demasiado baja, pero mi único cambio es hacer que esta línea:

'sort_column'=>'menu_order',

Sea así:

'sort_column'=>'menu_order title',

De esta manera, si el usuario deja el orden de clasificación de cada página como 0, por defecto se ordenará alfabéticamente por el título de la página.

¡Gracias!

12 mar 2018 06:13:10
0

Podrías encontrar la página padre de la publicación actual usando post->parent_page, luego pasarlo a get_page_children, obteniendo todos los hermanos de la página padre, y luego encontrar los elementos anterior y siguiente en el array que es devuelto.

7 jun 2012 05:38:27
0

Si estás abierto a la opción de usar un plugin, lo cual personalmente recomiendo para este tipo de cosas, el plugin Ambrosite Next/Previous Page Link Plus es bastante impresionante. Soporta la funcionalidad que estás buscando, y mucho más.

7 jun 2012 05:41:54
2

Para mostrar enlaces de anterior y siguiente independientemente de si hay más páginas presentes, necesitas agregar algunas declaraciones condicionales: (editado el código condicional redundante)

<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 else : ?>
<div class="previous disabled">
<a href="#">Anterior</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); ?>">Siguiente</a>
</div>
<?php else : ?>
<div class="next disabled">
<a href="#">Siguiente</a>
</div>
<?php endif; ?>
</div>
24 may 2013 14:38:54
Comentarios

¿Por qué el else vacío? ¿Por qué usar elseif en absoluto, si la segunda condición es exactamente lo opuesto a la primera? Un simple if / else sería suficiente aquí.

Johannes Pille Johannes Pille
24 may 2013 15:12:24

Estoy de acuerdo, lo siento por eso. Estaba resolviéndolo sobre la marcha y solo vine aquí por la respuesta anterior en esta página. He seguido tu consejo, gracias.

Chris Chris
28 may 2013 11:42:12