J'ai essayé de sortir le contenu de tous les types de publications (Posts, Pages et CPT) en fonction d'un terme d'une taxonomie personnalisée qu'ils doivent partager ( signifiant s’ils ne partagent pas ce terme particulier, le résultat ne doit pas inclure ce type de post).
Voici ce que j'ai jusqu'à présent:
$term_list = wp_get_post_terms($post->ID, 'persons', array('fields' => 'names')); // persons is the custom taxonomy
$args = array(
'post_type' => array( 'post', 'page', 'profile', 'letter' ), // profile and letter are CPTs
'tax_query' => array(
array(
'taxonomy' => 'persons',
'field' => 'slug',
'terms' => $term_list
)
),
'post__not_in'=>array($post->ID)
);
$related_content = new WP_Query( $args );
if ( $related_content->have_posts() ) {
echo __('Related Content (profiles, pages, articles, letters):', 'teselle');
echo '<ul class="related-content">';
while ($related_content->have_posts()) {
$related_content->the_post();
echo '<li><a href="' . esc_url( get_permalink() ) . '">' . get_the_title() . '</a></li>';
} // endwhile
echo '</ul>';
} // endif
wp_reset_query(); wp_reset_postdata();
Le problème avec le code ci-dessus est qu'il génère trop de sorties.
Si je remplis le slug exact du terme dont j'ai besoin, par exemple 'terms' => 'the-exact-slug'
, cela fonctionne parfaitement, mais j'ai vraiment besoin que ce soit une variable.
Quelqu'un peut-il indiquer quelle est mon erreur dans le code ci-dessus?
Merci!
on se revoit ici encore :)
Essayez d'utiliser ceci:
$term_list = wp_get_post_terms( $post->ID, 'persons', array( 'fields' => 'ids' ) );
et
'tax_query' => array(
array(
'taxonomy' => 'persons',
'field' => 'id',
'terms' => $term_list
)
),
Autant que je sache, le tax_query
accepte le champ uniquement par id
ou slug
(voir ici . Et le wp_get_post_terms
accepte uniquement names
(pas de slug), ids
et all
. correspondance entre eux est seulement id
.
Mettre à jour
Si vous avez besoin de slug
, utilisez ceci:
$terms = wp_get_post_terms( $post->ID, 'persons' );
$term_slugs = wp_list_pluck( $terms, 'slug' );
Vous pouvez essayer les slugs au lieu des noms, c.-à-d.
$term_list = wp_get_post_terms($post->ID, 'persons', array('fields' => 'slug'));
au lieu de
$term_list = wp_get_post_terms($post->ID, 'persons', array('fields' => 'names'));
depuis que vous utilisez
'field' => 'slug',
dans la requête fiscale.
EDIT:
$term_list = wp_get_post_terms($post->ID, 'persons', array('fields' => 'ids')); // persons is the custom taxonomy
$args = array(
'posts_per_page'=>-1,
'post_type' => array( 'post', 'page', 'profile', 'letter' ), // profile and letter are CPTs
'tax_query' => array(
array(
'taxonomy' => 'persons',
'field' => 'id',
'terms' => $term_list
)
),
'post__not_in'=>array($post->ID)
);
J'ai ajouté posts_per_page pour renvoyer tous les résultats et utiliser les identifiants dans wp_get_post_terms et les identifiants dans tax_query.