it-swarm.com.ru

отображать сообщения с одинаковым термином таксономии

Я пытаюсь отобразить 5 связанных постов в цикле, причем посты с одинаковыми значениями таксономии. например У меня есть настроенная таксономия, называемая venues, поэтому каждому сообщению присваивается значение таксономии venue, поэтому в каждом сообщении я хочу отображать 5 других сообщений, которые имеют одинаковое значение таксономии (т.е. находятся в одном и том же месте).
Код, который у меня есть, работает не совсем правильно:

<?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; ?>

Он успешно показывает 5 постов, но это всего пять постов одного и того же типа, а не 5 постов, которые имеют одинаковое значение таксономии в цикле. Любые предложения будут ценны!

3
user1374796

Абсолютно непроверенный, и я не уверен на 100%, что понимаю ваш вопрос, но это (теоретически) должно получить 5 постов, которые используют те же места, что и текущий пост. Я бы, вероятно, предложил добавить несколько переходных процессов, чтобы вы не выполняли запросы постоянно.

Если это не сработает, я подозреваю, что синтаксис моего налогового запроса немного нарушен. Это всегда меня заводит, потому что это массив массивов.

//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

Спасибо за хорошее решение, но оно даст вам сообщения с любым термином в той же таксономии. Но если вам нужны только те, которые имеют те же термины, что и текущий пост, вам нужно изменить код следующим образом. Этот проверен и должен работать.

 <?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