Проблема с неправильной работой custom WP_Query
Хорошо,
Я создал кастомный WP_Query, который получает post_type post
и выводит его в виде стилизованного списка. Он работает хорошо и выводит стилизованный список, но затем под ним отображаются все записи снова, но в совершенно другом формате (без стилей).
<?php
// Получаем все записи типа post
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
); ?>
<?php $wp_query = new WP_Query($args); ?>
<?php if ($wp_query->have_posts()): ?>
<?php while($wp_query->have_posts()): $wp_query->the_post() ?>
<div class="row">
<div class="col-md-5">
<a href="<?php the_permalink() ?>" class="fancybox">
<?php the_post_thumbnail('medium'); ?>
</a>
</div>
<div class="col-md-7">
<!-- заголовок и краткое описание -->
<h5><?php the_title() ?></h5>
<?php the_excerpt() ?>
<!-- кнопки записи -->
<a href="<?php the_permalink() ?>" class="btn btn-primary">Читать полностью</a>
<?php if(get_field('comments_enable') !== false): ?>
<a href="<?php the_permalink() ?>#disqus_thread" class="btn btn-default"> Комментарии</a>
<?php endif; ?>
</div>
</div>
<hr style="margin: 10px 0; border-style: dotted; border-color: #333" class="row">
<?php endwhile; ?>
<!-- строка пагинации -->
<div class="row">
<div class="col-xs-6">
<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Предыдущая страница</span>'); ?>
</div>
<div class="col-xs-6 text-right">
<?php next_posts_link('<span class="text">Следующая страница</span> <i class="fa fa-arrow-right"></i>'); ?>
</div>
</div>
<?php else: ?>
<p class="text-muted">Новостей пока нет, зайдите позже.</p>
<?php endif; unset($wp_query); wp_reset_postdata(); ?>
Это все находится в части шаблона и вызывается с помощью метода get_template_part()
. Если я назначаю WP_Query переменной, отличной от $wp_query
, двойной вывод не происходит, но мне нужно, чтобы это был $wp_query
для работы ссылок пагинации. Я также обнуляю $wp_query
и сбрасываю данные записи в конце цикла. Озадачен и надеюсь на вашу помощь!

Используйте wp_reset_query()
для восстановления оригинального запроса. Эта функция также вызывает wp_reset_postdata
, поэтому вы можете просто заменить её.

Это вопрос личных предпочтений, но мне не очень нравится использовать $wp_query
и усложнять вещи. Есть два способа решить эту проблему: первый — использование временной переменной с $wp_query
, и второй — изменение имени вашей переменной и исправление пагинации, что я бы рекомендовал (опять же, это личное предпочтение).
МЕТОД 1
Как я уже сказал, вы можете присвоить временную переменную $wp_query
и затем её сбросить.
<?php
// Получаем все типы записей
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
);
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query( $args );
<--- ВАШ ЦИКЛ И Т.Д. --->
$wp_query = null;
$wp_query = $temp; // Сброс
МЕТОД 2
Это метод, который я предпочитаю. Дайте вашей переменной уникальное имя, например, $my_query
, и исправьте пагинацию в next_posts_link
. Вот как будет выглядеть ваш кастомный запрос. (Примечание Нет необходимости злоупотреблять тегами PHP. Если вы не переключаетесь между PHP и HTML, не нужно открывать и закрывать теги PHP для каждого элемента, как вы делали. Смотрите мой код ниже.)
<?php
// Получаем все типы записей
$args = array (
'post_type' => 'post',
'post_status' => 'publish',
'pagination' => true,
'paged' => (get_query_var('paged') ? get_query_var('paged') : 1),
'posts_per_page' => 20,
'order' => 'ASC',
'orderby' => 'date',
);
$my_query = new WP_Query($args);
if ($my_query->have_posts()):
while($my_query->have_posts()): $my_query->the_post() ?>
<--- ВАШ ЦИКЛ И Т.Д. --->
Хорошо, это нарушает пагинацию. Чтобы исправить это, нужно установить параметр $max_pages
в next_posts_link
, поэтому ваш next_posts_link
будет выглядеть примерно так:
<?php previous_posts_link('<i class="fa fa-arrow-left"></i> <span class="text">Предыдущая страница</span>', $my_query->max_num_pages); ?>
Это решит проблему с пагинацией.

Спасибо за четкий и лаконичный ответ. Я согласен, что использование $wp_query
не является идеальным вариантом, так как это усложняет ситуацию. Благодарю за помощь!
