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


17

Quero que wp_link_pages (postagens de várias páginas) exiba os números das páginas, a palavra "anterior" antes desses números e um "próximo" depois desses números. Seria assim:

Anterior 1, 2, 3, 4 Próximo

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

Respostas:


12

A função que você está usando, wp_link_pagesCodex , não possui o recurso que você está procurando por padrão.

No entanto, você pode estendê-lo facilmente 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 modificará os parâmetros usados ​​nessa função imediatamente e injetará os links ausentes nos argumentos preve nextque são exibidos no lado esquerdo e 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 usar os links anterior e seguinte, você poderá alterar um pouco a função para torná-la o comportamento padrão sempre que number(o padrão) for usado, portanto, você deve escrever menos nos seus temas.

Esta é uma implementação ligeiramente diferente, conforme sugerido pelo Velvet Blues .


Exceto por alguns comentários e retornos antecipados, a implementação, o nome da opção e a explicação são exatamente iguais aos meus. Estou negligenciando alguma coisa? Que benefício sua solução oferece? Obrigado.
Velvet Blues

Provavelmente quando eu comparo o código.
hakre

A solução da Hakre, desde que a pergunta esteja aqui. Respostas completas (= compreensíveis sem depender de fontes externas) são sempre preferidas no StackExchange.
fuxia

6

A wp_link_pages()função mostra apenas quer texto ou número, nunca os dois. Se você der uma olhada no código da função, verá que não há opção para fazê-la se comportar de maneira diferente passando parâmetros.

Dito isto, existem 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 2-3 instâncias de wp_link_pages(). Corte muito ineficiente.
  3. Use um filtro. Método preferido . Ver 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'.

Hack do WordPress: Número de Exibição e Links Avançar / Anterior com wp_link_pages ()


Legal cara ... Eu estava pensando em algo usando os 4 valores globais, mas nunca realmente cheguei a uma solução ... +1!
Rutwick Gangurde

3

Experimente isso, você pode personalizá-lo mais. Mas deve fazer como você queria :-)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}

como podemos gerenciar? wordpress.org/support/topic/… ou como adicionar um título personalizado dinâmico antes do número da página.
Ravi Patel

1

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 alguma razão, isso não está funcionando, mas parece certo para mim. Gostaria de saber se houve uma alteração para 3.3 ou se eu preciso colar algo no functions.php?
AndrettiMilas

2
Sim, eu tentei isso também, ele funciona quando você definir next_or_numbera next. Mas mostra apenas os links 'Próximo' e 'Anterior', não os números!
Rutwick Gangurde

1
Eu preciso de ambos, como mostrado no exemplo.
AndrettiMilas

1

Esse código está no loop de postagens? 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 )
);

?>

Este código não funciona.
AndrettiMilas

Código fixo. Desculpe. Alguns atributos estão sem valor.
Caio Alves

1
Isso não alcança os resultados que eu estava procurando na minha pergunta, apenas mostra números.
AndrettiMilas

0

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

A solução depende paginate_links(). A única coisa a saber é que baseserá o URl desde o início, anexado por %_%, que será substituído por format. Portanto, enquanto usarmos get_permalink().'%_%';, sabemos que, de qualquer forma, permaneceremos no post atual. No interior 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>";
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.