web-dev-qa-db-fra.com

Utilisation de is_main_query pour sélectionner le type de publication personnalisé sur certaines pages

J'ai essayé de mettre en œuvre certaines des idées discutées par Andrew Nacin http://wordpress.tv/2012/06/15/andrew-nacin-wp_query/ dans mon flux de travail, en essayant spécifiquement de ne plus utiliser query_posts ou un nouveau WP_Query et de modifier la requête principale à la place. Jusqu'à présent, je travaille assez bien sur ma page d'accueil en utilisant le code suivant:

function some_name($query) {
    if ( $query->is_main_query() && $query->is_home() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'some_name');

Cela change simplement le post_type de la requête par défaut en home_portfolio. Je devais utiliser le fichier index.php par défaut et ne pas sélectionner une page à utiliser comme page de couverture afin que cela fonctionne.

Je voudrais aussi utiliser cette méthode sur certaines pages, mais je ne sais pas comment cibler les pages à partir de functions.php. Si j'utilise $query->is_page(ID), la boucle standard de la page renvoie 404 à chaque fois que j'essaie de modifier le post_type.

En d'autres termes, il me semble que je devrais pouvoir remplacer $query->is_home() par $query->is_page(ID) dans functions.php et pouvoir cibler cet ID de page spécifique, mais je ne parviens pas à le faire fonctionner.

Toute aide serait grandement appréciée. Sinon, ma page d'accueil est très efficace, mais toutes les autres pages exécutent toujours plusieurs requêtes (par rapport à la modification de la requête principale sur ces pages).

3
patrickzdb

Le is_home() conditionnel renvoie true lorsque la page actuellement affichée correspond à l'index des articles de blog . Si vous souhaitez cibler spécifiquement la page d'accueil , vous devez utiliser is_front_page() :

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_front_page() ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );

De plus, vous n'avez pas besoin d'ajouter $query-> aux appels à is_home(), is_front_page(), etc. Vous devez le faire pour is_main_query(), car vous voulez vous assurer que la requête filtrée est spécifiquement la requête principale, car toute page donnée aura plusieurs requêtes.

Donc, si vous souhaitez cibler une page spécifique, appelez simplement is_page( $id ):

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_page( $id ) ) {
        $query->set( 'post_type', array( 'home_portfolio' ) );
    }
}
add_action( 'pre_get_posts', 'wpse83754_filter_pre_get_posts' );
3
Chip Bennett