web-dev-qa-db-fra.com

pre_get_posts toutes les publications et type de publication personnalisé avec certaines balises

Je souhaite afficher tous les articles que j'ai et les pages de type d'article personnalisé s'ils ont un tag particulier sur ma page d'accueil. Ceci est mon code, mais je ne peux pas le faire fonctionner:

add_filter( 'pre_get_posts', 'get_posts_plus_cpt_with_certain_tag' );

function get_posts_plus_cpt_with_certain_tag( $query ) {
   if ( is_home() && $query->is_main_query() ) {
      if ( $query->query_vars['post_type'] == 'cpt' ) {     
         $taxquery = array(
            array(            
               'taxonomy' => 'cpt-tag',
               'field' => 'id',
               'terms' => 1
               )
            );      
            $query->set('tax_query', $taxquery);        
         }  
      $query->set( 'post_type', array( 'post', 'cpt' ) );               
      return $query;
   }
}

Je suis coincé, toute aide serait appréciée. Merci!

Edit: mis à jour le code, grâce à Pieter Goosen

add_action( 'pre_get_posts', 'get_posts_plus_cpt_with_certain_tag' );

function get_posts_plus_cpt_with_certain_tag( $query ) {
   if ( $query->is_home() && $query->is_main_query() ) {
      if ( 1 == 1 ) {   
         $taxquery = array(
            array(            
               'taxonomy' => 'cpt_tag',
               'field' => 'term_id',
               'terms' => 27
               )
            );      
            $query->set('tax_query', $taxquery);        
         }  
      $query->set( 'post_type', array( 'post', 'cpt' ) );
   }
}
1
pot63

Vous avez quelques problèmes ici

  • is_home() devrait être une méthode de $query, donc il devrait devenir $query->is_home()

  • La valeur du paramètre field doit être term_id et non id. id fonctionne, donc toute merde passée en tant que valeur, car si vous examinez les codes source, la source ne vérifie que slug et name, elle ne recherche pas spécifiquement term_id. Donc, toute valeur fonctionnera par défaut. Ceci est incorrect. Le correctet seulementpour les identificateurs de terme) est term_id

  • pre_get_posts est une action, pas un filtre

  • Les actions ne retournent pas, alors supprimez return $query

  • 1 ne peut pas être votre identifiant de terme. 1 est l'identifiant de terme ( reserved ) du terme de catégorie par défaut uncategorized. C'est pourquoi votre requête ne parvient pas à obtenir des publications. uncategorized est un terme désignant la taxonomie intégrée category et non la taxonomie personnalisée cpt-tag

  • Votre taxonomie personnalisée ne peut pas être cpt-tag. Les noms de taxonomie doivent toujours être en minuscules ( caveat - semble que les chiffres le sont aussi, sinon le premier chiffre ) avec plusieurs mots séparés par un tiret bas. Les traits d'union doivent être évités car ils créent des problèmes avec noms de modèles, etc.

  • Votre vérification conditionnelle if ( $query->query_vars['post_type'] == 'cpt' ) {} ne retournera probablement jamais non plus car elle est la page d'accueil. Le post_type par défaut sur la page d’accueil est post, toujours s’il n’est pas modifié par un type de filtre comme pre_get_posts. Je voudrais juste enlever ceci.

MODIFIER

À partir de votre modification et de votre commentaire, vous devez supprimer post du tableau post_type si vous n'avez pas besoin d'afficher les publications de type publication sourde. De plus, vous n'avez pas besoin de la vérification 1 == 1.

Votre code final devrait être:

add_action( 'pre_get_posts', 'get_posts_plus_cpt_with_certain_tag' );

function get_posts_plus_cpt_with_certain_tag( $query ) {
   if ( $query->is_home() && $query->is_main_query() ) {

         $taxquery = array(
            array(            
               'taxonomy' => 'cpt_tag',
               'field' => 'term_id',
               'terms' => 27
               )
            );      
            $query->set('tax_query', $taxquery);        
         }  
      $query->set( 'post_type', 'cpt' );

}
1
Pieter Goosen