Custom post type – Loại bài viết tùy biến

WordPress mặc định chỉ cho chúng ta một khu vực viết bài là “Bài viết” hay “Post”, trong đó chúng ta có thể chia các viết thành các chuyên mục để dễ quản lý.

Tuy nhiên, trong một số trường hợp, chúng ta muốn có thêm 2 hay 3 khu vực viết bài riêng biệt để dễ quản lý hơn hay dễ tùy chỉnh giao diện hơn, chúng ta có thể dễ dàng tạo thêm một nhóm loại bài viết mới bằng hàm register_post_type() được hỗ trợ bởi WordPress. Sau đây là một ví dụ tạo phân vùng riêng để viết các bài viết về sách.

Tạo plugin

Tạo file với tên bất kỳ (ví dụ: book-plugin.php) vào folder /wp-content/plugins/ với nội dung như sau:

<?php /* Plugin Name: My Books Description: This plugin was created for a new post type. Author: Dang Dinh Le Author URI: https://www.ilur.net */ add_action( 'init', 'book_post_type' ); function book_post_type() { register_post_type( 'book', array( 'labels' => array(
		'name' => 'Books', // Tên số nhiều
		'singular_name' => 'Book', //Tên số ít
		),
		'public' => true,
		'has_archive' => true,
		'menu_position' => 5,
		'rewrite' => array( 'slug' => 'review-sach' ),
		'taxonomies' => array('category', 'post_tag'), //Sử dụng chung chuyên mục và tag của Bài viết cho Book
		'menu_icon' => 'dashicons-book-alt',
		'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments')
	));
	/*Vị trí Thêm*/
}

Nếu tên của loại bài viết mới của bạn không phân biệt số nhiều và số ít thì thay bằng 'label' => 'Tên..',

Trong trường hợp trên, chuyên mục và tag cho Bài viết (mặc định) sẽ được sử dụng chung với loại bài viết Book mới. Nếu bạn muốn tách riêng thì nghiên cứu hàm register_taxonomy() nhé. Ví dụ những chuyên mục của Book sẽ dùng riêng với Bài viết

register_taxonomy(
	'categories', //tên của taxonomy mới (tùy ý)
	array('book'), //áp dụng cho loại bài viết là Book
	array(
		'hierarchical' => true, //Nếu tạo chuyên mục, nếu tạo thẻ tag thì để false
		'label' => 'Categories',
		'singular_label' => 'Category',
		'rewrite' => array( 'slug' => 'book' )
	)
);

Thêm trường tùy biến cho custom post type

Để thêm trường tùy biến cho custom post type, ở trường hợp này là thêm 3 mục cho loại bài viết Book là:

  • Link mua sách
  • Link đọc ebook
  • Tác giả sách
//Thêm phần (khung) Thông tin sách khi viết bài mới trong mục book
function book_detail() {
	add_meta_box( 'post_resource', 'Thông tin sách', 'book_detail_box', 'book' );
}
add_action( 'add_meta_boxes', 'book_detail' );

//Thêm các trường cụ thể cho khung thông tin sách
function book_detail_box( $post ) {
	$post_buybook_url = get_post_meta( $post->ID, 'buybook_url', true );
	$post_ebook_url = get_post_meta( $post->ID, 'ebook_url', true );
	$post_author_url = get_post_meta( $post->ID, 'author_url', true );
	wp_nonce_field( 'save_data', 'thongtin_nonce' );
	echo ( 'Link mua sách:' );
	echo ('<input type="text" id="post_buybook_url" name="post_buybook_url" value="'.esc_attr( $post_buybook_url ).'" />');
	echo ( 'Link ebook:' );
	echo ('<input type="text" id="post_ebook_url" name="post_ebook_url" value="'.esc_attr( $post_ebook_url ).'" />');
	echo ( 'Tác giả:' );
	echo ('<input type="text" id="post_author_url" name="post_author_url" value="'.esc_attr( $post_author_url ).'" />');
}

//Xử lý và lưu dữ liệu từ 3 trường tùy biến bên trên vào CSDL
function do_save_data( $post_id ) {
	$thongtin_nonce = $_POST['thongtin_nonce'];
	if( !isset( $thongtin_nonce ) ) {
		return;
	}
	if( !wp_verify_nonce( $thongtin_nonce, 'save_data' ) ) {
		return;
	}
	$post_buybook_url = sanitize_text_field( $_POST['post_buybook_url'] );
	$post_ebook_url = sanitize_text_field( $_POST['post_ebook_url'] );
	$post_author_url = sanitize_text_field( $_POST['post_author_url'] );
	update_post_meta( $post_id, 'buybook_url', $post_buybook_url );
	update_post_meta( $post_id, 'ebook_url', $post_ebook_url );
	update_post_meta( $post_id, 'author_url', $post_author_url );
}
add_action( 'save_post', 'do_save_data' );

Hiển thị bài viết trong custom post type ra ngoài

Trong trường hợp trên, nếu chúng ta sử dụng chung chuyên mục và tag của Bài viết (mặc định) cho loại bài viết Book thì khi vào trang lưu trữ chuyên mục hay tag sẽ không hiển thị các bài viết nằm trong thể loại book. Thêm đoạn code sau để hiển thị các bài viết trong Book ra trang chủ, chuyên mục, tag như một bài viết bình thường.

function include_post_type($query) {
	if ( $query->is_home() && $query->is_main_query() || $query->is_tag() && $query->is_main_query() || $query->is_category() && $query->is_main_query() ) {
		$query->set('post_type', array('post', 'book'));
	}
	return $query;
}
add_filter('pre_get_posts', 'include_post_type');

Trong đó, nếu bạn không thêm điều kiện và $query->is_main_query() thì nó sẽ thực hiện cho tất cả các widget, menu… sẽ dẫn tới một số trường hợp không hiển thị được menu.

Tùy biến giao diện cho custom post type

Để tùy biến giao diện cho một nhóm loại bài viết tùy chỉnh chúng ta vào folder /wp-content/themes/ tạo các file với cấu trúc như sau:

  • archive-book.php trong đó book là tên của custom post type mình đã tạo ở trên. Khi này, các bài viết thuộc loại bài viết book, khi hiển thị Archive (lưu trữ) như theo thời gian, theo chuyên mục hay là trang lưu trữ của loại bài viết (yourdomain/book – book là custom post type rewrite slug).
  • single-book.php, tương tự như trên, file này dùng để cấu hình nội dung hiển thị trong trang detail bài viết thuộc loại bài vết book.

Các bạn có thể copy nội dung từ file archive.php và single.php để tùy chỉnh cho nhanh 🙂

Cùng chuyên mục