---
description: https://www.hoangweb.com/wordpress/wordpress-posts-filter-hook-pre_get_posts
---

# \[PRE\_GET\_POSTS] Lọc danh sách bài viết trong wordpress sử dụng action hook – pre\_get\_posts (ok)

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](https://img.hoangweb.com/2014/07/filter_data1.png)](https://img.hoangweb.com/2014/07/filter_data1.png)

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

| 12345678910 | `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.

| 123456 | `//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ủ

| 123456 | `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

| 123456789 | `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

| 1234567891011121314151617 | `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](https://www.hoangweb.com/wordpress-site/how-to-get-posts-data-wordpress).
