Как условно перенаправить на сообщение со страницы таксономии?


Я хотел бы перенаправить на сообщение, если термин таксономии, к которому он относится, имеет только одно сообщение, назначенное ему, и пока у меня есть это:

$term_id = get_queried_object()->term_id;
$taxonomy_name = 'product_range';
$term_children = get_term_children( $term_id, $taxonomy_name );

foreach ( $term_children as $child ) {
  $term = get_term_by( 'id', $child, $taxonomy_name );
    if($term->count <= 1 ) {
      echo '<a href="'. get_term_link($child, $taxonomy_name) .'" class="thumb" title="'.$term->name.'">'.$term->name.'</a>';
    }
}

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

Author: ClemC, 2017-08-14

2 answers

Я думаю, вы можете просто использовать WP_Term' s $count свойство, которое должно содержать количество записей, прикрепленных к этому текущему термину.
Затем, если к этому термину прикреплена только одна запись, запросите этот объект post и сделайте с ним свои дела...

$term = get_queried_object();

if ( $term->count === 1 ) {
    $args = array(
        'tax_query' => array(
            array(
                'taxonomy'         => 'product_range',
                'field'            => 'term_id',
                'terms'            => array( $term->term_id ),
                'include_children' => false,
            ),
        )
    );

    $query = new WP_Query( $args );
    $posts = $query->posts;
    $post  = $posts[0];

    /**
     * IMPORTANT FOR SEO...
     * Temporary redirection until your category is populated - Use 301 instead of 302 to redirect permanently...
     */
    if ( wp_redirect( get_permalink( $post->ID ), 302 ) ) {
        exit;
    }
}
 0
Author: ClemC, 2017-08-15 10:28:49

@CLEMC Мне удалось выяснить это, добавив WP_Query для запроса сообщений и проверки количества, вот мой код:

    $term_id = get_queried_object()->term_id;
        $taxonomy_name = 'product_range';
        $custom_terms = get_term_children( $term_id, $taxonomy_name );
            echo '<div class="row row__condensed">';
            foreach($custom_terms as $custom_term) {
                $term = get_term_by( 'id', $custom_term, $taxonomy_name );
                wp_reset_query();
                $args = array(
                    'post_type' => 'product',
                    'posts_per_page' => 1,
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'product_range',
                            'field' => 'slug',
                            'terms' => $term->slug,
                        ),
                    ),
                 );

                $loop = new WP_Query($args);

                if($loop->have_posts()) {

                    while($loop->have_posts()) : $loop->the_post();
                        // If only one post exists link to product
                        if($term->count === 1 ) {
                            echo '<div class="col-xs-12 col-md-4">';
                                echo '<div class="grid__item">';
                                    echo '<a href="'.get_permalink().'">';                                                       
                                    echo '</a>';
                                    echo '<h3><a href="' . get_permalink() . '">'.$term->name .'</a></h3>';
                                    echo '<p>'.wp_trim_words($term->description, 23, '...').'</p>';
                                echo '</div>';
                            echo '</div>';
                        }
                        //else link to the listing page
                        else {
                            echo '<div class="col-xs-12 col-md-4">';
                                echo '<div class="grid__item">';
                                    echo '<a href="' . get_term_link( $custom_term, $taxonomy_name ) . '">';                                    
                                    echo '</a>';
                                    echo '<h3><a href="' . get_term_link( $custom_term, $taxonomy_name ) . '">'.$term->name .'</a></h3>';
                                echo '<p>'.wp_trim_words($term->description, 23, '...').'</p>';
                                echo '</div>';
                            echo '</div>';
                        }
                    endwhile;
                }
            else {
        echo "no posts found.";
            } //endforeach
        echo '</div>'; 
 0
Author: Neelam Khan, 2017-08-15 16:28:12