godsplane
@godsplane

Как реализовать такой цикл вывода постов на wp?

Понимаю что тут мервтое комьюнити, но все же попробую
unknown.png
Вроде по картинке понятно, но все же объясню.
Есть таксономия недвижимость. В этой таксономии есть термы "Жилая недвижимость и еще какая то", и у каждоого терма есть посты принадлежащие к этом терму, также у каждого поста есть метки. Как вывести по термам понятно, но как мне вывести сначала метки принадлежащии выводимым постам ниже?Я пробовал и через get_tags() и через get_terms(), но я все таки не очень понял как мне передать посты полученые через get_posts() в get_tags().
+ еще потом как то это распихать по табам.
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
vasmor
@vasmor
Интересуюсь
Есть такой вариант:
Получаем посты по $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>';
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@weart
Используйте шаблоны архивов и таксономий.
Лично я бы использовал ajax (технически это получился бы фильтр по сути)
Ответ написан
Kozack
@Kozack Куратор тега WordPress
Thinking about a11y
Хрен знает что это за логика такая, но вам поможет
https://wp-kama.ru/function/wp_get_object_terms
Перёте массив ID постов. И загружаете термины определённой таксономии для них.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы