Resposta tardia, pois a resposta mais votada interromperá sua consulta e simplesmente não é verdadeira em alguns pontos importantes.
O principal WP_Query e seus filtros
Primeiro, o WordPress usa internamente query_posts()
(um invólucro fino WP_Query
que não deve ser usado em temas ou plugins) para fazer um WP_Query
. Isso WP_Query
está atuando como o loop / consulta principal. Essa consulta será executada por vários filtros e ações até que a string de consulta SQL real seja criada. Um deles é pre_get_posts
. Outros são posts_clauses
, posts_where
etc., que também permitem interceptar o processo de criação da string de consulta.
Uma análise aprofundada do que acontece dentro do núcleo
O WordPress executa a wp()
função (in wp-includes/functions.php
), que chama $wp->main()
( $wp
é um objeto da classe WP, que é definido em wp-includes/class-wp.php
). Isso diz ao WordPress para:
- Analise o URL em uma especificação de consulta usando
WP->parse_request()
+ mais sobre isso abaixo.
- Defina todas as variáveis is_ usadas pelos Tags Condicionais usando
$wp_query->parse_query()
( $wp_query
é um objeto de class WP_Query
, definido em wp-includes/query.php
). Observe que, apesar do nome dessa função, nesse caso WP_Query->parse_query
, na verdade, não fazemos nenhuma análise para nós, pois isso é feito antecipadamente WP->parse_request()
.
- Converta a especificação da consulta em uma consulta ao banco de dados MySQL e execute a consulta ao banco de dados para obter a lista de postagens, na função WP_Query-> get_posts (). Salve as postagens no objeto $ wp_query para serem usadas no loop do WordPress.
Codex Fonte
Conclusão
Se você realmente deseja modificar a consulta principal, pode usar uma grande variedade de filtros. Basta usar $query->set( 'some_key', 'some_value' );
a mudança de dados lá ou utilização $query->get( 'some_key' );
para recuperar dados para fazer verificações condicionais. Isso evitará que você faça uma segunda consulta, pois está alterando apenas a consulta SQL.
Se você precisar fazer uma consulta adicional , vá com um WP_Query
objeto. Isso adicionará outra consulta ao banco de dados.
Exemplo
Como as respostas sempre funcionam melhor com um exemplo, você tem um exemplo muito bom (adereços para Brad Touesnard), que simplesmente estende o objeto principal e, portanto, é bastante reutilizável (faça dele um plugin):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
Em seguida, você pode executar sua segunda consulta / adicional como você pode ver no exemplo a seguir. Não se esqueça de redefinir sua consulta posteriormente.
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;