Как условно перенаправить на сообщение со страницы таксономии?
Я хотел бы перенаправить на сообщение, если термин таксономии, к которому он относится, имеет только одно сообщение, назначенное ему, и пока у меня есть это:
$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>';
}
}
Эта ссылка ведет на страницу архива, но я хочу, чтобы она перенаправляла пользователя на соответствующий пост, я не уверен, что мне нужно сделать, чтобы изменить постоянную ссылку для перехода на страницу с одним сообщением.
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;
}
}
@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>';