Использование пользовательского WP_Query с get_template_part в цикле

27 нояб. 2012 г., 14:37:42
Просмотры: 13.7K
Голосов: 11

У меня есть запрос для пользовательского типа записи:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
?>

И я хочу пройтись по этим записям, используя файл loop-books.php:

<?php get_template_part( 'loop', 'books' ); ?>

Внутри loop-books.php у меня стандартный цикл, но с изменениями для работы с запросом $books:

<?php if ( $books->have_posts() ) : ?>      
    <?php while ($books->have_posts()) : $books->the_post(); ?>
        <?php the_title(); ?><br/>
    <?php endwhile; ?>
<?php endif; ?>

Но после этого я получаю PHP ошибку:

Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1

Похоже, переменная $books недоступна внутри функции get_template_part. Как решить эту проблему? Если я помещу запрос $books внутри loop-books.php, всё работает нормально, но я хочу разделить их.

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

Попробуйте удалить $books-> из файла loop-books.php, и я надеюсь, что это сработает.

Rohit Pande Rohit Pande
27 нояб. 2012 г. 14:42:44

Если я удалю часть с $books->, то будет использоваться стандартный запрос, что для меня не подходит.

passatgt passatgt
27 нояб. 2012 г. 14:45:02

если вы используете что-то вроде:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $books = new WP_Query(array( 'post_type' => 'wiki', 'posts_per_page' => '50', 'paged' => $paged )); ?> и здесь вы загружаете get_template_part запрос. И после этого если вы reset postdata, то я думаю, что мое решение будет работать правильно.

Rohit Pande Rohit Pande
27 нояб. 2012 г. 14:48:19
Все ответы на вопрос 2
0

Альтернативный метод: открыть/закрыть цикл, а затем использовать loop-books.php для хранения только разметки содержимого цикла. Например:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Получаем запрос книг
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
// Открываем цикл книг
if ( $books->have_posts() ) :     
    while ($books->have_posts()) : $books->the_post();
        // Получаем разметку цикла
        get_template_part( 'loop', 'books' );
// Закрываем цикл книг
    endwhile;
endif;
?>

Затем, внутри файла loop-books.php:

<?php the_title(); ?><br/>
27 нояб. 2012 г. 15:17:22
6

Вам нужно либо глобализировать переменную $books (если хотите продолжать использовать get_template_part()), либо использовать

require( locate_template( 'loop-books.php' ) );

вместо get_template_part( 'loop', 'books' );. Эта проблема возникает из-за того, что переменная $books в файле loop-books.php определена только в области видимости функции get_template_part().

27 нояб. 2012 г. 14:55:32
Комментарии

Это. Хотя, если запрос $books специфичен для файла шаблона loop-books.php, я бы рекомендовал просто поместить вызов $books = new WP_Query() внутрь файла шаблона.

Chip Bennett Chip Bennett
27 нояб. 2012 г. 14:56:51

Спасибо. Какое решение, по вашему мнению, будет лучше?

passatgt passatgt
27 нояб. 2012 г. 14:57:01

То же самое, @Chip - я бы также поместил его в тот же файл и избежал проблемы с самого начала. Ответил с учетом того, что автор хотел разделить эти две вещи.

Johannes Pille Johannes Pille
27 нояб. 2012 г. 15:00:00

@passatgt Что касается того, какой вариант лучше, смотри комментарии выше — я бы предпочел использовать один файл и завершить этим. Если вам обязательно нужно разделить их, я бы выбрал вариант с locate_template(), чтобы не засорять глобальное пространство имен.

Johannes Pille Johannes Pille
27 нояб. 2012 г. 15:01:19

Хорошо, спасибо. Причина, по которой я хочу разделить их, в том, что я хочу использовать тот же цикл с другими запросами на основе других категорий/таксономий.

passatgt passatgt
27 нояб. 2012 г. 15:06:25

Почему бы не передать другие таксономии в виде переменных в массив аргументов вашего запроса? (То, как это сделать, зависит от конкретного контекста/реализации, но это определенно будет чище, чем помещать весь запрос в глобальную переменную.)

Chip Bennett Chip Bennett
27 нояб. 2012 г. 15:14:08
Показать остальные 1 комментариев