Використання користувацької WP_Query з циклом get_template_part


9

У мене є запит на користувацький тип публікації:

<?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 у мене є такі, як і у звичайних loop.php, я просто змінив функцію have_posts та the_post, щоб працювати з запитом $ 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

Так виглядає, що змінна $ книги не доступна у функції get_template_part. Як я можу вирішити цю проблему? Якщо я поміщаю запит на $ книги всередині loop-books.php, він працює добре, але я хочу їх розділити.


спробуйте вийняти $books->з loop-books.php & Сподіваюся, це спрацює.
Рохіт Панде

Якщо я видаляю частину $ books->, вона використовуватиме запит за замовчуванням, так що це не добре для мене.
passatgt

якщо ви використовуєте щось на кшталт: <?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тоді, я думаю, моє рішення спрацює належним чином.
Рохіт Панде

Відповіді:


5

Вам або потрібно буде глобалізуватися $books(якщо ви хочете дотримуватися get_template_part()) або використовувати

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

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


2
Це. Хоча, якщо $booksзапит є специфічним для loop-books.phpфайлу частини шаблону, я рекомендую просто поставити $books = new WP_Query()виклик всередині файлу частини шаблону.
Чіп Беннетт

Дякую. Яка ваша думка, яке з них краще рішення?
passatgt

Те саме, той самий @Chip - я також ставлю його до одного файлу і уникаю проблеми в першу чергу. Відповів на це, маючи на увазі, що ОП хотіла розділити їх.
Йоганнес Піл

1
@passatgt Наскільки це краще, дивіться вищевказані коментарі, я б краще пішов з одним файлом і закінчувався з ним. Якщо ви повинні відокремити їх, я б пішов із locate_template()можливістю не захаращувати глобальний простір імен.
Йоганнес Піл

Добре, дякую. Причина, яку я хочу відокремити, полягає в тому, що я хочу використовувати той самий цикл і для інших запитів на основі інших категорій / систематики
passatgt

8

Альтернативний метод: відкрити / закрити цикл, а потім використовувати, loop-books.phpщоб містити лише розмітку для вмісту циклу. наприклад:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Get books query
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
// Open books loop
if ( $books->have_posts() ) :     
    while ($books->have_posts()) : $books->the_post();
        // Get loop markup
        get_template_part( 'loop', 'books' );
// Close books loop
    endwhile;
endif;
?>

Потім всередині loop-books.php:

<?php the_title(); ?><br/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.