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_Query
thể 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, $post
sẽ 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, $post
sẽ 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 $post
toà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()
nó
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à $post
toàn cục và đó là cách WP_Query::reset_postdata()
đặt $post
thành bài đăng hiện tại của truy vấn chính
global $wp_query
không thay đổi nhưngglobal $post
đối tượng bị ghi đè vàwp_reset_postdata()
sử dụngglobal $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ù.