Sử dụng pre_get_posts với WP_Query


24

Tôi đã đọc Stephen Harris câu trả lời tuyệt vời 's đến câu hỏi này liên quan đến việc sử dụng WP_query(), query_posts()pre_get_posts.

Ông nói "pre_get_posts là một bộ lọc, để thay đổi bất kỳ truy vấn nào . Nó thường được sử dụng để chỉ thay đổi 'truy vấn chính'."

Có thể sử dụng pre_get_postsđể chỉ lọc một truy vấn thứ cấp cụ thể được tạo bằng WP_Query? ví dụ.

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

Bất kỳ trợ giúp nhiều đánh giá cao.

Câu trả lời:


23

Cách đơn giản nhất là thêm hành động ngay trước truy vấn và xóa nó ngay sau đó.

add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');

if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

CHỈNH SỬA

Một kỹ thuật khác bạn có thể sử dụng là đặt var truy vấn của riêng bạn và kiểm tra xem trong hook:

// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // do special stuff

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

và trong mẫu:

// set the query var (along with whatever others) to trigger the filter
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );

Cảm ơn bạn rất nhiều Milo. Điều này thực sự rất hữu ích. Tôi luôn tự hỏi nếu có thể đặt var truy vấn của riêng bạn.
Ben Pearson

Làm thế nào tôi có thể sử dụng thủ thuật này cho trang lưu trữ? Tôi không muốn viết lại toàn bộ truy vấn một lần nữa cho trang lưu trữ nhưng muốn sử dụng kỹ thuật này.
Rohit Pande

4

pre_get_posts cháy cho mỗi truy vấn bài:

  • get_posts ()
  • WP_Query mới ()
  • Đó là bài viết ngẫu nhiên gần đây tiện ích khách hàng của bạn cài đặt mà bạn không biết.
  • Mọi điều

- @nacin

Với điều đó được nói trừ khi bạn loại trừ bộ lọc của mình, hãy sử dụng điều kiện: is_main_query() sau đó bộ lọc của bạn sẽ kích hoạt WP_Query mới của bạn.

Nếu bạn chỉ muốn nhắm mục tiêu WP_Query mới cụ thể của mình thì không có cách nào để làm điều đó.


Kỹ thuật của Milo thì sao? Tôi chưa bao giờ nhìn thấy nó trước đây ...
brasofilo

Kỹ thuật của anh ấy sẽ làm việc. Ive chưa bao giờ sử dụng nó cho pre_get_posts nhưng có cho các bộ lọc khác như post_where
Chris_O

1
Thật tuyệt, một cái gì đó mới học được ngày hôm nay!
brasofilo
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.