• A categoria “exemplo” não tem post. No entanto, para fins de navegação do usuário e SEO, esta categoria realiza uma busca pela palavra-chave “exemplo”:
    category.php ou archive.php

    $current_category = single_cat_title("", false);
    
    $args = array(
    	's' => $current_category, //search
    	'posts_per_page' => 20,
    	'orderby'   => 'rand'
    );
    
    $wp_query = new WP_Query( $args );

    O código funciona perfeitamente! O problema é a paginação. Isso corretamente exibe o número de páginas, mas para acessar a página 2 aparece a mensagem de erro não encontrado (404).

    Permalink – Estrutura Personalizada:
    /%category%/%postname%/

    Links (exemplos):
    http://site.com/category/exemplo – ok! (abre os últimos 20 posts e exibe links das páginas: 1 | 2 | 3 | 4), pois se eu buscar pela palavra “exemplo” haverá cerca de 80 posts, divididos em 4 páginas.

    http://site.com/category/exemplo/page/2/ – falha! (Erro 404 não encontrado)

    http://site.com/category/exemplo/?paged=2 – falha! (Erro 404 não encontrado)

    E na busca a paginação funciona normalmente:
    http://site.com/?s=exemplo
    http://site.com/page/2/?s=exemplo

    Alguma ideia de como corrigir isso? Obrigado.

    Obs.: Esse erro dá com todos os temas, independente de eu usar plugin para paginação ou script do próprio WordPress.

Visualizando 3 respostas - 1 até 3 (de um total de 3)
  • Moderador Claudio Sanches

    (@claudiosanches)

    Isso acontece porque esta usando essa query personalizada dentro de category.php ou archive.php que já tem uma query nativa em cada um deles, os dois entraram em conflito, porque o WordPress não espera paginar a query nativa… No caso seria melhor no lugar de usar WP_Query() seria usar pre_get_posts, assim pode mudar a query que tem nativa da sua página e a paginação vai funcionar sem qualquer problema, além do ganho em desempenho, porque vai estar fazendo apenas uma query no lugar de duas.
    Aqui tem a documentação de pre_get_posts: https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

    Criador do tópico adv_user

    (@adv_user)

    Olá Claudio. Muito obrigado pela sugestão.
    Nunca trabalhei com pre_get_posts por isso acho que fiquei um pouco confuso, mesmo lendo a documentação que me sugeriu.

    Eu posso utilizar normalmente dentro do arquivo category.php e com o loop?

    Isso foi o que tentei fazer:

    function search_category($query) {
      if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_category) {
          $query->set('s', 'teste');
        }
      }
    }
    
    add_action('pre_get_posts','search_category');

    E depois completei com o loop:
    if ( have_posts() ) : while ( have_posts() ) : the_post();

    Mas não retornou nenhum resultado. Tentei também trocar os filtros em $query->set mas não apareceu nada. Será que estou utilizando o código em lugar errado, ou mesmo utilizei de forma equivocada a função?

    Agradeço novamente pelo auxílio.

    Criador do tópico adv_user

    (@adv_user)

    Então, tentei colocar o filtro no arquivo functions.php, exatamente com o código que digitei no post anterior, com base na página da documentação, e no arquivo category.php removi a query personalizada e fiz o loop simples, mas ainda não tive resultados.

    Só ressalto que nunca usei o pre_get_posts por isso não sei se estou fazendo certo. Achei um pouco confuso, mas pelos exemplos que vi, era para ter funcionado, mas, realmente não consegui ainda.

Visualizando 3 respostas - 1 até 3 (de um total de 3)
  • O tópico ‘Paginação do wordpress dá erro 404 com wp_query personalizado’ está fechado para novas respostas.