Trang chủ WordpressWordpress Development Custom Post Type toàn tập

Custom Post Type toàn tập

bởi Thạch Phạm

Cũng thuộc khuôn khổ bài quan trọng nên mình cũng xin viết lại về vấn đề này do hai bài cũ kia hiện nay hơi lỗi thời vì một số cập nhật trong WordPress 3.8.1. Ở bài này, mình sẽ hướng dẫn chi tiết nhưng ngắn gọn về khái niệm Custom Post Type và cách làm việc với Custom Post Type thông qua code.

Custom Post Type là gì?

Hướng dẫn Custom Post Type

Mặc định trong WordPress sẽ cho bạn PagePost để xuất bản nội dung và hai cái này được gọi là post type. Nếu bạn có nhu cầu sử dụng nhiều hơn 2 post type, ví dụ làm thêm một post type khác với mục đích đăng sản phẩm thì bắt buộc chúng ta phải tự tạo một post type tương ứng, và cái post type mà do chúng ta tự tạo ra thì được gọi là Custom Post Type.

Một Custom Post Type sẽ hoàn toàn có đủ những “tố chất” giống hệt như hai post type mặc định, nghĩa là bạn có thể sử dụng category, tag, custom field, featured image,….và có thể gọi hiển thị ra ngoài trang chủ cùng lúc với Post.

Cách tạo Custom Post Type

Hãy nên nhớ rằng, hiện nay ít ai tạo custom post type bằng cách gõ từng dòng code như trong bài này mà sẽ sử dụng các công cụ mà mình sẽ đề cập ở cuối bài, do đó có thể bạn không cần nhớ hết các tham số khi tạo. Nhưng các bạn lưu ý dùm mình là hãy đọc kỹ bài để hiểu quy trình tạo một custom post type như thế nào để dễ dàng khi làm việc về sau.

Giống như làm việc với các code tạo widget hay tạo shortcode, để tạo một custom post type bạn có thể viết vào file functions.php của theme hoặc tạo plugin.

Để tạo custom post type ta có cấu trúc code như sau:

function tao_custom_post_type() {

	/*
	 * Biến $args là những tham số quan trọng trong Post Type
	 */
	$args = array(
           //Tham số cấu hình cho custom post type
	);

	register_post_type( 'slug-post-type' , $args );	//Cái slug-post-type rất quan trọng, bạn có thể đặt tùy ý nhưng không có dấu cách, ký tự,...

}

add_action( 'init', 'tao_custom_post_type' );

Không có gì là khó hiểu, đầu tiên là ta sẽ tạo một hàm riêng để tạo custom post type và cuối cùng này là kích hoạt cái hàm này vào action hook init là xong.

Trong hàm tao_custom_post_type() là một hàm register_post_type() để khởi tạo custom post type với các tham số mà ta sẽ khai báo trong biến $args. Thế là hết.

Đó là cấu trúc, quan trọng là ta sẽ khai báo những gì trong đó. Bạn có thể xem qua các tham số tại register_post_type – WordPress Codex.

Các tham số trong code tạo Custom Post Type

Dưới đây là cách khai báo tham số quan trọng nhất, những tham số dạng optional mình sẽ bỏ qua.

Giả sử mình cần tạo một custom post type để đăng sản phẩm thì sẽ có code như sau.

function tao_custom_post_type()
{

    /*
     * Biến $label để chứa các text liên quan đến tên hiển thị của Post Type trong Admin
     */
    $label = array(
        'name' => 'Các sản phẩm', //Tên post type dạng số nhiều
        'singular_name' => 'Sản phẩm' //Tên post type dạng số ít
    );

    /*
     * Biến $args là những tham số quan trọng trong Post Type
     */
    $args = array(
        'labels' => $label, //Gọi các label trong biến $label ở trên
        'description' => 'Post type đăng sản phẩm', //Mô tả của post type
        'supports' => array(
            'title',
            'editor',
            'excerpt',
            'author',
            'thumbnail',
            'comments',
            'trackbacks',
            'revisions',
            'custom-fields'
        ), //Các tính năng được hỗ trợ trong post type
        'taxonomies' => array( 'category', 'post_tag' ), //Các taxonomy được phép sử dụng để phân loại nội dung
        'hierarchical' => false, //Cho phép phân cấp, nếu là false thì post type này giống như Post, true thì giống như Page
        'public' => true, //Kích hoạt post type
        'show_ui' => true, //Hiển thị khung quản trị như Post/Page
        'show_in_menu' => true, //Hiển thị trên Admin Menu (tay trái)
        'show_in_nav_menus' => true, //Hiển thị trong Appearance -> Menus
        'show_in_admin_bar' => true, //Hiển thị trên thanh Admin bar màu đen.
        'menu_position' => 5, //Thứ tự vị trí hiển thị trong menu (tay trái)
        'menu_icon' => '', //Đường dẫn tới icon sẽ hiển thị
        'can_export' => true, //Có thể export nội dung bằng Tools -> Export
        'has_archive' => true, //Cho phép lưu trữ (month, date, year)
        'exclude_from_search' => false, //Loại bỏ khỏi kết quả tìm kiếm
        'publicly_queryable' => true, //Hiển thị các tham số trong query, phải đặt true
        'capability_type' => 'post' //
    );

    register_post_type('sanpham', $args); //Tạo post type với slug tên là sanpham và các tham số trong biến $args ở trên

}
/* Kích hoạt hàm tạo custom post type */
add_action('init', 'tao_custom_post_type');

Giải thích thì trong code mình đã giải thích khá chi tiết rồi nên ở đây mình không nói lại, mình chỉ cần bạn để ý giúp register_post_type( 'sanpham', $args ) vì đó là đoạn khởi tạo Custom Post Type với tên là sanpham.

Kết quả ta có…

demo-custom-post-type-2014Woooot!!! Thành công rồi ha, rê chuột vào bạn cũng thấy phần xem tất cả các post bên trong post type đó và nút Add new để thêm post mới giống như Page/Post. Vậy là coi như bạn đã tạo xong một Custom Post Type rồi á.

Hiển thị custom post type ra trang chủ

Mặc định nếu ngoài trang chủ bạn đang hiển thị danh sách các post mới nhất thì nó chỉ lấy bài trong Post hiển thị chứ không lấy post của một custom post type ra, để cho nó hiển thị bạn chỉ cần chèn thêm dòng này vào functions.php

add_filter('pre_get_posts','lay_custom_post_type');
function lay_custom_post_type($query) {
  if (is_home() && $query->is_main_query ())
    $query->set ('post_type', array ('post','sanpham'));
    return $query;
}

Bạn nhớ thay sanpham thành tên slug của custom post type bạn vừa tạo nhé. Đó là lý do vì sao mình kêu bạn nhớ cái slug này, còn nhiều việc để dùng nữa.

Tạo file hiển thị nội dung custom post type

Dựa vào cấu trúc của theme, thì mặc định custom post type sẽ hiển thị dựa theo code của file single.php trong theme. Nếu bạn muốn nó hiển thị khác, thì cứ tạo một file tên là single-{slug-post-type}.php. Như ví dụ này thì mình sẽ tạo file tên là single-sanpham.php để hiển thị nội dung trong post type riêng này.

Bạn có thể copy toàn bộ code bên file single.php qua file mới tạo này và sửa lại cho nhanh.

Sử dụng trong Loop

Để hiển thị danh sách các bài trong một custom post type ra ngoài bằng Loop & Query thì chỉ cần khai báo thêm một tham số post_type vào là được. Ví dụ:

$new_query = new WP_Query( 'post_type=sanpham' );

Quá dễ dàng.

Công cụ tạo Custom Post Type nhanh

Như mình đã nói ở đầu bài, bây giờ ít ai tạo Custom Post Type mà viết từng dòng code mà thay vào đó là sử dụng các công cụ tạo cho nhanh bởi vì thực tế bước tạo nó cũng chỉ có nhiêu đó chứ không khác hơn. Dưới đây là các công cụ mà bạn nên xem qua:

  • Custom Post Type Generator – Cho phép bạn tạo custom post type nhanh chóng bằng việc chọn một số tùy chọn có sẵn và lấy toàn bộ code về. Bạn chỉ cần copy đoạn code này vào file functions.php hoặc làm plugin riêng là xong.
  • Custom Post Type UI – Plugin miễn phí cho phép tạo custom post type nhanh chóng trực tiếp trong WP-Admin.

Vậy thôi, còn các công cụ khác nó nhiều tính năng quá nên mình không đề cập tới vì rất hại não.

Kết bài

Trong bài này mình chỉ đề cập đến đây thôi vì mình nghĩ nhiêu đó đã quá đủ để cho bạn hiểu Custom Post Type là gì và cách tạo nó. Dĩ nhiên còn rất là nhiều tips/tricks để chúng ta sử dụng với chức năng này nhưng nếu có mình sẽ viết bài riêng.

Hơn nữa, khi làm việc với Custom Post Type có thể bạn sẽ phải tìm hiểu thêm một khái niệm khác nữa, đó là Custom Taxonomies mà mình sẽ đề cập ở bài tiếp theo và sau khi có bài đó rồi mình sẽ đề cập tới một số thủ thuật liên quan đến Custom Post Type, từ đó bạn sẽ dễ dàng hiểu mà không phải quá nặng đầu óc.

Có thể bạn quan tâm

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.