Проблема с неправильной работой custom WP_Query

10 июл. 2014 г., 20:40:26
Просмотры: 15.3K
Голосов: 0

Хорошо,

Я создал кастомный 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 и сбрасываю данные записи в конце цикла. Озадачен и надеюсь на вашу помощь!

2
Комментарии

Что произойдет, если поместить wp_reset_postdata(); перед else: и удалить unset($wp_query);

Brad Dalton Brad Dalton
10 июл. 2014 г. 20:54:06

@BradDalton спасибо за предложение, но результат тот же. Кроме того, в этом случае postdata не будет сброшен, если постов нет - хотя я не уверен, является ли это функциональной проблемой или нет.

Chris Chris
10 июл. 2014 г. 21:33:16
Все ответы на вопрос 2
1

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

10 июл. 2014 г. 22:25:04
Комментарии

Это сработало для меня. Изучив файл wp-includes/query.php, я увидел, что он по сути использует метод @pieter-goosen, восстанавливая оригинальный запрос. Спасибо за помощь!

Chris Chris
11 июл. 2014 г. 11:25:15
2

Это вопрос личных предпочтений, но мне не очень нравится использовать $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); ?>

Это решит проблему с пагинацией.

10 июл. 2014 г. 23:18:10
Комментарии

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

Chris Chris
11 июл. 2014 г. 11:27:48

Всегда пожалуйста, рад, что между моими ответами и ответами @Milo вам удалось решить свою проблему. Удачи :-)

Pieter Goosen Pieter Goosen
11 июл. 2014 г. 11:35:19