Portuguese (Português) translation by Cândido Sales Gomes (you can also view the original English article)
Eu sou um grande fã da classe WP_Query
: Eu uso em muitos sites de meus clientes para consultar e customizar a saída de diversos modos.
Se você quer executar múltiplos loops em uma página, a maneira mais fácil de fazer isso é executar WP_Query
cada vez que você precisa executar um loop. Mas existe uma desvantagem: cada vez que o WordPress executa uma consulta, ele envia uma requisição para o banco de dados, que leva tempo e pode atrasar seu site; E se você está usando WP_Query
ao invés da consulta principal para saída de conteúdo, então ele faz uma consulta principal redundante, que é uma perca de recursos.
Então aqui vou apresentar como usar uma consulta para executar mais de um loop. Você pode fazer isso com a consulta principal (que é isso que vou fazer, como é mais eficiente) ou você pode usar a mesma técnica com WP_Query
Há três partes para isto:
- Crie um tema filho e arquivo de template.
- Crie uma parte do template para o loop de conteúdo.
- Crie nossos loops.
Então vamos começar!
O que você vai precisar
Para acompanhar, você precisará de:
- Uma instalação de desenvolvimento do WordPress.
- Um editor de código.
- Posts em seu site atribuídas com múltiplas categorias - Eu estou usando o tema de dados de teste para Wordpress.
- O tema de twenty sixteen instalado em seu site.
- Um tema filho do twenty sixteen instalado e ativado - Vou cobrir brevemente a configuração do tema filho aqui.
Você não tem que estar usando twenty sixteen com um tema filho — você pode adaptar esta técnica para o seu próprio tema. Mas eu vou estar usando um filho de twenty sixteen.
Criando um Tema Filho
Primeiro vamos criar o tema filho de twenty sixteen. Eu estou fazendo isso por que eu não quero editar o próprio twenty sixteen.
No seu diretório wp-content/theme
, crie uma nova pasta vazia. Estou chamando a minha de tutsplus-one-query-two-loops
Na pasta, crie um arquivo chamado style.css
e adicione isso:
1 |
/*
|
2 |
Theme Name: Tutsplus One Query Multiple Loops
|
3 |
Theme URI: https://.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703
|
4 |
Description: Theme to support Tutorial on running multiple loops while querying the database just once. Child theme for the Twenty Sixteen theme.
|
5 |
Author: Rachel McCollin
|
6 |
Author URI: http://rachelmccollin.co.uk/
|
7 |
Template: twentysixteen
|
8 |
Version: 1.0
|
9 |
*/
|
10 |
|
11 |
@import url("../twentysixteen/style.css"); |
Agora salve o arquivo e ative seu novo tema.
O próximo passo é criar um arquivo de template para categorias, que é o que nós vamos estar trabalhando.
Faça uma cópia do arquivo archive.php
do twenty sixteen em seu novo tema. Não mova ele, mas copie. Renomei para category.php.
Este é o novo arquivo de template para categorias em seu site.
Criando uma Nova Parte do Arquivo de Template
O primeiro passo para definir a nova parte do arquivo de template em nosso tema que irá conter uma versão editada do loop do twenty sixteen.
Em sua pasta do tema, crie uma subpasta chamada includes
. Dentro dela, crie um novo arquivo chamado loop-category.php
.
Agora abra o arquivo template-parts/content.php
do arquivo do twenty sixteen e encontre este código (que é a maior parte do arquivo)
1 |
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> |
2 |
<header class="entry-header"> |
3 |
<?php if ( is_sticky() && is_home() && ! is_paged() ) : ?> |
4 |
<span class="sticky-post"><?php _e( 'Featured', 'twentysixteen' ); ?></span> |
5 |
<?php endif; ?> |
6 |
|
7 |
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?> |
8 |
</header><!-- .entry-header --> |
9 |
|
10 |
<?php twentysixteen_excerpt(); ?> |
11 |
|
12 |
<?php twentysixteen_post_thumbnail(); ?> |
13 |
|
14 |
<div class="entry-content"> |
15 |
<?php
|
16 |
/* translators: %s: Name of current post */
|
17 |
the_content( sprintf( |
18 |
__( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ), |
19 |
get_the_title() |
20 |
) ); |
21 |
|
22 |
wp_link_pages( array( |
23 |
'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentysixteen' ) . '</span>', |
24 |
'after' => '</div>', |
25 |
'link_before' => '<span>', |
26 |
'link_after' => '</span>', |
27 |
'pagelink' => '<span class="screen-reader-text">' . __( 'Page', 'twentysixteen' ) . ' </span>%', |
28 |
'separator' => '<span class="screen-reader-text">, </span>', |
29 |
) ); |
30 |
?>
|
31 |
</div><!-- .entry-content --> |
32 |
|
33 |
<footer class="entry-footer"> |
34 |
<?php twentysixteen_entry_meta(); ?> |
35 |
<?php
|
36 |
edit_post_link( |
37 |
sprintf( |
38 |
/* translators: %s: Name of current post */
|
39 |
__( 'Edit<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ), |
40 |
get_the_title() |
41 |
),
|
42 |
'<span class="edit-link">', |
43 |
'</span>'
|
44 |
);
|
45 |
?>
|
46 |
</footer><!-- .entry-footer --> |
47 |
</article><!-- #post-## --> |
Copie isso para seu novo arquivo.
Editando a Parte do Template
O loop do twenty sixteen apresenta mais do que eu preciso para este arquivo, então vou editá-lo. Eu apenas quero apresentar o resumo e não o conteúdo, então eu vou removê-lo.
Em seu novo arquivo loop-category.php
, encontre este código e delete.
1 |
<div class="entry-content"> |
2 |
<?php
|
3 |
/* translators: %s: Name of current post */
|
4 |
the_content( sprintf( |
5 |
__( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ), |
6 |
get_the_title() |
7 |
) ); |
8 |
|
9 |
wp_link_pages( array( |
10 |
'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentysixteen' ) . '</span>', |
11 |
'after' => '</div>', |
12 |
'link_before' => '<span>', |
13 |
'link_after' => '</span>', |
14 |
'pagelink' => '<span class="screen-reader-text">' . __( 'Page', 'twentysixteen' ) . ' </span>%', |
15 |
'separator' => '<span class="screen-reader-text">, </span>', |
16 |
) ); |
17 |
?>
|
18 |
</div><!-- .entry-content --> |
O outro passo é substituir a função twenty_sixteen_excerpt()
com a função padrão the_excerpt()
, como a versão twenty sixteen não inclui o link para post completo.
Encontre essa linha:
1 |
<?php twenty_sixteen_excerpt(); ?> |
Substitua com isso:
1 |
<?php the_excerpt(); ?> |
Nós também precisamos fazer alguns ajustes para as tags do título.
Na parte do template, edite a linha:
1 |
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?> |
Mude as tags h2
para h3
:
1 |
<?php the_title( sprintf( '<h3 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h3>' ); ?> |
Salve sua parte do template. Agora vamos voltar para seu arquivo category.php
e continuar trabalhando nele.
Criando Nossos Loops
Primeiro vamos remover a chamada para a parte do twenty sixteen de nosso arquivo category.php, como nós vamos precisar usar o novo arquivo em seu lugar.
Em seu arquivo category.php
encontre este código:
1 |
get_template_part( 'template-parts/content', get_post_format() ); |
Exclua isso.
Agora nós vamos criar os loops.
Neste exemplo eu vou listar todos os post com o tag 'content' primeiro, usando a condicional has_tag()
.
Isso significa que vou ter que executar três loops.
- Primeiro verifique se a consulta tem retornado qualquer post com essa tag.
- Se for assim, a saída do segundo post com essa tag.
- A terceira saída dos post sem essa tag.
Entre cada um deles, eu vou usar rewind_posts()
para rebobinar os posts sem redefinir a consulta: nós estamos ainda trabalhando com uma consulta principal a cada vez.
O Primeiro Loop: Verificando os Posts
Em seu arquivo category.php
, encontre o início do loop.
1 |
while ( have_posts() ) : the_post(); |
Acima da linha, defina a nova variável chamada $count
:
1 |
$count = 0; |
Agora dentro do loop, adicione esse código:
1 |
// check if there are any posts with the '' tag
|
2 |
$tag = 'content'; |
3 |
if ( has_tag( $tag ) ) { |
4 |
$count +=1; |
5 |
}
|
Isso verifica se o post tem a tag 'content' e então adiciona 1
para o contador em caso afirmativo.
Seu loop vai parecer como esse:
1 |
// Check for posts in the first loop.
|
2 |
$count = 0; |
3 |
while ( have_posts() ) : the_post(); |
4 |
|
5 |
// check if there are any posts with the '' tag
|
6 |
$tag = 'content'; |
7 |
if ( has_tag( $tag ) ) { |
8 |
$count +=1; |
9 |
}
|
10 |
|
11 |
endwhile; |
O Segundo Loop: Produzir Posts Com a Tag
O próximo passo é executar um loop para saída dos posts com essa tag, mas somente se existir, i.e. se o valor de $count
é maior que 0
.
Adicione isso abaixo do seu primeiro loop:
1 |
if ( $count > 0 ) { |
2 |
|
3 |
rewind_posts(); |
4 |
|
5 |
echo '<h2>Posts tagged with ' . $tag . '</h2>'; |
6 |
|
7 |
|
8 |
while ( have_posts() ) : the_post(); |
9 |
|
10 |
if ( has_tag( $tag ) ) { |
11 |
get_template_part( 'includes/loop', 'category'); |
12 |
}
|
13 |
|
14 |
// End the loop.
|
15 |
endwhile; |
16 |
|
17 |
}
|
Isso verifica se $count
é maior que zero e em caso afirmativo, rebobina os posts e executa o loop novamente. Para cada post verifica se o post tem nossa tag e, em caso afirmativo, chama a parte do template que criamos.
O Terceito Loop: Produzir o Resto de Nossos Posts
O loop final irá apresentar os post restantes. Se essa categoria não tiver qualquer post com a tag 'content', então irá apresentar todos os posts na categoria.
Abaixo de seu segundo loop, adicione isso:
1 |
rewind_posts(); |
2 |
|
3 |
|
4 |
// Second Loop - posts not with the 'content' tag
|
5 |
while ( have_posts() ) : the_post(); |
6 |
|
7 |
if ( !has_tag( $tag ) ) { |
8 |
get_template_part( 'includes/loop', 'category'); |
9 |
}
|
10 |
|
11 |
// End the loop.
|
12 |
endwhile; ?> |
Isso rebobina os posts (que você estará fazendo para a primeira vez, se não houvesse qualquer post com a tag ou a segunda vez se havia), e então executa o loop de novo. Dessa vez verifica se o post não tem a tag 'content' e então se produz usando nossa parte do template.
O Arquivo Finalizado
Agora teste a página de categoria arquivo em seu site.
Se você está usando o dado de teste do Wordpress como eu, você vai descobrir que a categoria 'Markup' tem posts com a tag 'content'. Aqui é a página de categoria arquivo para a categoria 'Markup' em meu site:



Resumo
Executando múltiplos loops de uma consulta não é complicado. Ao invés de redefinir a consulta e criando uma nova, você usa a função rewind_posts() para rebobinar a consulta e executar novamente. E ao invés de definindo novos parâmetros de consulta, você usa tags condicionais para especificar quais posts serão produzidos.
Nota importante: Não fique tentado a usar query_posts()
para alterar a consulta principal quando você está fazendo isso. Isto vai atrasar seu site mais do que se você tivesse usado várias consultas.
Neste exemplo nós executamos dois loops baseados na consulta principal, que salva usando WP_Query
para executar duas consultas adicionais e vai reduzir a carga do servidor. Você pode aplicar essa técnica com uma consulta, você define usando WP_Query
ou com a consulta principal em outras páginas de arquivos, editando o template de arquivo apropriado.
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!