Como resolver problema de paginação no WordPress

Já perdi um bom tempo tentando resolver um problema de paginação no WordPress. Lia e relia o código inúmeras vezes tentando encontrar algum erro, procurava alguma dica no fórum do Codex, acessava vários blogs que diziam ter a solução para essa questão, mas no final das contas o resultado era sempre o mesmo “Error 404 – Not Found“.

Imagine a seguinte situação: eu tenho uma página personalizada chamada Portfólio, que por sua vez é um arquivo page-portfolio.php.

página wordpress

Nesse template, pretendo listar e paginar todos os itens que estão em um custom post que também se chama Portfólio.

custom post wordpress

Para fazer isso, preciso alterar o loop padrão do WordPress usando a função query_posts() e passar os parâmetros post_typeposts_per_pagepaged no mínimo.

<?php
 /** Arquivo page-portfolio.php **/
 query_posts("post_type=portfolio&posts_per_page=10&paged=".get_query_var('paged'));

 if (have_posts()) : while (have_posts()) : the_post();

?>
 <h2><a href="<?php the_permalink();?>" title="Saiba mais sobre <?php the_title();?>"><?php the_title();?></a></h2>
 <div class="resumo-novidades">
 <?php the_content();?>
 </div>

<?php
 endwhile; endif;

 // Função de paginação que está no functions.php
 if (function_exists('wp_corenavi')) wp_corenavi();
?>

E é justamente ai que surge o problema de paginação devido ao conflito de slugs. Assim como um id, o slug também deve ser único para que não tenhamos problemas, já que todas as páginas, posts e custom posts ficam na mesma tabela no banco de dados (wp_posts). O WordPress até cuida disso de forma automática quando se tratam de dois elementos do mesmo tipo, como duas páginas ou dois posts. Mas quando são de tipos diferentes, como é o nosso caso, esse gerenciamento infelizmente ainda tem que ser feito de forma manual.

Então uma forma bem simples de resolver o problema de paginação no wordpress seria mudar o slug da página personalizada para meu-portfolio, por exemplo. Dessa forma o nosso arquivo de template também muda de nome passando a se chamar page-meu-portfolio.php, e a url ficaria http://www.meusite.com/meu-portfolio.

Caso isso ainda não resolva o seu problema, sugiro que dê uma olhada nesses dois artigos:
Resolvendo problemas de paginacao no wordpress
Problemas na paginacao query posts do wordpress

  • Henderson

    Muito bom companheiro, eu sempre esqueço desse problema da página com o mesmo slug do custom post e fico procurando soluções mirabolantes. Solução simples e rápida, mudar o slug da página.

    Valeu

    • wellingtonlorindo

      E ai mestre Henderson! Pena que o wordpress não verifica isso sozinho ainda =/
      Valeu pelo comentário
      Abraço

  • tercio

    Parabéns pelo post, excelente

    Wellington, me ajuda numa coisa, por favor.
    Eu criei um post-type, e pretendo postar conteúdo nele, como se fosse um blog. Entretanto, o meu site já tem um blog, e a função que uso pra paginação só funciona pro blog ou pra todos os posts feitos a uma determinada categoria. Teria uma maneira, sem plugin, de usar uma função para paginação para o post-type?

    grato

  • Silvio Regis

    Cara, aqui ficou num loop infinito, pode ajudar?

    /** Arquivo page-portfolio.php **/

    query_posts(“post_type=post&posts_per_page=10&paged=”.get_query_var(‘paged’));

    ?>

    <a class="noticia" title='’ href=>

  • Mari Duarte

    Eu estou com o seguinte problema: na home do site, lista os posts normais do WordPress. A paginação é criada, porém quando clico na página 2, ele volta pra home em vez de mudar de página: http://www.dcantidio.com/home/

  • Wenderson Nicodemos Cardozo

    Nossa me tirou uma dúvida e tanto.
    Muito obrigado pela ajuda do post.