Есть такой вариант:
Получаем посты по $term
$query = new WP_Query( array(
'post_type' => $type, // Ваш тип записи
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $tax, // Такса типа записи
'field' => 'slug',
'terms' => $term // Нужный терм
)
)
) );
Через цикл создаем массив id всех меток, присутствующих в полученных на предыдущем шаге постах
$all_tags = [];
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$cur_terms = get_the_terms( $post->ID, $post_tag ); // $post_tag - нужная таксономия (если это стандартная метка поста, то $post_tag = 'post_tag')
if( is_array( $cur_terms ) ){
foreach( $cur_terms as $cur_term ){
$all_tags[] = $cur_term->term_id;
}
}
}
}
// Возвращаем оригинальные данные поста. Сбрасываем $post.
wp_reset_postdata();
$all_tags = array_unique($all_tags); // Оставляем уникальные значения в массиве
Выводим кнопки табов
echo '<ul>';
$i = 0;
foreach ( $all_tags as $tag ) {
$class_active = $i === 0 ? ' tab-active' : ''; // для первой кнопки ставим активный класс
$tag_name = get_term( intval( $tag ) )->name; // Наименование метки
echo '<li class="tab-caption' . $class_active . '">' . $tag_name . '</li>';
$i++;
}
echo '</ul>';
Выводим контент табов
echo '<div>';
$k = 0;
foreach ( $all_tags as $tag ) {
$class_active = $k === 0 ? ' tab-active' : '';
echo '<div class="tab-content' . $class_active . '">';
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
if ( has_term( intval( $tag ), $post_tag ) ) { // Выводим только те посты, в которых есть текущая метка в цикле
the_content(); // Здесь вывод данных поста. Как вариант - get_template_part( 'path/to/template' );
}
}
}
// Возвращаем оригинальные данные поста. Сбрасываем $post.
wp_reset_postdata();
echo '</div>';
$k++;
}
echo '</div>';