Postagens paginadas - como usar números e links próximos / anteriores?

16

Eu quero wp_link_pages (posts de várias páginas) para exibir os números de página, a palavra "anterior" antes desses números e um "próximo" após esses números. Ficaria assim:

Anterior 1, 2, 3, 4 Próxima

Estou tentando fazer isso sem um plugin. Aqui está o que eu tentei até agora, mas não está funcionando, está exibindo apenas 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'
)); ?>
    
por AndrettiMilas 24.12.2011 / 20:04

6 respostas

12

A função que você está usando, wp_link_pages Codex , não tem o recurso que você está procurando por padrão.

No entanto, você pode facilmente estendê-lo usando uma função de retorno de chamada, registrada como um filtro nos argumentos dessa função:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

O filtro irá então modificar os parâmetros que são usados nessa função on-the-fly e injetar os links que faltam para os argumentos prev e next que são exibidos à esquerda e lado direito da lista de links 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 )
);

Se o seu tema sempre usa os links prev e next, você pode alterar um pouco a função para torná-la o comportamento padrão sempre que number (o padrão) for usado, então você precisa escreva menos em seus temas.

Esta é uma implementação ligeiramente diferente da sugerida pelo Velvet Blues .

    
por hakre 31.12.2011 / 18:54
6

A função wp_link_pages() mostra apenas texto ou número, nunca ambos. Se você der uma olhada no código da função, verá que não há opção para fazer com que ela se comporte de maneira diferente, passando parâmetros.

Dito isso, há três maneiras de fazer isso sem um plug-in:

  1. Crie sua própria função no arquivo functions.php do seu tema. Funciona, mas você teria uma nova função.
  2. Use de 2 a 3 instâncias de wp_link_pages() . Hack muito ineficiente.
  3. Use um filtro. Método preferido . Veja abaixo.

Eu escrevi um artigo sobre como fazer isso no meu blog. Basicamente, eu uso o filtro wp_link_pages_args e adiciono uma função no arquivo functions.php que adiciona uma nova opção 'next_and_number'.

WordPress Hack: Número de exibição & Links Próximos / Anteriores com wp_link_pages ()

    
por Velvet Blues 30.12.2011 / 15:14
3

Tente isso, você pode personalizá-lo mais. Mas deve fazer o que você quiser: -)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
    
por Tareq 30.12.2011 / 18:01
1

Eu não entendi qual é o problema ... Você tem algum erro?

Isso deve funcionar:

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Pages',
    'after'            => '</span>',
    'nextpagelink'     => __('Next'),
    'previouspagelink' => __('Previous')
); 

wp_link_pages($args);
?> 

Você não precisa adicionar next_or_number, pois o número já é o padrão.

    
por Mat_ 25.12.2011 / 22:06
1

Este código está no loop de posts? A codificação é boa para mim. Aqui está o exemplo do Codex sobre como usar:

<?php

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

?>
    
por Caio Alves 28.12.2011 / 16:35
0

A resposta é diferente, mas foi inspirado @ 荒野 无 灯 que decidiu deletar sua resposta. Por isso, é a melhor solução mais fácil e flexível:

A solução depende de paginate_links() . A única coisa a saber é que base será o URL desde o início, anexado por %_% , que será substituído por format . Portanto, contanto que usemos get_permalink().'%_%'; , sabemos que, de qualquer forma, permaneceremos no post atual. Dentro de format , o # é substituído pelo número da 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>";
}
    
por kaiser 12.10.2012 / 13:44