web-dev-qa-db-ja.com

分類法ページからポストに条件付きでリダイレクトする方法

所属する分類用語に割り当てられている投稿が1つだけの場合は、投稿にリダイレクトします。これまでのところ、次のようにしています。

$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>';
    }
}

これはアーカイブページにリンクしていますが、関連する投稿にユーザーをリダイレクトしたいのですが、パーマリンクを変更して単一の投稿ページに移動するために何をする必要があるのか​​わかりません。

1
Neelam Khan

@クレム私は投稿をクエリしてカウントをチェックするために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
Neelam Khan

WP_Term$countプロパティを使うことができると思います。
そして、の場合、この用語に1つの投稿しか添付されていないので、この投稿オブジェクトを検索し、それを使って...

$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
ClemC