Publicaciones paginadas: ¿cómo usar números y enlaces siguiente / anterior?

17

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

Anterior 1, 2, 3, 4 Siguiente

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

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pages', 
    'after'  => '</span>',
    'next_or_number'=>'number',
    'previouspagelink' => 'previous',
    'nextpagelink'=> 'Next'
)); ?>
AndrettiMilas
fuente

Respuestas:

12

La función que está utilizando, wp_link_pagesCodex , no tiene la función que está buscando por defecto.

Sin embargo, puede extenderlo fácilmente utilizando una función de devolución de llamada, registrada como filtro en los argumentos de las funciones:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Luego, el filtro modificará los parámetros que se utilizan en esa función sobre la marcha e inyectará los enlaces que faltan en los argumentos prevy nextque se generan en el lado izquierdo y derecho de la lista de enlaces numerados ( next_or_number' => 'number'):

/**
 * Add prev and next links to a numbered page link list
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if (!$args['next_or_number'] == 'next_and_number') 
        return $args; # exit early

    $args['next_or_number'] = 'number'; # keep numbering for the main part
    if (!$more)
        return $args; # exit early

    if($page-1) # there is a previous page
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page<$numpages) # there is a next page
        $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>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # activate parameter overloading
    'nextpagelink' => __('Next'),
    'previouspagelink' => __('Previous'),
    'pagelink' => '%',
    'echo' => 1 )
);

Si su tema siempre usa los enlaces anterior y siguiente, puede cambiar un poco la función para que sea el comportamiento predeterminado siempre que numberse use (el predeterminado), por lo que debe escribir menos en sus temas.

Esta es una implementación ligeramente diferente como lo sugiere Velvet Blues .

hakre
fuente
Excepto por algunos comentarios y retornos tempranos, la implementación, el nombre de la opción y la explicación son exactamente los mismos que los míos. ¿Estoy pasando por alto algo? ¿Qué beneficio le da su solución? Gracias.
Velvet Blues
Probablemente cuando comparo el código.
hakre
La solución de Hakre está disponible siempre que la pregunta esté aquí. Las respuestas completas (= comprensibles sin depender de fuentes externas) siempre se prefieren en StackExchange.
fuxia
6

La wp_link_pages()función sólo muestra ya sea texto o número, nunca ambos. Si observa el código de la función, verá que no hay opción para que se comporte de manera diferente al pasar parámetros.

Dicho esto, hay tres formas de hacer esto sin un complemento:

  1. Cree su propia función en el archivo functions.php de su tema. Funciona, pero entonces tendrías una nueva función.
  2. Use 2-3 instancias de wp_link_pages(). Hack muy ineficiente.
  3. Usa un filtro. Método preferido . Vea abajo.

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

Hack de WordPress: Número de pantalla y enlaces siguiente / anterior con wp_link_pages ()

Velvet Blues
fuente
Hombre genial ... Estaba pensando en algo usando los 4 valores globales, pero nunca llegué a una solución ... ¡+1!
Rutwick Gangurde
3

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

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
Tareq
fuente
¿Cómo podemos gestionar? wordpress.org/support/topic/… o cómo agregar dynamic-custom-title antes del número de página.
ravi patel
1

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">Pages',
    'after'            => '</span>',
    'nextpagelink'     => __('Next'),
    'previouspagelink' => __('Previous')
); 

wp_link_pages($args);
?> 

No necesita agregar next_or_number ya que el número ya es el predeterminado.

Estera_
fuente
Por alguna razón, esto no funciona, pero me parece correcto. Me pregunto si hubo un cambio a 3.3 o si necesito pegar algo en functions.php?
AndrettiMilas
2
Sí he intentado esto también funciona cuando se establece next_or_numbera next. Pero solo muestra los enlaces 'Siguiente' y 'Anterior', ¡no los números!
Rutwick Gangurde
1
Necesito ambos, como se muestra en el ejemplo.
AndrettiMilas
1

Este código está en el bucle de las publicaciones? La codificación está bien para mí. Aquí está el ejemplo del Codex sobre cómo usarlo:

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Next page'),
    'previouspagelink' => __('Previous page'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
Caio Alves
fuente
Este código no funciona
AndrettiMilas
Código fijo Lo siento. Algunos atributos no tienen valor.
Caio Alves
1
Esto no logra los resultados que estaba buscando en mi pregunta, solo muestra números.
AndrettiMilas
0

La respuesta es diferente, pero se inspiró en @ 荒野 无 灯 que decidió eliminar su respuesta. En mi opinión, es la mejor, como la solución más fácil y flexible:

La solución depende de paginate_links(). Lo único que debe saber es que baseserá la URL desde el principio, agregada por %_%, que luego será reemplazada por format. Por lo tanto, siempre que lo usemos get_permalink().'%_%';, sabemos que, en cualquier caso, permaneceremos en la publicación actual. En formatel interior , #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; '.__( 'Prev', 'your_textdomain' )
        ,'next_text' => __( 'Next', 'your_textdomain' ).' &raquo;'

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

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

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
emperador
fuente