- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
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
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.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype