Hàm get_posts() là hàm dùng để lấy danh sách bài viết trong WordPress. Các bạn có thể sử dụng hàm get_posts ở bất kỳ đâu để lấy danh sách bài viết. Hàm này cần có một mảng (array) định nghĩa các yêu cầu trong wp_query cần lấy dữ liệu. Nó cho phép ta truy xuất một mảng các bài đăng mới nhất hoặc các bài đăng phù hợp với các tiêu chí mình định ra. Lưu ý là hàm get_posts nó có chức năng tương tự như wp_query(). Hai hàm này đều sử dụng để lấy thông tin bài viết và có thể được sử dụng trong plugins, hoặc trong theme để get post content by id
Table of Contents
- 1 Hàm get_posts() nằm ở đâu?
- 2 Các tham số trong get_posts()
- 3 Cách tạo truy vấn với WordPress get_posts
- 4 Giá trị trả về của hàm get_posts()
- 5 get_posts() by Author – Lấy những bài viết của 1 tác giả nào đó
- 6 Hiển thị bài viết theo Category
- 7 Custom Post Types and Custom Taxonomies
- 8 Meta Queries Using Custom Field Parameters
Hàm get_posts() nằm ở đâu?
Hàm này nằm ở trong core nguồn của WordPress. Các bạn có thể tìm thấy hàm này tại file: wp-includes/post.php. Đây là hàm nguyên bản của WordPress:
function get_posts( $args = null ) { $defaults = array( 'numberposts' => 5, 'category' => 0, 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'suppress_filters' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); if ( empty( $parsed_args['post_status'] ) ) { $parsed_args['post_status'] = ( 'attachment' === $parsed_args['post_type'] ) ? 'inherit' : 'publish'; } if ( ! empty( $parsed_args['numberposts'] ) && empty( $parsed_args['posts_per_page'] ) ) { $parsed_args['posts_per_page'] = $parsed_args['numberposts']; } if ( ! empty( $parsed_args['category'] ) ) { $parsed_args['cat'] = $parsed_args['category']; } if ( ! empty( $parsed_args['include'] ) ) { $incposts = wp_parse_id_list( $parsed_args['include'] ); $parsed_args['posts_per_page'] = count( $incposts ); // Only the number of posts included. $parsed_args['post__in'] = $incposts; } elseif ( ! empty( $parsed_args['exclude'] ) ) { $parsed_args['post__not_in'] = wp_parse_id_list( $parsed_args['exclude'] ); } $parsed_args['ignore_sticky_posts'] = true; $parsed_args['no_found_rows'] = true; $get_posts = new WP_Query; return $get_posts->query( $parsed_args ); }
WordPress get_posts là một hàm cực kỳ mạnh mẽ cho phép các lập trình viên lấy danh sách các bài đăng ở bất kỳ đâu trên giao diện người dùng của trang web WordPress của bạn. Nó sử dụng WP_Query nhưng dễ sử dụng hơn và thích hợp hơn WP_Query khi bạn chỉ cần danh sách các bài đăng. Dù sao, sử dụng trực tiếp hàm WP_Query được khuyến khích khi bạn cần hiển thị các bài đăng trong vòng lặp.
Các tham số trong get_posts()
post__not_in: Không lấy các bài viết có id trong mảng này. post__not_in có thể là 1 id cụ thể hoặc 1 mảng (array) nhiều id khác nhau.
post__in: Tương tự post__not_in, post__in thì lại bắt buộc lấy các bài viết có id được định sẵn trong post__in đó. post__in cũng có thể là 1 id cụ thể hoặc 1 array nhiều id khác nhau.
post type: giá trị của post_type định nghĩa khu vực cần lấy bài viết. Mặc định wordpress có 2 post_type là post và page. Nếu bạn định nghĩa thêm các post_type khác thì bạn phải định nghĩa khu vực lấy để wordpress đỡ “bối rối”. Nếu không định nghĩa, wordpress mặc định sẽ hiểu là lấy tất cả các post_type hiện có.
posts_per_page: Giá trị này xác định số kết quả sẽ hiển thị trên 1 trang nếu có nhiều kết quả. Mặc định nó sẽ lấy giá trị được định sẵn trong phần settings/reading ở trong trang quản trị của wordpress.
category: Có thể hiểu nó xác định khu vực category cần lấy. Một wp query bình thường sẽ select giá trị trong bảng nào đó, where là các điều kiện. Trong trường hợp này, where category bằng một id cụ thể hoặc 1 array các id khác nhau.
Cách tạo truy vấn với WordPress get_posts
$hh_args = array( 'numberposts' => 5, 'category' => 0, 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'suppress_filters' => true, ); $huyhoa_posts = get_posts($hh_args); $houtput = ''; if( ! empty( $huyhoa_posts ) ){ $houtput .= '<ul>'; foreach ( $huyhoa_posts as $th ){ $houtput .= '<li><a href="' . get_permalink( $th->ID ) . '">' . $th->post_title . '</a></li>'; } $houtput .= '</ul>'; } echo $houtput;
Trong đó:
numberposts: Giá trị truyền vào nhằm xác định số bài viết cần lấy. Nếu numberposts không có thì nó sẽ lấy giá trị mặc định là 5.
category: Thư mục mặc của bài viết cần lấy. Giá trị là số, và có thể là 1 hoặc nhiều giá trị khác nhau (array)
orderby: Sắp xếp kết quả theo tiêu chí nào
order: Thứ tự sắp xếp. A đến Z hoặc Z về A
include: Bắt buộc lấy những giá trị đó.
Exclude: Bắt buộc loại bỏ các giá trị đó.
meta_key: meta cần lấy dữ liệu cùng với bài viết
post_type: Loại bài viết. Có thể là post (mặc định) hoặc page, hoặc custom post_type mà các bạn thêm vào trước đó.
Giá trị trả về của hàm get_posts()
Hàm get_posts() trả về một mảng đối tượng WP_Post (Array of WP_Post object). Hàm get_posts() sẽ trả về 24 thông số như danh sách bên dưới đây:
- [ID] =>
- [post_author]=>
- [post_date]=>
- [post_date_gmt]=>
- [post_content]=>
- [post_title]=>
- [post_excerpt]=>
- [post_status]=>
- [comment_status]=>
- [ping_status]=>
- [post_password]=>
- [post_name]=>
- [to_ping]=>
- [pinged]=>
- [post_modified]=>
- [post_modified_gmt]=>
- [post_content_filtered]=>
- [post_parent]=>
- [guid]=>
- [menu_order]=>
- [post_type]=>
- [post_mime_type]=>
- [comment_count]=>
- [filter]=>
Để phân tích dữ liệu và hiển thị ra màn hình
Nếu bạn muốn lấy danh sách bài viết của một tác giả nào đó (get posts by post author(s)) thì có thể dùng cách nhanh nhất như bên dưới đây:
function get_postcontent_by_id($post_id) { $content_post = get_post($post_id); $content = $content_post->post_content; $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]>', $content); return $content; }
Các tham số của authors:
author (int) – ID của tác giả cần lấy author_name (string) – tên của tác giả cần lấy author__in (array) – một mảng bao gồm ID của nhiều tác giả author__not_in (array) – một mảng bao gồm ID của những tác giả không lấy dữ liệu
Ví dụ: Trả về danh sách các bài viết của tác giả có ID là 1.
$hh_posts = get_posts( array( 'author' => 1 ) );
Dưới đây là hàm lấy danh sách bài viết của các tác giả có ID là 1,15,18.
// trả về danh sách các bài viết của cá tác giả có ID 1, 15, 18 $hh_posts = get_posts( array( 'author' => '1,15,18' ) );
Hoặc dùng cách khác là author__in cũng cho kết quả lấy danh sách các bài viết của các tác giả có ID là 1,15,18
// return an array of posts from multiple authors $hh_posts = get_posts( array( 'author__in' => array( 1, 15, 18 ) ) );
Tương tự, nếu muốn lấy danh sách các bài viết của tất cả các tác giả, nhưng KHÔNG lấy bài của tác giả có ID 1,1,5,18 thì dùng author__not__in
// return an array of posts from multiple authors not in 1,15,18 $hh_posts = get_posts( array( 'author__not_in' => array( 1, 15, 18 ) ) );
Hiển thị bài viết theo Category
Tương tự như lấy bài viết theo author, muốn hiển thị bài viết theo Category thì ta có thể sử dụng một trong các thông số sau (có thể kết hợp lại với nhau):
- cat (int)
- category_name (string)
- category__and (array)
- category__in (array)
- category__not_in (array)
Hiển thị bài viết theo category trên trang chủ:
Lấy các bài viết có category ID là 1:
$hh_posts = get_posts( array( 'category' => 1 ) ); $houtput = ''; if( ! empty( $hh_posts ) ){ $houtput .= '<ul>'; foreach ( $hh_posts as $ht ) { $houtput .= '<li><a href="' . get_permalink( $ht->ID ) . '">'. $ht->post_title . '</a></li>'; } $houtput .= '<ul>'; } echo $houtput;
Lấy các bài viết có category ID là 1,15,18
$hh_posts = get_posts( array( 'category__in' => array( 1, 15, 18 ) ) ); $houtput = ''; if( ! empty( $hh_posts ) ){ $houtput .= '<ul>'; foreach ( $hh_posts as $ht ) { $houtput .= '<li><a href="' . get_permalink( $ht->ID ) . '">'. $ht->post_title . '</a></li>'; } $houtput .= '<ul>'; } echo $houtput;
Các bạn làm tương tự nếu muốn loại bỏ category khỏi danh sách cần lấy thì thay category__in thành category__not_in.
Dưới đây là ví dụ về hàm lấy dữ liệu những bài viết cùng chủ đề (get related post by category) trong wordpress:
<?php // Default arguments $hh_args = array( 'posts_per_page' => 10, // Lấy 10 bài viết 'post__not_in' => array( get_the_ID() ), // Không lấy bài hiện tại đang đọc 'no_found_rows' => true, // Vì lấy có 10 bài nên không cần phân chia trang, cho cái này vào cho nó tăng tốc query ); // Lấy giá trị ID của category của bài đang đọc. $cats = wp_get_post_terms( get_the_ID(), 'category' ); $cats_ids = array(); foreach( $cats as $huyhoa_related_cat ) { $cats_ids[] = $huyhoa_related_cat->term_id; } if ( ! empty( $cats_ids ) ) { $hh_args['category__in'] = $cats_ids; } // Lấy dữ liệu $huyhoa_query = new wp_query( $hh_args ); // Vì nó trả về một mảng nên tạo vòng lặp để hiển thị dữ liệu cho từng bài foreach( $huyhoa_query->posts as $hh_post ) : setup_postdata( $hh_post ); ?> <a href="<?php the_permalink(); ?>" title="<?php echo esc_attr( the_title_attribute( 'echo=0' ) ); ?>"> <?php the_title(); ?></a> <?php // Kết thúc vòng lặp endforeach; // Kết thúc query wp_reset_postdata(); ?>
Custom Post Types and Custom Taxonomies
Mặc định thì WordPress sẽ lấy bài viết từ post_type là post, các bạn có thể định nghĩa việc lấy theo Custom Post Types bằng thông số: ‘post_type’.
Ví dụ dưới đây là hàm mà Huy Hòa dùng để lấy các tours cùng thể loại adventures trong 1 website du lịch làm bằng wordpress. Custom Post Types ở đây là tours
$hh_args = array( 'post_type' => 'tours', 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug', 'terms' => 'adventures' ) ), );
Hoặc nếu muốn chuyên sâu hơn, Huy Hòa có thể lấy các tours cùng thể loại adventures có đi qua location cùng với tour đang xem như sau:
$hh_args = array( 'numberposts' => 10, 'post_type' => 'tours', 'relation' => 'AND', 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug', 'terms' => 'adventures' ), array( 'taxonomy' => 'tour_location', 'field' => 'term_id', 'terms' => $cur_location // $cur_location là id của location của tour hiện tại ) ) );
Meta Queries Using Custom Field Parameters
Hàm get_posts() cũng có thể sử dụng để query theo get_post_meta: custom field key và / hoặc value.
Ví dụ:
// Lấy các tour có số ngày là 10 days $hh_args = array( 'meta_key' => 'tour_day', 'meta_value' => '10', 'meta_compare' => '=' );
Thông số meta_compare dùng để đánh giá tham số và giá trị. = có nghĩa là chính xác giá trị đó. Ngoài ra, còn một số giá trị có thể sử dụng cho meta_compare là:
'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' or 'RLIKE'.
Một ví dụ khi kết hợp custom post_type và Queries get post meta như sau:
$hh_args = array( 'post_type' => 'tours', 'meta_key' => 'base_price', 'meta_value_num' => 200, 'meta_compare' => '>', 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug' 'terms' => 'adventures' ) ) );
Ví dụ trên sẽ lấy những tour thuộc thể loại adventures, có giá base (là giá mình để mặc định khi không có promotion) lớn hơn $200. Post meta sử dụng ở đây là base_price.
Một ví dụ khác về lấy những tour có số ngày lớn hơn 7 VÀ giá trong khoảng từ $200 đến $1,500
$hh_args = array( 'post_type' => 'tours', 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug' 'terms' => array( 'adventures' ) ) ), 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'tour_day', 'value' => 7, 'type' => 'numeric', 'compare' => '>', ), array( 'key' => 'price', 'value' => array( 200, 1500 ), 'type' => 'numeric', 'compare' => 'BETWEEN', ) ) );
Nâng cao hơn chút nữa thì các bạn có thể sắp xếp kết quả trả về theo giá trị price từ thấp đến cao. Sau đó nếu price như nhau thì ưu tiên sắp xếp giá trị số ngày tour cao đến thấp.
$args = array( 'post_type' => 'tours', 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug' 'terms' => array( 'adventures' ) ) ), 'meta_query' => array( 'relation' => 'AND', 'daytour_clause' => array( 'key' => 'tour_day', 'value' => 7, 'type' => 'numeric', 'compare' => '>', ), 'price_clause' => array( 'key' => 'price', 'value' => array( 200, 1500 ), 'type' => 'numeric', 'compare' => 'BETWEEN', ) ), 'orderby' => array( 'price_clause' => 'ASC', 'daytour_clause' => 'DESC' ), );
Ví dụ dưới đây mình sẽ kết hợp với shortcode để tạo ra một functions hiển thị tour. Các bạn tự xem và đoán ý nghĩa và kết quả của các hàm nhé:
<?php /** * Add a hook for a shortcode tag */ function huyhoa_shortcodes_init(){ add_shortcode( 'huyhoa_get_posts', 'huyhoa_get_posts_func' ); } add_action('init', 'huyhoa_shortcodes_init'); /** * Register a shortcode * * @param array $atts Array of shortcode attributes */ function huyhoa_get_posts_func( $atts ){ // safely extract custom arguments and set default values extract( shortcode_atts( array( 'numberposts' => 7, 'post_type' => 'tours', 'tour_category' => 'adventures', 'price_tour' => 200, 'day_min' => 2, 'day_max' => 20 ), $atts, 'huyhoa_get_posts' ) ); // define the array of query arguments $hh_args = array( 'numberposts' => $numberposts, 'post_type' => $post_type, 'tax_query' => array( array( 'taxonomy' => 'tour_category', 'field' => 'slug', 'terms' => $tour_category, ) ), 'meta_query' => array( 'relation' => 'AND', 'tour_clause' => array( 'key' => 'price_tour', 'value' => $price_tour, 'type' => 'numeric', 'compare' => '>', ), 'day_clause' => array( 'key' => 'tour_day', 'value' => array( $day_min, $day_max ), 'type' => 'numeric', 'compare' => 'BETWEEN', ) ), 'orderby' => array( 'tour_clause' => 'ASC' ) ); $custom_tours = get_posts( $hh_args ); if( ! empty( $custom_tours ) ){ $output = '<ul>'; foreach ( $custom_tours as $ht ){ $output .= '<li><a href="' . get_permalink( $ht->ID ) . '">' . $ht->post_title . '</a> Price: (' . get_post_meta( $ht->ID, 'price_tour', true ) . ') - No of Day: ' . get_post_meta( $ht->ID, 'tour_day', true ) . '</li>'; } $output .= '</ul>'; } return $output ?? '<strong>Xin lỗi, không có tour nào thỏa mãn yêu cầu có số ngày từ '.$day_min.' đến '.$day_max.' và giá lớn hơn '.$price_tour.'</strong>';
Sử dụng:
[huyhoa_get_posts post_type="tours" tour_category="adventures" numberposts="7" day_min=1 day_max=20]
Hy vọng với những ví dụ cụ thể như bên trên, các bạn sẽ hiểu rõ hơn về cách sử dụng hàm get_posts() của WordPress và ứng dụng trong thực tế một cách thành thạo.
Các bạn lưu ý là hàm này khác hoàn toàn với hàm get_post() nhé.
Hàm này các bạn có thể sử dụng thoải mái ở Plugin hoặc ở template và không cần phải defines bất kỳ thông số nào. Nó có thể hoạt động độc lập trong môi trường nội bộ của WordPress như ở Plugins hay ở trong Theme.
Các bạn có thể tham khảo thêm thông tin ở trang hỗ trợ chính thức của hàm này trên trang WordPress Developer Resources tại đây.