Publicaciones paginadas - ¿Cómo usar números y enlaces de anterior/siguiente?
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
)); ?>

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.

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.

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.

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

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:
- Crear tu propia función en el archivo functions.php de tu tema. Funciona, pero tendrías una nueva función.
- Usar 2-3 instancias de
wp_link_pages()
. Un truco muy ineficiente. - 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()

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

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.

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?

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!

¿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 )
);
?>

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' => '« '.__( 'Anterior', 'your_textdomain' )
,'next_text' => __( 'Siguiente', 'your_textdomain' ).' »'
,'base' => get_permalink().'%_%'
,'format' => user_trailingslashit( '%#%' )
,'current' => $GLOBALS['page']
) ) )
return;
echo "<div class='pagination-container'>{$paginate_links}</div>";
}
