Eu tenho a seguinte consulta que eu chamo no meu modelo taxonomy.php via query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Esta função funciona perfeitamente. No entanto, depois de ler o codex para as postagens de consulta, ele mencionou pre_get_posts como a maneira preferida de alterar a consulta padrão. Os pre_get_posts seriam mais eficientes que minha função wp_query abaixo?
Em caso afirmativo, como eu construiria os pre_get_posts e passaria minha variável e consulta abaixo?
function my_custom_query($posttype, $poststatus, $paidvalue, $taxtype, $geo, $brands) {
global $wp_query;
$wp_query = new WP_Query();
$args = array(
'post_type' => $posttype,
'post_status' => array($poststatus),
'orderby' => 'rand',
'posts_per_page' => 30,
'meta_query' => array(
array(
'key' => 'wpcf-paid',
'value' => array($paidvalue),
'compare' => 'IN',
)
),
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => $taxtype,
'field' => 'slug',
'terms' => $geo
),
array(
'taxonomy' => 'brands',
'field' => 'slug',
'terms' => $brands
)
)
);
return $wp_query->query($args);
}
fonte
$wp_query
objeto e as coisas falharão completamente. Além de que é simplesmente não é verdade quepre_get_posts
irá executar uma consulta adicional ...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 finoWP_Query
que não deve ser usado em temas ou plugins) para fazer umWP_Query
. IssoWP_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ãoposts_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
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):
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.
fonte
Verifique as respostas em Quando usar WP_query (), query_posts () e pre_get_posts .
É um ótimo recurso se você tiver alguma dúvida em mente.
fonte