Publicaciones paginadas: ¿cómo usar los números y los enlaces siguientes / anteriores?

16

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 una "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 intentado 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'
)); ?>
    
pregunta AndrettiMilas 24.12.2011 - 20:04

6 respuestas

12

La función que está utilizando, wp_link_pages Codex , no tiene la función que estás buscando de forma predeterminada.

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

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

El filtro luego modificará los parámetros que se utilizan en esa función sobre la marcha e inyectará los enlaces faltantes a los argumentos prev y next que se muestran a la izquierda y lado 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, entonces puede cambiar un poco la función para que sea el comportamiento predeterminado siempre que se use number (el predeterminado), por lo que debe escribe menos en tus temas.

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

    
respondido por el hakre 31.12.2011 - 18:54
6

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

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

  1. Crea tu propia función en el archivo functions.php de tu tema. Funciona, pero entonces tendrías una nueva función.
  2. Usa 2-3 instancias de wp_link_pages() . Truco muy ineficiente.
  3. Usa un filtro. Método preferido . Vea a continuación.

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

WordPress Hack: Número de pantalla y amp; Enlaces siguientes / anteriores con wp_link_pages ()

    
respondido por el Velvet Blues 30.12.2011 - 15:14
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
    ) );
}
    
respondido por el Tareq 30.12.2011 - 18:01
1

No entiendo cuál es el problema ... ¿Tiene 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 es necesario que agregue next_or_number porque el número ya es el predeterminado.

    
respondido por el Mat_ 25.12.2011 - 22:06
1

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

<?php

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

?>
    
respondido por el Caio Alves 28.12.2011 - 16:35
0

La respuesta es diferente, pero se inspiró en @ 荒野 无 灯 quien decidió eliminar su respuesta. Imho es la mejor, como 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 principio, agregada por %_% , que luego será reemplazada por format . Entonces, mientras usemos get_permalink().'%_%'; , sabemos que en cualquier caso nos mantendremos en la publicación actual. Dentro de format , # 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>";
}
    
respondido por el kaiser 12.10.2012 - 13:44

Lea otras preguntas en las etiquetas