Вопрос: Получить последние 5 постов и конкретный пост и сортировать в определенном порядке

Я ищу несколько советов о том, как сделать галерею изображений. Это особый бит галереи, потому что я покажу последние 5 постов и фиксированный пост на общую сумму 6 постов в определенном порядке. т.е. фиксированный пост должен быть третьим в списке. Единственный метод, который, по моему мнению, позволяет создать 3 цикла: первый, чтобы увидеть последние два поста, второй, чтобы отобразить фиксированный пост (по идентификатору), и третий чтобы увидеть другие последние три сообщения. Что-то вроде этого (скорее всего, это не правильно):

        <?php $my_query = new WP_Query( 'posts_per_page=2' ); //get the latest 2 posts            while ( $my_query->have_posts() ) : $my_query->the_post();            $do_not_duplicate = $post->ID;         ?>            <?php the_title(); ?>        <?php endwhile; ?>        <?php $my_query2 = new WP_Query( 'p=1' ); //get fixed post with id=1            while ( $my_query2->have_posts() ) : $my_query2->the_post();        ?>            <?php the_title(); ?>        <?php endwhile; ?>        <?php $my_query3 = new WP_Query( 'posts_per_page=3' ); //get the latest 3 posts            while ( $my_query3->have_posts() ) : $my_query3>the_post();            if ( $post->ID == $do_not_duplicate ) continue; //don't show the same post of the first loop        ?>             <?php the_title(); ?>        <?php endwhile; endif; ?>

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

спасибо

Ответы и комментарии:

Дайте мне знать, если это работает для вас.
Создан 25-05-2016 05:04 Luis Sanz

Ваш код не работает, если на одной странице есть несколько циклов. Второй цикл похож на первый. Какие-либо предложения ?
Создан 08-08-2016 03:18 sb0k

@ sb0k, используйте wp_reset_postdata () между ними.
Создан 08-08-2016 10:23 Luis Sanz

я замкнул первую петлю с endofeach; wp_reset_postdata (); & wp_reset_query () ;. но ничего...
Создан 09-08-2016 08:50 sb0k

Каковы ваши аргументы для get_posts () во втором цикле? Как и в моем ответе, он получит пять последних сообщений. Возможно, вам придется изменить параметры запроса, чтобы достичь другого результата.
Создан 09-08-2016 05:52 Luis Sanz

вы также можете использовать счетчик, встроенный в каждый объект запроса, $ my_query-> current_post
Создан 24-05-2016 03:59 Milo

Даже лучше. Я обновлю ответ ...
Создан 24-05-2016 03:12 AntonChanning

большое спасибо .. это решение, которое я не думал. Я уверен, что это даст хорошие результаты.
Создан 24-05-2016 03:00 sb0k

Я не могу придумать, как получить последние 5 сообщений плюс один конкретный запрос в одном запросе без использования SQL.
Если вы не возражаете против использования двух запросов, я думаю, что это будет простой способ сделать то, что вы намереваетесь:
// Получить последние 5 сообщений (что по умолчанию равно значению 'posts_per_page' get_posts)
$ posts = get_posts ();

// Создаем массив с идентификаторами
$ latests_posts_ids = wp_list_pluck ($ posts, 'ID');

// Вставляем нужный идентификатор в третью позицию
$ post_id_to_insert = 1;
$ insert_position = 2; // который равен 3, когда начинается с 0
array_splice ($ latests_posts_ids, $ insert_position, 0, $ post_id_to_insert);

// Получить сообщения на основе идентификаторов и не изменять их порядок
$ args = array (
    'posts_per_page' => 6,
    'post__in' => $ latests_posts_ids,
    'orderby' => 'post__in'
);

$ posts = get_posts ($ args);

// Разбор сообщений
foreach ($ posts как $ post):

    setup_postdata ($ post);
    the_title ();

endforeach;

Я использую get_posts (), но вместо этого вы можете безопасно использовать WP_query.
WordPress уже обрабатывает возможные дубликаты в post__in, что будет иметь место, если пост, который вы хотите вставить, является одним из последних 5.
Создан 24-05-2016 04:24

Один из способов - использовать встроенный счетчик, чтобы узнать, сколько раз вы проходили через цикл, а затем использовать get_post для идентификатора с фиксированными записями, как только вы прошли через 3 раза ...
 <? PHP
        $ my_query = new WP_Query ('posts_per_page = 5'); // получить последние 5 сообщений
        while ($ my_query-> have_posts ()): $ my_query-> the_post ();
        $ do_not_duplicate = $ post-> ID;
    ?>
        <? php the_title (); ?>

    <? PHP
         if (3 == $ my_query-> current_post) {
             $ fixed_post = get_post (1);
             // Делаем то, что вам нужно, с $ fixed_post ...
         }
         ENDWHILE;
    ?>

См. Ссылку разработчика WordPress для get_post для получения дополнительной информации ...
(Отредактированный код для использования встроенного счетчика в соответствии с предложением Мило в комментариях.)
Создан 24-05-2016 03:18