Avant qu’un seul fichier de thème ne s’exécute, WordPress doit déjà savoir ce qu’affichera la page : un article précis, une archive de catégorie, une page de recherche. Cette détermination initiale porte un nom bien précis dans l’architecture du logiciel.
Fonctionnement dans WordPress
La requête principale analyse l’URL entrante grâce aux règles de réécriture, en déduit les variables de requête pertinentes, puis interroge la base de données pour constituer l’objet global $wp_query. C’est ce même objet que les balises conditionnelles consultent, et que la Boucle standard parcourt sans qu’aucun appel explicite à WP_Query ne soit nécessaire dans le gabarit. Le hook pre_get_posts permet de la modifier avant son exécution.
Exemple
add_action( 'pre_get_posts', function( $query ) {
if ( $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', 'produit' );
}
} );
Bon à savoir
Le test is_main_query() est indispensable dans ce hook : sans lui, la modification s’appliquerait aussi à toute requête personnalisée déclenchée par un widget ou un shortcode sur la même page, avec des effets de bord difficiles à diagnostiquer.
Modifier la requête principale via pre_get_posts reste préférable à une réécriture complète du gabarit, puisque cela laisse WordPress gérer normalement la pagination, les balises conditionnelles et le titre de la page, qui resteraient sinon à recalculer manuellement.
Sur une page d’accueil affichant les articles récents, la requête principale est reconstruite implicitement par WordPress sans qu’aucun gabarit n’ait besoin d’instancier explicitement un objet WP_Query, contrairement à une page personnalisée qui afficherait un contenu entièrement sur mesure.