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'
)); ?>
AndrettiMilas
fonte

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 .

hakre
fonte
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 ()

Velvet Blues
fonte
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
    ) );
}
Tareq
fonte
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.

Esteira_
fonte
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 )
);

?>
Caio Alves
fonte
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>";
}
kaiser
fonte