web-dev-qa-db-fra.com

afficher les messages avec le même terme de taxonomie

J'essaie d'afficher 5 articles liés dans la boucle, ces articles étant des articles partageant la même valeur taxonomique. par exemple. J'ai une taxonomie personnalisée appelée venues et chaque publication se voit attribuer une valeur de taxonomie venue. Ainsi, dans chaque publication, je souhaite afficher 5 autres publications partageant la même valeur de taxonomie (c'est-à-dire se trouvant au même endroit).
Le code que j'ai jusqu'à présent ne fonctionne pas correctement:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php
$custom_terms = get_terms('venues');

foreach($custom_terms as $custom_term) {
    wp_reset_query();
    $args = array('post_type' => 'listings',
    'posts_per_page' => 5,
        'tax_query' => array(
            array(
                'taxonomy' => 'venues',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            ),
        ),
     );

     $loop = new WP_Query($args);
     if($loop->have_posts()) {

        while($loop->have_posts()) : $loop->the_post(); ?>
        <div class="listing-title"><?php the_title(); ?></div>     
        <?php endwhile;
     }
}
?>
<?php wp_reset_query(); ?>
<?php endwhile; endif; ?>

Il a réussi à afficher 5 articles, mais il ne s'agit que de 5 articles du même type d'article et non de 5 articles qui partagent la même valeur taxonomique dans la boucle. Toutes les suggestions seraient grandement appréciées!

3
user1374796

Totalement non testé et je ne suis pas sûr à 100% de bien comprendre votre question, mais cela devrait (en théorie) donner lieu à 5 messages partageant les mêmes contenus que le message actuel. Je suggérerais probablement d’ajouter des éléments transitoires à ceci afin que vous ne lanciez pas de requêtes en permanence.

Si cela ne fonctionne pas, je soupçonne que la syntaxe de ma requête fiscale est un peu fausse. Cela me prend toujours parce que c'est un tableau de tableaux.

//get the post's venues
$custom_terms = get_terms('venues');

if( $custom_terms ){

    // going to hold our tax_query params
    $tax_query = array();

    // add the relation parameter (not sure if it causes trouble if only 1 term so what the heck)
    if( count( $custom_terms > 1 ) )
        $tax_query['relation'] = 'OR' ;

    // loop through venus and build a tax query
    foreach( $custom_terms as $custom_term ) {

        $tax_query[] = array(
            'taxonomy' => 'venues',
            'field' => 'slug',
            'terms' => $custom_term->slug,
        );

    }

    // put all the WP_Query args together
    $args = array( 'post_type' => 'listings',
                    'posts_per_page' => 5,
                    'tax_query' = $tax_query );

    // finally run the query
    $loop = new WP_Query($args);

    if( $loop->have_posts() ) {

        while( $loop->have_posts() ) : $loop->the_post(); ?>

        <div class="listing-title"><?php the_title(); ?></div>     
        <?php 

        endwhile;

    }

    wp_reset_query();?>

}
2
helgatheviking

Merci pour la bonne solution, mais celle-ci vous permettra de recevoir des messages avec n'importe quel terme de la même taxonomie. Mais si vous voulez seulement ceux qui ont les mêmes termes avec le post actuel, vous devez modifier le code de cette manière. Celui-ci est testé et devrait fonctionner.

 <?php
        //get the post's venues
    $custom_terms = wp_get_post_terms($post->ID, 'venues');

    if( $custom_terms ){

        // going to hold our tax_query params
        $tax_query = array();

        // add the relation parameter (not sure if it causes trouble if only 1 term so what the heck)
        if( count( $custom_terms > 1 ) )
            $tax_query['relation'] = 'OR' ;

        // loop through venus and build a tax query
        foreach( $custom_terms as $custom_term ) {

            $tax_query[] = array(
                'taxonomy' => 'venues',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            );

        }

        // put all the WP_Query args together
        $args = array( 'post_type' => 'listings',
                        'posts_per_page' => 5,
                        'tax_query' => $tax_query );

        // finally run the query
        $loop = new WP_Query($args);

        if( $loop->have_posts() ) {

            while( $loop->have_posts() ) : $loop->the_post(); ?>

            <div class="listing-title"><?php the_title(); ?></div>     
            <?php 

            endwhile;

        }

        wp_reset_query();

    }?>
0
Juha