J'ai la requête suivante que j'appelle dans mon modèle taxonomy.php via query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Cette fonction fonctionne parfaitement. Cependant, après avoir lu le codex pour les messages de requête, il a mentionné pre_get_posts comme moyen préféré de modifier la requête par défaut. Les pre_get_posts seraient-ils plus efficaces que ma fonction wp_query ci-dessous?
Si oui, comment puis-je construire les pre_get_posts et passer ma variable et ma requête ci-dessous?
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);
}
la source
$wp_query
objet et les choses échoueront complètement. En dehors de cela, ce n'est tout simplement pas vrai quipre_get_posts
exécutera une requête supplémentaire ...Une réponse tardive car la réponse la plus votée brisera votre requête et n'est tout simplement pas vraie sur certains points majeurs.
Le WP_Query principal et ses filtres
Tout d'abord, WordPress utilise en interne
query_posts()
(un wrapper mince autourWP_Query
qui ne devrait pas être utilisé dans les thèmes ou les plugins) pour faire unWP_Query
. IlWP_Query
s'agit de la boucle / requête principale. Cette requête exécutera de nombreux filtres et actions jusqu'à ce que la chaîne de requête SQL réelle soit créée. L'un d'eux estpre_get_posts
. D'autres sontposts_clauses
,posts_where
etc., qui vous permettent également d'intercepter le processus de construction de la chaîne de requête.Un regard en profondeur sur ce qui se passe à l'intérieur du noyau
Conclusion
Si vous souhaitez vraiment modifier la requête principale, vous pouvez utiliser une grande variété de filtres. Utilisez-le simplement
$query->set( 'some_key', 'some_value' );
pour y modifier des données ou utilisez-le$query->get( 'some_key' );
pour récupérer des données afin d'effectuer des vérifications conditionnelles. Cela vous évitera de faire une deuxième requête, car vous ne modifiez que la requête SQL.Si vous devez faire une requête supplémentaire , optez pour un
WP_Query
objet. Cela ajoutera une autre requête à la base de données.Exemple
Comme les réponses fonctionnent toujours mieux avec un exemple, vous en avez ici un très joli (accessoires à Brad Touesnard), qui étend simplement l'objet principal et est donc assez réutilisable (faites-en un plugin):
Vous pouvez ensuite exécuter votre deuxième requête / supplémentaire comme vous pouvez le voir dans l'exemple suivant. N'oubliez pas de réinitialiser votre requête par la suite.
la source
Veuillez consulter les réponses à Quand utiliser WP_query (), query_posts () et pre_get_posts .
C'est une excellente ressource si vous avez des doutes en tête.
la source