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.
Để 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 Twitter và Facebook
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