METABOX

Khi bạn đăng nhập vào admin và bạn edit một bài viết nào đó thì các khối trong giao diện ta gọi là các Meta Boxes. Vậy Meta Boxes là các khối hiển thị dữ liệu cho phép người dùng chỉnh sửa và lưu lại trong trang quản lý bài viết của WordPress.

#Add

static function Metabox::add($id, $title, $callback, $args);

#Parameters

Parameter Value Description
$id string Là ID của meta box, ID này phải là duy nhất không trùng với các Meta Boxes khác.
$title string Tiêu đề của Meta Box.
$callback string Hàm callback dùng để hiển thị mã HTML nằm bên trong Meta Box
$args array

Các tham số

$module: Đối tượng mà Meta Box sẽ hiển thị, có thể là Page, Post, Category, Product hoặc là một custom post type

$position: Thứ tự ưu tiên hiển thị giữa các Meta box.

$content: Vị trí mà Meta Box sẽ hiển thị bên trên giao diện. Chúng ta có ba vị trí đó là tabs, leftTop, leftBottomright.

$content_box: Một mảng các tham số truyền vào Meta Box

METADATA

Metadata cho phép bạn đưa các thông tin bổ sung vào một tài nguyên của website.

Metadata có thể được thêm vào:

#Add metadata

Hàm này thêm một thông tin meta vào cơ sở dữ liệu, cấu trúc của nó như sau:

static function Metadata::add($object_type, $object_id, $meta_key, $meta_value);

#Parameters

Parameter Value Description
$object_type string Tên đối tượng metadata. Ví dụ post, page, comment, term
$object_id int Khóa ngoại tham chiếu đến table chính. (ID post, page ...)
$meta_key string Key của Meta data
$meta_value string Giá trị của Meta data

#Get metadata

Hàm này dùng để lấy một metadata trong cơ sở dữ liệu

static function Metadata::get($object_type, $object_id = '', $meta_key = '', $single = false);

#Parameters

Parameter Value Description
$object_type string Tên đối tượng metadata. Ví dụ post, page, comment, term
$object_id int Khóa ngoại tham chiếu đến table chính. (ID post, page ...)
$meta_key string Key của Meta data
$single true|false (default false) Nếu $single = true thì nó sẽ trả về giá trị của $meta_key, ngược lại nó sẽ trả về một mảng chứa tất cả các thông tin của record đó.

#Update metadata

Hàm này cập nhật giá trị cho một meta key nào đó, nếu meta_key không tồn tại sẽ tạo mới metadata

static function Metadata::update($object_type, $object_id, $meta_key, $meta_value);

#Parameters

Parameter Value Description
$object_type string Tên đối tượng metadata. Ví dụ post, page, comment, term
$object_id int Khóa ngoại tham chiếu đến table chính. (ID post, page ...)
$meta_key string Key của Meta data
$meta_value string Giá trị của Meta data

#Delete metadata

Hàm này xóa một hoặc nhiều metas ra khỏi cơ sở dữ liệu, cấu trúc như sau:

static function Metadata::delete($object_type, $object_id, $meta_key, $meta_value, $delete_all = false);

#Parameters

$delete_all sẽ có giá trị true hoặc false, nếu true thì nó xóa hết tất cả các field có key trùng với $meta_key, ngược lại nó chỉ xóa field có key trùng với $meta_key và có object_id trùng với $object_id.

$meta_value nếu bạn thiết lập giá trị cho tham số này thì nó sẽ bổ sung thêm một điều kiện xóa đó là giá trị của key meta phải bằng với $meta_value.

#Metadata object

Khi bạn thêm metadata bằng add_metadata hoặc update_metadat, khi xóa đối tượng (page, post ..) thì dữ liệu metadat sẽ không được tự động xóa kèm mà bạn phải viết lệnh hoặc xóa thủ công cho metadata đã thêm.

Để tự động hóa quá trình xóa metadata bạn có thể sử dụng các hàm metadata riêng biệt cho từng đối tượng

Adding metadata Getting metadata Updating metadata Deleting metadata
Category add_category_meta get_category_meta update_category_meta delete_category_meta
Posts add_post_meta get_post_meta update_post_meta delete_post_meta
Gallery add_gallery_meta get_gallery_meta update_gallery_meta delete_gallery_meta
Users add_user_meta get_user_meta update_user_meta delete_user_meta
Page chưa hỗ trợ chưa hỗ trợ chưa hỗ trợ chưa hỗ trợ

Thay vì sử dụng các hàm metadata và có truyền tham số $meta_type thì bạn sử dụng các hàm trên để bỏ qua tham số $meta_type.

Ví dụ

class AddMetaBox
{
    static function videoForm($object): void
    {
        $url = (have_posts($object)) ? Posts::getMeta($object->id, 'videoUrl', true) : '';
        $Form = new FormBuilder();
        $Form
            ->add('videoUrl', 'text', ['label' => 'Url video youtube'], $url)
            ->html(false);
    }

    /**
     * saveMetaBox - Lưu dữ liệu vào metadata
     */
    static function saveMetaBox($id, $module): void
    {
        if ($module == 'post' && Admin::getPostType() == 'post') {
            $url = Request::Post('videoUrl');
            Posts::updateMeta($id, 'videoUrl', $url);
        }
    }
}

/**
 * Đăng ký MetaBox
 * Tạo một ô MetaBox trong những bài viết có post type là post
 * @videoBox: là key của ô MetaBox
 * @Url_youtube: là tiêu đề của ô MetaBox
 * @AddMetaBox::urlForm : function sẽ hiển thị
 * @module: nơi MetaBox được tạo
 * - products: sản phẩm
 * - page: trang nội dung
 * - post_{POST_TYPE}: bài viết có post type là POST_TYPE
 */
Metabox::add('videoBox', 'Url youtube', 'AddMetaBox::videoForm', ['module' => 'post_post']);
add_action('save_object', 'AddMetaBox::saveMetaBox', 10, 2);