Вопрос или проблема
Я использую цикл в своем пользовательском шаблоне страницы, как видно из моего кода. Должны отображаться только 2 поста, а для остальных должна быть возможность пагинации.
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts(
array (
'posts_per_page' => 2,
'post_type' => 'post',
'category_name' => 'news',
'category' => 1,
'paged' => $paged )
);
// Цикл
while ( have_posts() ) : the_post();?>
<div class="news-page-content-wrapper">
<div class="news-page-content">
<h1><a class="read-more"href="https://wordpress.stackexchange.com/questions/257135/<?php the_permalink(); ?>"><?php the_title();?></a></h1>
<figure><?php the_post_thumbnail(); ?></figure>
<p><?php echo get_the_excerpt();?></p>
<a href="https://wordpress.stackexchange.com/questions/257135/<?php the_permalink(); ?>">Читать далее»</a>
</div>
</div>
<?endwhile;
// Сбросить запрос
wp_reset_query();
?>
<?php next_posts_link(); ?>
<?php previous_posts_link(); ?>
Как я могу сделать пагинацию, используя цикл с ID категории?
Вы можете следовать по следующему URL, чтобы найти ваше решение
Вы можете использовать фильтр tax_query: например, так
$args = array
(
'post_type' => 'item',
'nopaging' => true,
'tax_query' => array
(
'taxonomy' => $taxonomy,
'field' => 'term_taxonomy_id',
'terms' => $term_id
),
'meta_query' => array(
'key' => 'from_import',
'value' => '1'
)
);
$posts = query_posts( $args );
Ответ или решение
Чтобы добавить пагинацию на свою кастомную страницу с использованием цикла WordPress, вам нужно выполнить несколько шагов. В вашем исходном коде есть некоторые моменты, которые необходимо исправить и доработать для корректной работы пагинации.
Вот обновленный код с комментариями:
<?php
// Получаем текущую страницу для пагинации
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Определяем аргументы для WP_Query
$args = array(
'posts_per_page' => 2, // Количество постов на странице
'post_type' => 'post', // Тип поста
'category_name' => 'news', // Обозначаем категорию
'paged' => $paged // Передаем текущую страницу
);
// Создаем новый экземпляр WP_Query
$query = new WP_Query($args);
// Проверяем, есть ли посты
if ($query->have_posts()) :
// Цикл вывода постов
while ($query->have_posts()) : $query->the_post(); ?>
<div class="news-page-content-wrapper">
<div class="news-page-content">
<h1><a class="read-more" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
<figure><?php the_post_thumbnail(); ?></figure>
<p><?php echo get_the_excerpt(); ?></p>
<a href="<?php the_permalink(); ?>">Читать далее »</a>
</div>
</div>
<?php endwhile; ?>
// Пагинация
?>
<div class="pagination">
<?php
// Показать ссылки на следующую и предыдущую страницы
previous_posts_link('« Назад');
next_posts_link('Вперед »', $query->max_num_pages);
?>
</div>
<?php
else :
// Если посты не найдены, выводим сообщение
echo '<p>Посты не найдены.</p>';
endif;
// Сбрасываем данные поста
wp_reset_postdata();
?>
Объяснение ключевых моментов:
-
Создание WP_Query: Использование
new WP_Query($args);
вместоquery_posts()
. Это позволяет более гибко управлять запросом и избегать конфликтов с глобальной переменной$wp_query
. -
Цикл: Цикл стандартный, но с небольшой модификацией, чтобы использовать новый объект запроса.
-
Пагинация: Используются функции
previous_posts_link()
иnext_posts_link()
. При этом для следующей ссылки необходимо передать общее количество страниц, полученное через$query->max_num_pages
. -
Сброс данных поста:
wp_reset_postdata();
нужен, чтобы сбросить глобальные переменные после выполнения цикла.
Этот код должен корректно работать на вашей кастомной странице, предоставляя нужную пагинацию для постов в категории ‘news’. Если у вас возникнут дополнительные вопросы или потребуется помощь в доработке, не стесняйтесь спрашивать!