Два цикла на странице архива

Вопрос или проблема

У меня есть 2 цикла на архивной странице. Я хочу, чтобы первый цикл отображал 2 последних поста из категории, а второй цикл начинался с 2 последних постов!

<div class="top-posts">
    <?php
    if (have_posts()) :
        while(have_posts()) : the_post();?>
            <div class="content">
                <?php the_post_thumbnail('archive'); ?>
                <h2><a href="https://wordpress.stackexchange.com/questions/253509/<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            </div>
        <?php endwhile;?>
    <?php endif;?>
</div>

<div class="primary-posts">
    <?php
    if (have_posts()) :
        while(have_posts()) : the_post();?>
            <h2><a href="https://wordpress.stackexchange.com/questions/253509/<?php the_permalink(); ?>" ><?php the_title(); ?></a></h2>
        <?php endwhile;?>
    <?php endif;?>
</div>

Из вашего вопроса неясно, какие именно посты вы хотите выбрать. В любом случае, вы явно хотите отображать разные посты, чем те, которые обычно показываются на архивной странице. Это означает, что вам нужно будет сделать другой выбор в вашем шаблоне, используя wp_query. Главное — выбрать правильные аргументы.

Сначала, для дальнейшего использования, нам нужно получить ID архива из основного цикла архива. Это вернет ID категории на странице архива категорий (или ID тега на странице архива тегов и так далее).

$cat_id = $wp_query->get_queried_object_id()

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

$args = array (
  'cat'            => $cat_id,
  'posts_per_page' => 2,
  ) 

$the_query = new WP_Query ($args);
if ($the_query->have_posts()) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        // отображение содержимого
        }
    wp_reset_postdata(); // восстановить оригинальный цикл архива
    }

Если вы хотите выбрать все посты, независимо от категории, на этой странице архива категории, вам нужно повторить вышеуказанное, но убрать строку ‘cat’ в $args.

После того как вы исчерпаете цикл, вам нужно сбросить его, используя rewind_posts(), прежде чем вы войдете во второй цикл:

<?php
rewind_posts();
if (have_posts()) :
    while(have_posts()) : the_post();?>
        <h2><a href="https://wordpress.stackexchange.com/questions/253509/<?php the_permalink(); ?>" ><?php the_title(); ?></a></h2>
    <?php endwhile;?>
<?php endif;?>

Ответ или решение

Для реализации вашего запроса, чтобы отобразить два последних поста из категории в первом цикле и затем второй цикл, который будет смещен на два последних поста, вы можете использовать класс WP_Query для создания двух отдельных запросов. Вот как это можно сделать:

  1. Получите ID текущей категории, чтобы использовать его в запросах.
  2. Создайте первый запрос для отображения двух последних постов.
  3. Создайте второй запрос для отображения следующих постов с использованием параметра offset.

Вот как это можно реализовать в коде:

<?php
// Получаем ID текущей категории
$cat_id = get_queried_object_id();

// Первый запрос - получение двух последних постов из текущей категории
$args_top_posts = array(
    'cat'            => $cat_id,
    'posts_per_page' => 2,
);

$top_posts_query = new WP_Query($args_top_posts);

if ($top_posts_query->have_posts()) : ?>
    <div class="top-posts">
        <?php while ($top_posts_query->have_posts()) : $top_posts_query->the_post(); ?>
            <div class="content">
                <?php the_post_thumbnail('archive'); ?>
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            </div>
        <?php endwhile; ?>
    </div>
<?php
endif;
wp_reset_postdata(); // Восстанавливаем оригинальный главный цикл

// Второй запрос - получение следующих постов с offset
$args_primary_posts = array(
    'cat'            => $cat_id,
    'posts_per_page' => 2,
    'offset'         => 2, // Смещение на 2 поста
);

$primary_posts_query = new WP_Query($args_primary_posts);

if ($primary_posts_query->have_posts()) : ?>
    <div class="primary-posts">
        <?php while ($primary_posts_query->have_posts()) : $primary_posts_query->the_post(); ?>
            <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php endwhile; ?>
    </div>
<?php
endif;
wp_reset_postdata(); // Восстанавливаем оригинальный главный цикл
?>

Объяснение кода:

  1. Получение ID категории: Используется get_queried_object_id(), чтобы получить ID текущей категории для использования в запросах.
  2. Первый цикл (top_posts_query):
    • Аргументы включают категорию и ограничение на 2 поста.
    • Если есть посты, выводятся их миниатюры и заголовки.
  3. Сброс данных: wp_reset_postdata() восстанавливает изначальный главный цикл WordPress после первого запроса.
  4. Второй цикл (primary_posts_query):
    • Параметр offset установлен на 2, чтобы получить следующие посты, после выбора первых двух.
    • Если есть посты, выводятся их заголовки.

Таким образом, вы четко разделили оба цикла и выводите нужные посты с учетом заданных условий.

Оцените материал
Добавить комментарий

Капча загружается...