fbpx

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ư

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.

Array

Nam là 1 Growth Hacker, Developer đam mê với sự nghiệp phát triển web