Làm thế nào để reset_postdata khôi phục bài đăng của vòng lặp truy vấn chính?


7

Làm thế nào để reset_postdatalàm việc? Các tài liệu nói:

khôi phục biến $ post toàn cầu của vòng lặp truy vấn chính sau vòng lặp truy vấn phụ bằng WP_Query mới

Nhưng trong lớp, nó lấy bài "hiện tại" của WP_Querythể hiện hiện tại và đặt nó là toàn cục $post. Vậy làm thế nào để khôi phục bài đăng của vòng lặp truy vấn chính?

Cả WP_Querylớp .


1
vẻ như global $wp_querykhông thay đổi nhưng global $postđối tượng bị ghi đè và wp_reset_postdata()sử dụng global $wp_queryđể đặt lại $postđối tượng ban đầu . Hy vọng rằng ai đó có nhiều kiến ​​thức về cốt lõi có thể đến và gửi câu trả lời hợp pháp mặc dù.
Howdy_McGee

2
@Howdy_McGee toàn cầu $wp_querykhông bao giờ thay đổi, ngoại trừ nếu bạn sử dụng query_postshoặc nếu bạn sử dụng $wp_querynhư một biến cục bộ. Đối với phần còn lại của bình luận của bạn, bạn gần như phát hiện ra
Pieter Goosen

Câu trả lời:


7

WP_Query::reset_postdata()đặt biến bài toàn cầu ( $GLOBALS['post'] === $post) cho bài hiện tại trong vòng lặp của WP_Querythể hiện hiện tại .

public function reset_postdata() {
    if ( ! empty( $this->post ) ) {
        $GLOBALS['post'] = $this->post;
        $this->setup_postdata( $this->post );
    }
}

Điều đó có nghĩa là, nếu bạn chạy một truy vấn tùy chỉnh trên một trang, $postsẽ giữ bài đăng cuối cùng trong vòng lặp của truy vấn tùy chỉnh đó. Rằng bạn có thể tự kiểm tra bằng cách thêm

?><pre><?php var_dump($post); ?></pre><?php 

trực tiếp sau vòng lặp truy vấn tùy chỉnh của bạn.

Điều tương tự cũng đúng với truy vấn chính sau vòng lặp, $postsẽ giữ bài cuối cùng của truy vấn chính và bài đăng đầu tiên trong vòng lặp trước vòng lặp.

Dưới đây là một bài kiểm tra đơn giản để kiểm tra $posttoàn cầu. Bạn có thể thêm phần này vào tệp chức năng của mình và tải bất kỳ trang nào trên trang web của bạn

add_action( 'wp_head', function()
{
    global $post;
    ?><pre><?php var_dump($post->ID); ?></pre><?php
}):
add_action( 'wp_footer', function()
{
    global $post;

    ?><pre><?php var_dump($post->ID); ?></pre><?php 

    $q = new WP_Query( 'posts_per_page=3' );
    while ( $q->have_posts() ) {
        $q->the_post();

        ?><pre><?php var_dump($post->ID); ?></pre><?php 
        the_title();

    }   

    ?><pre><?php var_dump($post->ID); ?></pre><?php 
    wp_reset_postdata();
    ?><pre><?php var_dump($post->ID); ?></pre><?php 
});

Vậy làm thế nào để khôi phục bài đăng của vòng lặp truy vấn chính?

Điều đó được thực hiện bằng cách gọi wp_reset_postdata()cái nào đặt lại toàn cục $postđến bài viết hiện tại trong vòng lặp của truy vấn chính. Đây thường là bài đầu tiên của bài cuối cùng tùy thuộc vào việc bạn thêm truy vấn tùy chỉnh trước hoặc sau vòng lặp truy vấn chính.

Hãy xem làm thế nào wp_reset_postdata()

function wp_reset_postdata() {
    global $wp_query;

    if ( isset( $wp_query ) ) {
        $wp_query->reset_postdata();
    }
}

Như bạn có thể thấy, wp_reset_postdata()chỉ là một trình bao bọc cho WP_Query::reset_postdata(). Phần quan trọng ở đây là nó là một trình bao bọc cho phương thức đối tượng của truy vấn chính , $wp_query->reset_postdata();.

Hãy nhớ rằng, truy vấn chính cũng sử dụng WP_Query. Đây là cách đối tượng truy vấn chính được đặt

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

Vì vậy, những gì wp_reset_postdata()cần làm là, nó lấy bài đăng hiện tại trong đối tượng truy vấn chính và đặt đó là $posttoàn cục và đó là cách WP_Query::reset_postdata()đặt $postthành bài đăng hiện tại của truy vấn chính


Cảm ơn, ok, tôi nghĩ wp_query đã được sử dụng lại bởi truy vấn thứ hai của chúng tôi, nhưng wp_query không thay đổi. Tôi hiểu rồi, cảm ơn.
Paul
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.