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 autour WP_Query
qui ne devrait pas être utilisé dans les thèmes ou les plugins) pour faire un WP_Query
. Il WP_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 est pre_get_posts
. D'autres sont posts_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
WordPress exécute la wp()
fonction (in wp-includes/functions.php
), qui appelle $wp->main()
( $wp
est un objet de classe WP, qui est défini dans wp-includes/class-wp.php
). Cela indique à WordPress de:
- Analyser l'URL dans une spécification de requête en utilisant
WP->parse_request()
- plus d'informations ci-dessous.
- Définissez toutes les variables is_ utilisées par les balises conditionnelles à l'aide de
$wp_query->parse_query()
( $wp_query
est un objet de class WP_Query
, qui est défini dans wp-includes/query.php
). Notez que malgré le nom de cette fonction, dans ce cas, WP_Query->parse_query
ne fait aucune analyse pour nous, car cela est fait au préalable par WP->parse_request()
.
- Convertissez la spécification de requête en une requête de base de données MySQL et exécutez la requête de base de données pour obtenir la liste des publications, dans la fonction WP_Query-> get_posts (). Enregistrez les publications dans l'objet $ wp_query à utiliser dans la boucle WordPress.
Codex source
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):
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'";
}
}
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.
$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;