get_post_meta() là hàm dùng để lấy các post meta value và post meta key trong WordPress. Bài viết này sẽ hướng dẫn các bạn cách sử dụng hàm get_post_meta để lấy giá trị của các trường mở rộng (custom fields) trong WordPress với các ví dụ cụ thể để bạn dễ thực hành.
Post Meta Keys và Post Meta Value là các thông tin mở rộng của bài viết như ngày viết, tác giả, danh mục, thẻ (tags), hoặc các dữ liệu tự thêm vào khác (Custom Fields). Tùy thuộc vào giao diện WordPress của bạn, các thông tin này có thể được hiển thị trên các vị trí khác nhau như đầu trang, cuối trang hay thậm chí là ở sidebar.
Table of Contents
Cách sử dụng get_post_meta():
get_post_meta là hàm nằm trong lõi của WordPress, bạn có thể tìm thấy hàm này ở trong file này: wp-includes/post.php
function get_post_meta( $post_id, $key = '', $single = false ) { return get_metadata( 'post', $post_id, $key, $single ); }
Cách sử dụng:
get_post_meta( $post_id, $key = '', $single = false )
$post_id: ID của bài viết cần lấy post meta
$key: đối tượng cần lấy giá trị – cái này phân biệt chữ hoa chữ thường nhé.
$single: true or false – true thì trả về tất cả các giá thị theo array, còn false thì trả về giá trị đầu tiên
Nếu $post_id không được định nghĩa thì nó sẽ mặc định lấy ID của bài viết hiện tại bằng hàm get_the_ID().
Ví dụ:
<?php $price = get_post_meta(get_the_ID(), 'Price', true); echo 'Cost of the item : '.$price; ?>
Một số bài có thể bạn quan tâm:
Hàm get_template_part(): Cách sử dụng và ví dụ cụ thể
Tiếp tục với các ví dụ để hiểu rõ hơn các tham số $key và $single trong hàm get_post_meta nhé:
Lấy tất cả các post meta key của bài viết hiện tại:
<?php $meta = get_post_meta( get_the_ID() ); ?>
Lấy tất cả các post meta của MỘT key cụ thể (ở đây là price) của bài viết hiện tại:
<?php $key_price_values = get_post_meta( get_the_ID(), 'price' ); ?>
Lấy giá trị đầu tiên của post meta key price của bài viết hiện tại:
<?php $key_price_value = get_post_meta( get_the_ID(), 'price', true ); ?>
Một số ví dụ dùng get_post_meta
Get the Post Thumbnail URL in WordPress
Có hai cách có thể lấy thumbnail URL của bài viết. Có thể dùng hàm get_the_post_thumbnail_url() để lấy:
$featured_img_url = get_the_post_thumbnail_url($post->ID, 'full');
Hoặc cách thứ 2 là dùng get_post_meta()
<?php echo esc_url( get_post_meta( get_the_ID(), 'thumb', true ) ); ?>
Get post meta data of custom post type
Mặc định thì WordPress có 2 post type là Post và Page. Nhiều bạn hỏi vậy nếu muốn lấy Post Meta của các Custom Post Type thì làm thế nào? Xin trả lời là nó không khác gì cả, vì get post meta nó lấy theo key nên không phụ thuộc vào post type. Các post meta đều được lưu vào bảng #_postmeta mà không liên quan gì tới post type. Nên cách lấy dữ liệu vẫn thế.
Ví dụ: Post type là Tour, meta là price_base thì lấy dữ liệu vẫn sẽ là:
<?php $price_base = get_post_meta( get_the_ID(), 'price_base', true ); ?>
Get all post meta by post ID
Nếu muốn hiện tất cả các Post Meta Keys và Post Meta Value cho 1 bài viết cụ thể (theo $post_ID) thì ta có thể dùng get_post_meta() để lấy dữ liệu rồi dùng foreach để show nó ra.
Ví dụ:
add_action('wp_head', 'output_all_postmeta' ); function output_all_postmeta() { $postmetas = get_post_meta($post_ID); foreach($postmetas as $meta_key=>$meta_value) { echo $meta_key ' : ' . $meta_value[0] . '<br/>'; } }
Cái add_action sẽ áp dụng cho tất cả các bài viết. Nghĩa là bài nào nó cũng show ra. Các bạn tự tìm hiểu thêm nhé.
Get all post meta by key
Một tình huống khá thú vị được đặt ra là: Nếu bạn muốn lấy tất cả Post Meta Value của một Post Meta Key nào đó trong tất cả các bài viết thì phải làm thế nào?
Mời các bạn tham khảo đoạn code bên dưới – key ở đây là rating nhé:
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) { global $wpdb; if( empty( $key ) ) return; $return = $wpdb->get_col( $wpdb->prepare( " SELECT pm.meta_value FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE pm.meta_key = %s AND p.post_status = %s AND p.post_type = %s ", $key, $status, $type ) ); return $return; }
Sử dụng:
$tour_ratings = get_meta_values( 'rating', 'tours' );
Hoặc có thể phân tích dữ liệu trả về:
$tour_ratings = get_meta_values( 'rating', 'tours' ); if( !empty( $tour_ratings ) ) { $num_of_ratings = array(); foreach( $tour_ratings as $meta_value ) $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1; } /* Result: Array( [5] => 10 [9] => 2 ) // Có 10 tours được đánh giá 5 điểm và 2 tour được đánh giá 9 điểm. */
Tham khảo thêm hàm get_post_meta() tại https://developer.wordpress.org