Home WordpressWordPress cơ bản Lọc danh sách bài viết trong wordpress sử dụng action hook – pre_get_posts

Lọc danh sách bài viết trong wordpress sử dụng action hook – pre_get_posts

by admincp

WordPress cung cấp dữ liệu mặc định trong các template, ví dụ ở trang chủ sẽ liệt kê các posts mới nhất hay với trang category/taxonomy là những posts thuộc về category/term taxonomy đó…
Nhưng bạn cũng có thể điều chỉnh dữ liệu này trước khi được hiển thị ra các file template. WordPress có filter pre_get_posts giúp bạn lọc danh sách bài viết theo ý muốn.
lọc kết quả bài viết wordpress

Liệt kê các bài viết posts theo điều kiện, theo ngữ cảnh bạn sử dụng hooks pre_get_posts. Ví dụ: nếu muốn trang kết quả tìm kiếm có thể cho kết quả cả kiểu post lẫn page, chúng ta chèn đoạn code sau vào functions.php

function searchfilter($query) {

    if ($query->is_search && !is_admin() ) {
        $query->set('post_type',array('post','page'));
    }

return $query;
}

add_filter('pre_get_posts','searchfilter');

Tham số $query là đối tượng WP_Query. Trong đối tượng này chứa sẵn một số hàm template tag cho bạn kiểm tra điều kiện của dữ liệu hiện tại. Dựa vào đó bạn có thể lọc posts/page/post type theo ý muốn.

//nếu là trang chủ
echo $query->is_home()
//nếu là trang tìm kiếm (search template)
echo $query->is_search
//query chính để lấy bài viết (loop)
$query->is_main_query()

Có thể kết hợp thêm các template tag của wordpress như is_admin(),..
Một số ví dụ khác về ứng dụng của hook pre_get_posts.

Hiển thị các bài viết trong một category ở trang chủ

function my_home_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '123' );
    }
}
add_action( 'pre_get_posts', 'my_home_category' );

Cho phép hiển thị dữ liệu Custom Post Types trong kết quả tìm kiếm

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('post_type', array( 'post', 'movie' ) );
    }
  }
}

add_action('pre_get_posts','search_filter');

Thay đổi số lượng posts trên một phân trang

function hwl_home_pagesize( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the original blog archive
        $query->set( 'posts_per_page', 1 );
        return;
    }

    if ( is_post_type_archive( 'movie' ) ) {
        // Display 50 posts for a custom post type called 'movie'
        $query->set( 'posts_per_page', 50 );
        return;
    }
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Ngoài hook pre_get_posts bạn có thể sử dụng posts_where, xem thêm cách lọc dữ liệu posts tại đây.

Để nhận được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng có thể nhận được sự trợ giúp trên TwitterFacebook

Liên hệ

Công ty chuyên Thiết kế website uy tín nhất Miền Bắc: http://vinastar.net

Hotline tư vấn: 0989 48 3456

Nguồn: Sưu tầm trên internet

You may also like

Leave a Comment