Использование пользовательского WP_Query с get_template_part в цикле
У меня есть запрос для пользовательского типа записи:
<?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, всё работает нормально, но я хочу разделить их.

Альтернативный метод: открыть/закрыть цикл, а затем использовать 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/>

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

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

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

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

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