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' ) );
}
}
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.
À 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' );
}