WordPress как на ладони

Как чередовать посты из разных циклов(условий/такс)?

Есть два вида постов, с разной вёрсткой и из разных таксономий, или даже один вид просто повторитель на кастомных полях. Требуется вывести и те и другие вперемешку, не один за другим. Не нашёл ничего в интернете на эту тему.

Заметки к вопросу:
Kama 2.4 года назад

В чем вопрос? Как выбрать такие посты или как их показать?

rmltsn 2.4 года назад

Нужно реализовать такую структуру:

[Блок А] - запись из таксономии услуги
[Блок Б] - запись из стандартной рубрики
[Блок C] - кастомные поля

[Сайдбар]
	[Блок А]
	[Блок А]
	[Блок Б]
	[Блок C]
	[Блок А]
	[Блок А]
	[Блок Б]
	[Блок C]
[/Сайдбар]

Пока писал подумал, что можно открыть тогда для каждого новой цепочки блоков - отдельный цикл, но как тогда не выводить одинаковые записи? Или есть более элегантное решение?

0
rmltsn
2.4 года назад
  • 1
    Kama9601

    Записи из таксономий можно получить одним запросом смотри тут примеры. Из кастомных полей наверное лучше сделать еще один запрос.

    Затем собираешь это все в один массив, если нужно сортируешь его. При сборке можно в индекс массива указывать ID поста, тогда одинаковые посты сами собой отвалятся.

    Затем проходишся циклом по полученному массиву и выводишь все в нужном виде.

    Примерно так:

    $posts_1 = get_posts( параметры );
    $posts_2 = get_posts( параметры );
    
    $posts = [];
    
    foreach( $posts_1 as $p ){
    	$posts[ $p->ID ] = $p;
    }
    
    foreach( $posts_2 as $p ){
    	$posts[ $p->ID ] = $p;
    }
    
    // тут можно отсортировать по ID например
    $posts = wp_list_sort( $posts, 'ID', 'DESC' );
    
    foreach( $posts as $post ){
    	setup_postdata( $post );
    	?>
    	<!-- Вывода постов, функции цикла: the_title() и т.д. -->
    	<?php 
    }
    wp_reset_postdata(); // Сбрасываем $post
    rmltsn 2.4 года назад

    Да но получилось то же самое, что если просто указать таксономии в одном запросе, а как сделать для каждого отдельного запроса свою вёрстку?

    rmltsn 2.4 года назад

    Блин туплю, правильно же, теперь можно любой цикл получается внутри запустить с $post. Спасибо за помощь))

    rmltsn 2.4 года назад

    Но как всё же теперь внутри цикла проверить на то, к какой таксономии относится и вывести соответствующую вёрстку ? Тоесть не чередовать по алгоритму, а каждому своё ?

    Kama 2.4 года назад

    Сколько постов вообще нужно выводить таким образом? Пагинация нужна?

    Как вариант, сделать тоже самое и и для каждой таксономии и каждому циклу при сборке указать таксономию, затем её проверять.

    $tax_name_1 = 'tax_name_1';
    $tax_name_2 = 'tax_name_2';
    $term_name_1 = 'term_name';
    $posts_1 = get_posts( [ параметры_такс_1 ] );
    $posts_2 = get_posts( [ параметры_такс_2 ] );
    $posts_3 = get_posts( [ параметры_мета ] );
    
    $posts = [];
    
    foreach( $posts_1 as $p ){
    	$p->tpl_type = $tax_name_1;
    	$posts[ $p->ID ] = $p;
    }
    
    foreach( $posts_2 as $p ){
    	$p->tpl_type = $tax_name_2;
    	$posts[ $p->ID ] = $p;
    }
    
    foreach( $posts_3 as $p ){
    	$p->tpl_type = $term_name_1;
    	$posts[ $p->ID ] = $p;
    }
    
    // тут можно отсортировать по ID например
    $posts = wp_list_sort( $posts, 'ID', 'DESC' );
    
    foreach( $posts as $post ){
    	setup_postdata( $post );
    
    	if( $post->tpl_type === $tax_name_1 ){
    		?>
    		<!-- Вывода постов, функции цикла: the_title() и т.д. -->
    		<?php 
    	}
    	elseif( $post->tpl_type === $tax_name_2 ){
    		?>
    		<!-- Вывода постов, функции цикла: the_title() и т.д. -->
    		<?php    
    	}
    	elseif( $post->tpl_type === $term_name_1 ){
    		?>
    		<!-- Вывода постов, функции цикла: the_title() и т.д. -->
    		<?php 
    	}
    	else {
    		echo 'Шаблон для типа не усказан';
    	}
    }
    wp_reset_postdata(); // Сбрасываем $post
    stepan 2.4 года назад

    get_the_terms
    узнаешь, к какой таксономии относится пост

    rmltsn 2.4 года назад

    Нет, пагинация не нужна - это просто сайдбар, где выводятся похожие записи вперемежку с другими видами записи

    rmltsn 2.4 года назад

    Хорошо, спасибо, теперь яснее стало, буду углубляться в вопрос!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация