Quản lý MetaData và Metaboxes
Metadata is information about information. In the case of WordPress, it’s information associated with posts, users, comments and terms.
Given the many-to-one relationship of metadata in WordPress, your options are fairly limitless. You can have as many meta options as you wish, and you can store just about anything in there.
WordPress Developer Handbook
Theo Nam đây là một định nghĩa rất tốt và súc tích, Medata là dữ liệu về thông tin, gắn với các nội dung phổ biến trong WordPress như
- Bài viết
- Người dùng
- Bình luận
- Phân loại
Với metadata, những nội dung cơ bản là có rất nhiều thông tin bổ trợ và vô cùng hữu ích cũng như gia tăng tính tùy biến. Đơn cử như nếu bạn có custom post type là “Bất động sản” thì bạn có thể dễ dàng tạo các metadata xoay quanh
- Diện tích
- Số phòng tắm
- Số phòng ngủ
Thực tế là đã có 1 dự án khá tốt trong việc sử dụng Metadata đó là ACF, chúng mang tới việc xây dựng các Metadata đơn giản hơn bao giờ hết, nhưng để hiểu sâu hơn về cách khởi tạo một cách native nhất, hãy cùng đến với bài viết về Metadata tại Nam Digital.
Quản lý Metadata
Bạn có thể dễ dàng thực hiện các lệnh tạo, sửa, xóa meta data với các hàm sẵn của WordPress như
- add_post_meta()
- update_post_meta() – Nếu chưa có dữ liệu sẵn thì sẽ mặc định tạo mới
- delete_post_meta() – Xóa post meta
Tất tần tật về Meta boxes
Bản chất khi bạn vào màn edit một trang, bài viết…là bạn đang thực hiện tinh chỉnh toàn bộ các field bên trong, từ chọn ảnh, viết bài, cho tới lựa chọn danh mục, chuyên mục…Một cách dễ hiểu thì Meta Boxes là những cái hộp cho phép bạn tinh chỉnh để thay đổi thông tin các dạng nội dung trong WordPress
Cách khởi tạo một Meta box cơ bản
function wporg_add_custom_box() {
$screens = [ 'post', 'wporg_cpt' ];
foreach ( $screens as $screen ) {
add_meta_box(
'wporg_box_id', // Unique ID
'Custom Meta Box Title', // Box title
'wporg_custom_box_html', // Content callback, must be of type callable
$screen // Post type
);
}
}
add_action( 'add_meta_boxes', 'wporg_add_custom_box' );
Ví dụ trên đẩy vào action hook add_meta_boxes một hàm trong đó với dạng bài là post hoặc wporg_cpt thì sẽ khởi tạo 1 meta box với hàm content callback có hiển thị như sau
function wporg_custom_box_html( $post ) {
?>
<label for="wporg_field">Description for this field</label>
<select name="wporg_field" id="wporg_field" class="postbox">
<option value="">Select something...</option>
<option value="something">Something</option>
<option value="else">Else</option>
</select>
<?php
}
Hàm này sẽ đổ vào post hoặc wporg_cpt một select box cho phép lựa chọn giá trị Something và Else…Tuy vậy chỉ như thế này thì chưa đủ, bởi chúng ta mới chỉ khởi tạo về đầu frontend mà thôi, ta cần get giá trị Metadata (nếu có) hoặc save chúng khi thực hiện submit dữ liệu
Lấy dữ liệu
function wporg_custom_box_html( $post ) {
$value = get_post_meta( $post->ID, '_wporg_meta_key', true );
?>
<label for="wporg_field">Description for this field</label>
<select name="wporg_field" id="wporg_field" class="postbox">
<option value="">Select something...</option>
<option value="something" <?php selected( $value, 'something' ); ?>>Something</option>
<option value="else" <?php selected( $value, 'else' ); ?>>Else</option>
</select>
<?php
}
Như bạn thấy thì hàm html trên đã được cải tiến để get giá trị meta data có tên là _wporg_meta_key
Lưu dữ liệu
Để lưu được dữ liệu, ta cũng cần kẹp metadata đó vào hook save_post, nhằm gửi kèm luôn dữ liệu đó khi submit post và wporg_cpt
function wporg_save_postdata( $post_id ) {
if ( array_key_exists( 'wporg_field', $_POST ) ) {
update_post_meta(
$post_id,
'_wporg_meta_key',
$_POST['wporg_field']
);
}
}
add_action( 'save_post', 'wporg_save_postdata' );
Trong quá trình lưu file nếu có tồn tại field wporg thì cập nhật post_meta với _wporg_meta_key đi kèm, gửi lệnh $_POST thành phần wporg_field.
Sử dụng phương thức lập trình hướng đối tượng OOP
abstract class WPOrg_Meta_Box {
/**
* Set up and add the meta box.
*/
public static function add() {
$screens = [ 'post', 'wporg_cpt' ];
foreach ( $screens as $screen ) {
add_meta_box(
'wporg_box_id', // Unique ID
'Custom Meta Box Title', // Box title
[ self::class, 'html' ], // Content callback, must be of type callable
$screen // Post type
);
}
}
/**
* Save the meta box selections.
*
* @param int $post_id The post ID.
*/
public static function save( int $post_id ) {
if ( array_key_exists( 'wporg_field', $_POST ) ) {
update_post_meta(
$post_id,
'_wporg_meta_key',
$_POST['wporg_field']
);
}
}
/**
* Display the meta box HTML to the user.
*
* @param WP_Post $post Post object.
*/
public static function html( $post ) {
$value = get_post_meta( $post->ID, '_wporg_meta_key', true );
?>
<label for="wporg_field">Description for this field</label>
<select name="wporg_field" id="wporg_field" class="postbox">
<option value="">Select something...</option>
<option value="something" <?php selected( $value, 'something' ); ?>>Something</option>
<option value="else" <?php selected( $value, 'else' ); ?>>Else</option>
</select>
<?php
}
}
add_action( 'add_meta_boxes', [ 'WPOrg_Meta_Box', 'add' ] );
add_action( 'save_post', [ 'WPOrg_Meta_Box', 'save' ] );
Đoạn này giúp việc gói các function thuộc 1 hướng đối tượng trở nên đơn giản hơn, từ đó ta có thể sử dụng các hàm nội bộ với tên gọi đơn giản hơn như add, save để tiện lợi và dễ quản lý hơn.