Khi nào nên sử dụng WP_query (), query_posts () và pre_get_posts phần 1 (ok)

https://qastack.vn/wordpress/50761/when-to-use-wp-query-query-posts-and-pre-get-posts

pre_get_postslà 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':

add_action('pre_get_posts','wpse50761_alter_query');
function wpse50761_alter_query($query){

      if( $query->is_main_query() ){
        //Do something to main query
      }
}

get_posts ()

Đây thực chất là một trình bao bọc cho một thể hiện riêng biệt của một WP_Queryđối tượng. Điều này trả về một mảng các đối tượng bài. Các phương thức được sử dụng trong vòng lặp ở trên không còn có sẵn cho bạn. Đây không phải là một 'Vòng lặp', chỉ đơn giản là một mảng của đối tượng bài.

<ul>
<?php
global $post;
$args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) :  setup_postdata($post); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>

Có các kịch bản hợp pháp để sử dụng query_posts($query), ví dụ:

  1. Bạn muốn hiển thị danh sách các bài đăng hoặc bài đăng loại tùy chỉnh trên một trang (sử dụng mẫu trang)

  2. Bạn muốn phân trang của những bài viết đó hoạt động

Bây giờ tại sao bạn muốn hiển thị nó trên một trang thay vì sử dụng một mẫu lưu trữ?

  1. Nó trực quan hơn cho quản trị viên (khách hàng của bạn?) - họ có thể thấy trang trong 'Trang'

  2. Tốt hơn là thêm nó vào menu (không có trang, họ sẽ phải thêm url trực tiếp)

  3. Nếu bạn muốn hiển thị nội dung bổ sung (văn bản, hình thu nhỏ đăng hoặc bất kỳ nội dung meta tùy chỉnh nào) trên mẫu, bạn có thể dễ dàng lấy nội dung đó từ trang (và tất cả cũng có ý nghĩa hơn đối với khách hàng). Xem nếu bạn đã sử dụng một mẫu lưu trữ, bạn sẽ cần mã hóa nội dung bổ sung hoặc sử dụng ví dụ tùy chọn chủ đề / plugin (điều này làm cho nó ít trực quan hơn cho khách hàng)

Đây là một mã ví dụ đơn giản hóa (sẽ có trên mẫu trang của bạn - ví dụ: page-page-of-post.php):

/**
 * Template Name: Page of Posts
 */

while(have_posts()) { // original main loop - page content
  the_post();
  the_title(); // title of the page
  the_content(); // content of the page
  // etc...
}

// now we display list of our custom-post-type posts

// first obtain pagination parametres
$paged = 1;
if(get_query_var('paged')) {
  $paged = get_query_var('paged');
} elseif(get_query_var('page')) {
  $paged = get_query_var('page');
}

// query posts and replace the main query (page) with this one (so the pagination works)
query_posts(array('post_type' => 'my_post_type', 'post_status' => 'publish', 'paged' => $paged));

// pagination
next_posts_link();
previous_posts_link();

// loop
while(have_posts()) {
  the_post();
  the_title(); // your custom-post-type post's title
  the_content(); // // your custom-post-type post's content
}

wp_reset_query(); // sets the main query (global $wp_query) to the original page query (it obtains it from global $wp_the_query variable) and resets the post data

// So, now we can display the page-related content again (if we wish so)
while(have_posts()) { // original main loop - page content
  the_post();
  the_title(); // title of the page
  the_content(); // content of the page
  // etc...
}

Bây giờ, để hoàn toàn rõ ràng, chúng ta cũng có thể tránh sử dụng query_posts()ở đây và sử dụng WP_Querythay vào đó - như vậy:

// ...

global $wp_query;
$wp_query = new WP_Query(array('your query vars here')); // sets the new custom query as a main query

// your custom-post-type loop here

wp_reset_query();

// ...

Last updated