Advertisement
  1. Code
  2. WordPress

Combinando WP_Query com Consulta Principal

Scroll to top
Read Time: 6 min
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: 10 Useful Examples
Mastering WP_User_Query

Portuguese (Português) translation by João Fagner (you can also view the original English article)

Até agora nesta série, você aprendeu como usar WP_Query para criar consultas personalizadas para uso em seu tema ou plugins.

Na maioria dos casos, você vai usar WP_Query com um conjunto completamente novo de argumentos que são separados da consulta principal, mas e se você deseja incluir a consulta principal em seus argumentos?

Alguns exemplos de quando você pode querer fazer isso:

  • em uma página de categoria ou taxonomia, apenas exibindo posts de um tipo de post
  • em uma página de categoria, exibindo posts com a categoria atual e outra categoria ou uma tag ou termo de taxonomia
  • em uma página para um tipo de post, exibindo apenas posts com determinados metadados

Eu poderia continuar — há uma variedade de possibilidades de combinação da consulta principal com sua própria consulta personalizada.

Vou demonstrar isso com três exemplos: o primeiro será um exemplo simples com um loop; o segundo irá usar foreach para saída de vários loops, um para cada tipo de post; e o terceiro produzirá dois tipos de post em um arquivo de categoria por meio de duas consultas separadas.

Definição de uma variável com base na consulta principal

No entanto, você vai combinar sua consulta principal com WP_Query, bastando armazenar o objeto  atual da consulta de uma maneira que torna fácil de usar em seus argumentos WP_Query. A maneira mais fácil de fazer isso é atribuindo-o a uma variável.

Você fazer isso antes de definir seus argumentos WP_Query, da seguinte forma:

1
$mainquery = get_queried_object();

A função get_queried_object() retorna o objeto consultado atualmente, seja ele qual for. Em um único post ele só irá retornar o objeto do post, enquanto em um arquivo ele irá retornar a categoria, tag, objeto do termo ou seja o objeto referente ao arquivo. Ele retorna o ID do objeto consultado.

Você pode usar essa variável $mainquery em seus argumentos WP_Query. Agora vamos dar uma olhada em alguns exemplos.

Exemplo 1: Exibindo apenas os Posts de um tipo de Post em uma Página de Categoria

Digamos que seu site tem um tipo de post personalizado e adicionado a ele e você habilitou categorias para esse tipo de post personalizado. Na categoria arquivo para cada categoria, você não quer mostrar posts: em vez disso, você deseja exibir posts de seu novo tipo de post — vamos chamá-lo o product (produto).

Sua consulta pode como isto:

1
<?php
2
3
$mainquery = get_queried_object();
4
5
$args = array (
6
    'category_name' => $mainquery->slug,
7
    'post_type' => 'product'
8
);
9
10
// Custom query.

11
$query = new WP_Query( $args );
12
13
// Check that we have query results.

14
if ( $query->have_posts() ) {
15
16
    // Start looping over the query results.

17
    while ( $query->have_posts() ) {
18
19
        $query->the_post();
20
21
        // Contents of the queried post results go here.

22
23
    }
24
25
}
26
27
// Restore original post data.

28
wp_reset_postdata();
29
30
?>

O parâmetro category_name que usei acima leva o slug da categoria como seu argumento, você precisa adicionar o ->slug após a variável de saída do slug da categoria.

Isto te retorna uma consulta que busca posts do tipo product do banco de dados com a categoria atual consultada. Você poderia usá-lo sobre o modelo de página category.php

Nota: Você também pode alcançar este resultado usando o gancho de pre_get_posts para alterar a consulta principal, combinada com uma função condicional para verificar se há arquivos da categoria.

Exemplo 2: Combinando a Consulta Principal com WP_Query e foreach para Exibição de Múltiplos Loops

O próximo exemplo imprimirá todos os posts para a categoria atual da página, mas em vez de mostrar todos em um bloco eles serão separados pelo tipo de post.

Isto significa que você pode classificar os tipos de post em blocos ou colunas na sua página usando CSS ou apenas separá-los em listas diferentes.

Para fazer isso, você deve usar o seguinte código:

1
<?php
2
3
$mainquery = get_queried_object();
4
5
$post_types = get_post_types();
6
7
foreach ( $post_types as $post_type ) {
8
9
    $args = array(
10
        'category_name' => $mainquery->slug,
11
        'post_type' => $post_type
12
    );
13
14
    // Custom query.

15
    $query = new WP_Query( $args );
16
17
    // Check that we have query results.

18
    if ( $query->have_posts() ) {
19
20
        // Start looping over the query results.

21
        while ( $query->have_posts() ) {
22
23
            $query->the_post();
24
25
            // Contents of the queried post results go here.

26
27
        }
28
29
    }
30
31
    // Restore original post data.

32
    wp_reset_postdata();
33
34
}
35
36
?>

Usando a variável $mainquery , mas sendo também adicionado uma variável $post_types para armazenar todos os tipos de post registrados no site e uma variável $post_type para armazenar cada tipo de post individual, por sua vez.

Exemplo 3: Duas Consultas Separadas por dois Tipos de Post

O exemplo final é semelhante o segundo, mas faz a separação dos tipos de post em duas consultas, cada uma com seu próprio loop distinto. Isto dá a você mais controle sobre o que é exibido para cada um, então você poderia exibir posts diferentemente dos products (produtos), talvez incluindo uma imagem de destaque para os products ou criando um layout diferente.

Digamos que seu site tem o product (produto) registrado como tipo de post e que a categoria esteja habilitada e que também esteja sendo utilizada a mesma categoria para os posts do blog. Em cada página de arquivo de categoria você deseja exibir os dez posts mais recentes e então você deseja exibir uma lista de todos os product (produtos) na mesma categoria.

Para fazer isso, você pode usar este código:

1
<?php
2
3
$mainquery = get_queried_object();
4
5
// First query arguments for posts.

6
$args = array (
7
    'category_name' => $mainquery->slug,
8
    'post_type' => 'post',
9
    'posts_per_page' => '10'
10
);
11
12
// Custom query.

13
$query = new WP_Query( $args );
14
15
// Check that we have query results.

16
if ( $query->have_posts() ) {
17
18
    // Start looping over the query results.

19
    while ( $query->have_posts() ) {
20
21
        $query->the_post();
22
23
        // Contents of the queried post results go here.

24
25
    }
26
27
}
28
29
// Restore original post data.

30
wp_reset_postdata();
31
32
// Second query arguments for products.

33
$args = array (
34
    'category_name' => $mainquery->slug,
35
    'post_type' => 'product',
36
    'posts_per_page' => '-1'
37
);
38
39
// Custom query.

40
$query = new WP_Query( $args );
41
42
// Check that we have query results.

43
if ( $query->have_posts() ) {
44
45
    // Start looping over the query results.

46
    while ( $query->have_posts() ) {
47
48
        $query->the_post();
49
50
        // Contents of the queried post results go here.

51
52
    }
53
54
}
55
56
// Restore original post data.

57
wp_reset_postdata();
58
59
?>

Então, você teria que escrever um loop diferente para cada saída de dados para cada tipo de post.

Resumo

Como você pode ver os exemplos acima é possível usar WP_Query não somente para criar consultas personalizadas completamente separada da consulta principal, mas também para incorporar o objeto atualmente consultado e criar consultas mais poderosas nas páginas de arquivo.

Os exemplos acima também podem ser feitos com outros tipos de arquivo: para taxonomias, autores, datas e muito mais. Veja se consegue criar mais possibilidades!

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.