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
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow