[PRE_GET_POSTS] Lọc danh sách bài viết trong wordpress sử dụng action hook – pre_get_posts (ok)
https://www.hoangweb.com/wordpress/wordpress-posts-filter-hook-pre_get_posts
Last updated
https://www.hoangweb.com/wordpress/wordpress-posts-filter-hook-pre_get_posts
Last updated
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.
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.
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'
);
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');
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.