Publicaciones paginadas - ¿Cómo usar números y enlaces de anterior/siguiente?

24 dic 2011, 21:04:23
Vistas: 18.8K
Votos: 17

Quiero que wp_link_pages (para publicaciones multipágina) muestre los números de página, la palabra "anterior" antes de esos números y un "siguiente" después. Debería verse así:

Anterior 1, 2, 3, 4 Siguiente

Estoy intentando hacer esto sin usar plugins. Esto es lo que he probado hasta ahora, pero no funciona, solo muestra los números.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Páginas', // Texto antes de los enlaces
    'after'  => '</span>', // Texto después de los enlaces
    'next_or_number'=>'number', // Mostrar números
    'previouspagelink' => 'Anterior', // Texto para enlace anterior
    'nextpagelink'=> 'Siguiente' // Texto para enlace siguiente
)); ?>
0
Todas las respuestas a la pregunta 6
5
14

La función que estás utilizando, wp_link_pages­Codex, no tiene la característica que buscas por defecto.

Sin embargo, puedes extenderla fácilmente usando una función de callback, registrada como un filtro en los argumentos de esa función:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

El filtro modificará entonces los parámetros que se usan en esa función en tiempo real e inyectará los enlaces faltantes a los argumentos prev y next que se muestran a la izquierda y derecha de la lista de enlaces numerados (next_or_number' => 'number'):

/**
 * Añade enlaces prev y next a una lista de enlaces de página numerada
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if ($args['next_or_number'] !== 'next_and_number') 
        return $args; # salir temprano

    $args['next_or_number'] = 'number'; # mantener numeración para la parte principal
    if (!$more)
        return $args; # salir temprano

    if ($page - 1) # hay una página anterior
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page < $numpages) # hay una página siguiente
        $args['after'] = _wp_link_page($page+1)
            . $args['link_before'] . ' ' . $args['nextpagelink'] . $args['link_after'] . '</a>'
            . $args['after']
        ;

    return $args;
}

Uso:

wp_link_pages(array(
    'before' => '<p>' . __('Páginas:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # activar sobrecarga de parámetros
    'nextpagelink' => __('Siguiente'),
    'previouspagelink' => __('Anterior'),
    'pagelink' => '%',
    'echo' => 1 )
);

Si tu tema siempre usa los enlaces prev y next, entonces podrías modificar la función un poco para que sea el comportamiento por defecto cuando se use number (el valor por defecto), así necesitas escribir menos en tus temas.

Esta es una implementación ligeramente diferente a la sugerida por Velvet Blues.

31 dic 2011 19:54:21
Comentarios

Excepto por algunos comentarios y retornos tempranos, la implementación, el nombre de la opción y la explicación son exactamente iguales a los míos. ¿Estoy pasando algo por alto? ¿Qué beneficio ofrece tu solución? Gracias.

Velvet Blues Velvet Blues
31 dic 2011 20:26:19

Probablemente cuando compare el código.

hakre hakre
31 dic 2011 20:34:55

La solución de Hakre está disponible mientras la pregunta esté aquí. Las respuestas completas (= comprensibles sin depender de fuentes externas) siempre son preferidas en StackExchange.

fuxia fuxia
31 dic 2011 20:40:37

La diferencia es que @hakre introdujo un error. En esta línea de código: if (!$args['next_or_number'] == 'next_and_number') le faltan paréntesis, por lo que $args se niega antes de su evaluación lógica, debería ser: if (!($args['next_or_number'] == 'next_and_number')) o mejor if($args['next_or_number']!='next_and_number')

deviato deviato
1 abr 2021 19:53:22

@deviato: gracias por el comentario, adoptado, también con comparación estricta.

hakre hakre
2 abr 2021 10:37:05
1

La función wp_link_pages() solo muestra ya sea texto o números, nunca ambos. Si revisas el código de la función, verás que no hay ninguna opción para cambiar este comportamiento pasando parámetros.

Dicho esto, hay tres formas de hacer esto sin usar un plugin:

  1. Crear tu propia función en el archivo functions.php de tu tema. Funciona, pero tendrías una nueva función.
  2. Usar 2-3 instancias de wp_link_pages(). Un truco muy ineficiente.
  3. Usar un filtro. Método preferido. Ver más abajo.

He escrito un artículo en mi blog sobre cómo hacer esto. Básicamente, uso el filtro wp_link_pages_args y agrego una función en el archivo functions.php que añade una nueva opción 'next_and_number'.

WordPress Hack: Mostrar Números y Enlaces de Siguiente/Anterior con wp_link_pages()

30 dic 2011 16:14:22
Comentarios

Genial... Estaba pensando en algo usando los 4 valores globales, pero nunca llegué a una solución... ¡+1!

Rutwick Gangurde Rutwick Gangurde
30 dic 2011 18:59:58
1

Prueba esto, puedes personalizarlo aún más. Pero debería hacer lo que necesitas :-)

function tp_link_pages() {
    global $page, $numpages;

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
30 dic 2011 19:01:43
Comentarios

¿cómo podemos gestionarlo? https://wordpress.org/support/topic/how-to-manage-wp_link_pages-number-to-own-custom-url?replies=2

o cómo añadir un título-dinámico-personalizado antes del número de página.

Ravi Patel Ravi Patel
7 jul 2016 14:53:48
3

No entiendo cuál es el problema... ¿Tienes algún error?

Esto debería funcionar:

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Páginas',
    'after'            => '</span>',
    'nextpagelink'     => __('Siguiente'),
    'previouspagelink' => __('Anterior')
); 

wp_link_pages($args);
?> 

No necesitas agregar next_or_number ya que number ya es el valor por defecto.

25 dic 2011 23:06:46
Comentarios

Por alguna razón esto no está funcionando, pero me parece correcto. ¿Habrá algún cambio en la versión 3.3 o necesito pegar algo en el archivo functions.php?

AndrettiMilas AndrettiMilas
28 dic 2011 16:55:14

Sí, también probé esto, funciona cuando configuras next_or_number como next. Pero solo muestra los enlaces 'Siguiente' y 'Anterior', ¡no los números!

Rutwick Gangurde Rutwick Gangurde
28 dic 2011 18:53:09

Necesito ambos, como se muestra en el ejemplo.

AndrettiMilas AndrettiMilas
28 dic 2011 19:20:06
3

¿Este código está en el bucle de publicaciones? El código me parece correcto. Aquí está el ejemplo del Codex sobre cómo usarlo:

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Páginas:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Página siguiente'),
    'previouspagelink' => __('Página anterior'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
28 dic 2011 17:35:10
Comentarios

Este código no funciona.

AndrettiMilas AndrettiMilas
28 dic 2011 19:19:37

Código corregido. Lo siento. Algunos atributos no tenían valor.

Caio Alves Caio Alves
28 dic 2011 21:41:33

Esto no logra los resultados que buscaba en mi pregunta, solo muestra números.

AndrettiMilas AndrettiMilas
29 dic 2011 16:07:17
0

La respuesta es diferente, pero fue inspirada por @荒野无灯 quien decidió eliminar su respuesta. En mi humilde opinión, es la mejor, ya que es la solución más fácil y flexible:

La solución depende de paginate_links(). Lo único que hay que saber es que base será la URL desde el inicio, seguida de %_%, que luego será reemplazada por format. Entonces, siempre que usemos get_permalink().'%_%';, sabemos que en cualquier caso permaneceremos en la publicación actual. Dentro de format, el # se reemplaza por el número de página:

function wpse37256_paginate_paged()
{
    if ( ! $paginate_links = paginate_links( array(
         'type'      => 'array'

        ,'total'     => $GLOBALS['numpages']
        ,'mid_size'  => 1
        ,'end_size'  => 1

        #,'prev_next' => false
        ,'prev_text' => '&laquo; '.__( 'Anterior', 'your_textdomain' )
        ,'next_text' => __( 'Siguiente', 'your_textdomain' ).' &raquo;'

        ,'base'      => get_permalink().'%_%'
        ,'format'    => user_trailingslashit( '%#%' )

        ,'current'   => $GLOBALS['page']
    ) ) )
        return;

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
12 oct 2012 14:44:09