web-dev-qa-db-fra.com

Comment afficher du contenu basé sur la même taxonomie personnalisée?

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!

2
user2015

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' );
1
Anh Tran

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.

0
birgire