WordPress
Boucle principale en alternance (filtre pre_get_posts)
Recherche…
Syntaxe
- add_action ('pre_get_posts', 'callback_function_name');
- function callback_function_name ($ query) {}
- // pour PHP 5.3.0 ou supérieur
- add_action ('pre_get_posts', fonction ($ query) {});
Paramètres
Paramètre | Détails |
---|---|
$ query | (WP_Query) Objet en boucle |
Remarques
Si vous utilisez PHP 5.3.0 ou supérieur, vous pouvez utiliser des fermetures ( fonctions anonymes )
add_action( 'pre_get_posts', function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
});
Ciblage en boucle encore plus spécifique
Disons que nous voulons changer la boucle principale , uniquement pour une taxonomie spécifique ou un type de publication.
Cibler la boucle principale uniquement sur book
la page type d'archive post.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
if( !is_post_type_archive( 'book' ) ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
// - and we are on 'book' post type archive page
}
Vous pouvez également vérifier la page d'archive de catégorie, de tag ou de taxonomie personnalisée à l'aide de is_category()
, is_tag()
et is_tax()
.
Vous pouvez utiliser n'importe quelle balise conditionnelle disponible dans WordPress.
Afficher les messages d'une seule catégorie
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
Pré-publier des messages filtrer l'utilisation de base
Parfois, vous souhaitez modifier la requête WordPress principale.
Le filtre pre_get_posts
est la voie à suivre.
Par exemple, en utilisant pre_get_posts
vous pouvez indiquer que la boucle principale n'affiche que 5 messages. Ou pour afficher des articles d'une seule catégorie, ou exclure une catégorie, etc.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
Comme vous pouvez le voir, nous passons l'objet de requête de boucle principale dans notre argument de fonction de rappel.
Note importante ici: nous passons en argument comme référence . Cela signifie que nous n'avons pas besoin de renvoyer une requête ou de définir des globales pour la faire fonctionner. Comme $query
est une référence à l'objet de requête principal, toutes les modifications que nous apportons à notre objet sont immédiatement reflétées dans l'objet de boucle principal.
Exclure la catégorie de la liste de diffusion
add_action( 'pre_get_posts', 'single_category_exclude' );
function single_category_exclude( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '-1' );
return;
}
Changer posts_per_page pour la boucle principale
Il suffit d'utiliser la méthode set()
de l'objet $query
.
Il faut deux arguments, en premier lieu ce que nous voulons définir et en second lieu la valeur à définir.
add_action( 'pre_get_posts', 'change_posts_per_page' );
function change_posts_per_page( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'posts_per_page', 5 );
return;
}
Ciblage uniquement de la boucle WordPress principale
WordPress applique le filtre pre_get_posts
à toute boucle générée. Cela signifie que toutes les modifications apportées à notre fonction de rappel sont appliquées à toutes les boucles existantes.
De toute évidence, ce n'est pas ce que nous voulons dans la plupart des scénarios.
Dans la plupart des cas, nous aimerions cibler uniquement la boucle principale et uniquement les écrans non-admin.
Nous pouvons utiliser is_main_query()
méthode et is_admin()
fonction globale pour vérifier si nous sommes au bon endroit.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
}