Sử dụng WP_Query tùy chỉnh với vòng lặp get_template_part


9

Tôi có một truy vấn cho một loại bài tùy chỉnh:

<?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
));
?>

Và tôi muốn lặp qua các bài viết này bằng loop-Books.php:

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

Bên trong loop-Books.php tôi có những thứ này, giống như loop.php thông thường, tôi chỉ thay đổi hàm have_posts và hàm_post để hoạt động với truy vấn $ book:

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

Nhưng sau này, tôi gặp lỗi php:

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

Vì vậy, có vẻ như biến $ book không có sẵn bên trong hàm get_template_part. Làm thế nào tôi có thể giải quyết vấn đề này? Nếu tôi đặt truy vấn $ book bên trong loop-Books.php thì nó hoạt động tốt, nhưng tôi muốn tách chúng ra.


hãy thử xóa $books->từ loop-Books.php và tôi hy vọng nó sẽ hoạt động.
Rohit Pande

Nếu tôi xóa phần $ book-> thì nó sẽ sử dụng truy vấn mặc định để điều đó không tốt cho tôi.
passatgt

nếu bạn đang sử dụng một cái gì đó như: <?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 )); ?>và ở đây bạn tải get_template_parttruy vấn. Và sau này nếu bạn reset postdatathì tôi nghĩ giải pháp của tôi sẽ hoạt động đúng.
Rohit Pande

Câu trả lời:


5

Bạn sẽ cần phải toàn cầu hóa $books(nếu bạn muốn gắn bó get_template_part()) hoặc sử dụng

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

thay vì get_template_part( 'loop', 'books' );. Vấn đề này là do $bookstrong loop-books.phpđược xác định duy nhất trong phạm vi của get_template_part().


2
Điều này. Mặc dù, nếu $bookstruy vấn dành riêng cho loop-books.phptệp phần mẫu, tôi khuyên bạn chỉ nên thực hiện $books = new WP_Query()cuộc gọi bên trong tệp phần mẫu.
Chip Bennett

Cảm ơn. Ý kiến ​​của bạn là gì, giải pháp nào tốt hơn?
passatgt

Tương tự, cùng @Chip - Tôi cũng sẽ đặt nó trong cùng một tệp và tránh sự cố ở vị trí đầu tiên. Đã trả lời điều này trong tâm trí rằng OP muốn tách hai người.
Julian Pille

1
@passatgt Theo như những gì tốt hơn, hãy xem các ý kiến ​​trên, tôi muốn đi với một tệp và được thực hiện với nó. Nếu bạn phải tách chúng ra, tôi sẽ đi với locate_template()tùy chọn, để không làm lộn xộn không gian tên toàn cầu.
Julian Pille

Được rồi cảm ơn. Lý do tôi muốn tách biệt chúng là vì tôi muốn sử dụng cùng một vòng lặp với các truy vấn khác dựa trên các danh mục / phân loại khác
passatgt

8

Một phương pháp thay thế: mở / đóng vòng lặp, và sau đó sử dụng loop-books.phpđể chỉ đánh dấu cho nội dung vòng lặp. ví dụ:

<?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;
?>

Sau đó, bên trong loop-books.php:

<?php the_title(); ?><br/>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.