Custom Post Type là gì ? Sử dụng CPT trong lập trình WordPress nâng cao

Nếu bạn là dân IT mà đang tìm tòi học hỏi cách lập trình WordPress thì ngoài việc hiểu cấu trúc core và cách hoạt động của mã nguồn WordPress thông qua Action HooksFilter Hooks thì việc nghiên cứu Custom Post Type là một điều cực kỳ quan trọng. Việc hiểu Custom Post Type và biết cách sử dụng chúng sẽ giúp chúng ta xây dựng được các ứng dụng web trên nền tảng WordPress một cách mạnh mẹ hơn và có khả năng tùy biến cao cho phía client.

Post Type trong WordPress là gì ?

Đầu tiên chúng ta cần hiểu sơ qua về các loại Post trong cấu trúc Database của mã nguồn WordPress, Chúng ta có 1 số Post Type (loại post mặc định) như post, page, attachment,…Việc này được thể hiện qua trường post_type trong bảng dữ liệu wp_posts của cấu trúc Database. (trường vị trí 21)

Cấu trúc bảng post WP (Custom Post Type)

Cấu trúc bảng post WP

WordPress sử dụng Post Type như một cách để phân loại các đối tượng tương tự như 1 bài viết nhưng có thể lưu các loại nội dung khác nhau. Điều này giúp quản trị nội dung một cách dễ dàng và rõ ràng hơn. Ví dụ Bài viết ở riêng một mục và các Trang ở riêng một mục trên menu.

Vậy Custom Post Type là gì ?

Custom Post Type thực ra là 1 loại Post Type do lập trình viên tự tạo ra bằng cách khai báo dựa theo hàm register_post_type() . Thay vì phải sử dụng những Post Type mặc định là Post hoặc Page, lập trình viên có thể khai báo thêm Post Type để đảm bảo yêu cầu từ phía khách hàng. Một Post Type được khai báo mới gọi là Custom Post Type

Cách tạo Custom Post Type WP

Việc tạo lên 1 Custom Post Type yêu cầu bạn phải có 1 chút kiến thức liên quan đến Action Hooks để có thể móc 1 hàm khai báo Custom Post Type khi ứng dung Web của bạn được khởi chạy (cụ thể là lúc trang admin, themes đã được khởi chạy xong) – cụ thể ở đây chúng ta sử dụng Action Hook init. Nếu chưa biết cách sử dụng Action Hook mời bạn đọc thêm tại link: https://dolazo.net/action-hooks-la-gi-va-cach-su-dung/

Cú pháp để tạo Custom Post Type như sau:

function add_custom_post_type() {
     /*
     * Biến $args là những tham số quan trọng để tạo 1 post type
     */
     $args = array(
         //Tham số cấu hình cho custom post type
      );
     // slug-post-type rất quan trọng, nó là đường dẫn đứng trước permalink cho loại post type này
     register_post_type( 'slug-post-type' , $args );
 
}
// Móc hàm add_custom_post_type để khai báo CPT vào Hook init
add_action( 'init', 'add_custom_post_type' );

Ví dụ thực tế, giả sử khách hàng của bạn là một doanh nghiệp kinh doanh bất động sản. Ngoài việc đăng bài viết, họ còn muốn lập trình viên tạo lên 1 mục để đăng và biên tập các dự án bất động sản mà công ty này đang mở bán. Câu hỏi đặt ra là nếu dùng mục bài viết để đăng dự án bất động sản thì sẽ rất khó cho khâu quản lý nội dung. Hơn thế nữa chúng ta không thể tùy biến giao diện riêng cho những bài đăng về dự án này. Lúc này thì sức mạnh của Custom Post Type sẽ được thể hiện. Chúng ta áp dụng cú pháp trên trong file functions.php của theme đang chạy.

function add_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' => 'Dự án bất động sản', //Tên post type dạng số nhiều
        'singular_name' => 'Dự án' //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', // Tiêu đề 
            'editor', // Editor cho nội dung
            'excerpt', // tóm tắt
            'author', //  tác giả
            'thumbnail', // ảnh đại diện
            'comments', //  bình luận
            'trackbacks',
            'revisions',
            'custom-fields'
        ), //Các tính năng được hỗ trợ như 1 bài viết mặc định xóa 1 trong những cái trên thì khi sửa Post type bạn sẽ không thấy những phần đó như trong bài viết bình thường
        '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('property', $args); //Tạo post type với slug tên là sanpham và các tham số trong biến $args ở trên
 
}
/* Móc hàm đăng ký vào Hook */
add_action('init', 'add_custom_post_type');
Có thể bạn quan tâm

Hiển thị nội dung của Custom Post Type ở đâu

Sau khi đã tạo xong CPT, các bạn đã thấy tên của loại CPT này xuất hiện trên Menu của Admin Dashboard. Lúc này chúng ta đã có thể thêm, sửa , xóa các bài viết thuộc CPT mới này. Vậy câu hỏi đặt ra là nội dung của những bài này hiển thị ra phía frontend sẽ như thế nào ?

Nếu bạn đã nắm được sơ qua về cấu trúc theme của WordPress rồi thì chắc bạn đã biết về file single.php tuy nhiên để hiển thị nội dung cho 1 Custom Post Type, chúng ta cần tạo 1 file php mới trong thư mục của theme. Cú pháp đặt tên file này sẽ là single-<custom-post-type-name>.php custom-post-type-name chính là giá trị đầu tiền mà bạn truyền vào khi gọi hàm register_post_type. Nếu theo ví dụ trên thì file ta tạo sẽ có tên là single-property.php, trong file này các bạn thực hiện gọi header, footer và cấu trúc lại nội dung cho phù hợp với yêu cầu của khách hàng.

Cách truy vấn Custom Post Type

Vẫn theo ví dụ thực tế trên, giả sử lúc này khách hàng yêu cầu bạn hiển thị danh sách cách dự án bất động sản mới nhất ở trang chủ. Vậy làm sao để chúng ta có thể truy vấn được các dự án này ra ? Câu trả lời là chúng ta dùng custom query để truy vấn Custom Post Type cụ thể ở đây là CPT có tên property.

$lastest_properties_query = new WP_Query(
   'post_type' => 'property' // truyền vào post_type là tên của cpt :  property,
);
// chạy vòng lặp để hiện danh sách
if($lastest_properties_query->have_posts()) {
   while($lastest_properties_query->have_posts()) {
       $lastest_properties_query->the_post(); // setup biến global cho các hàm template trong vòng lặp
       echo get_the_title(); // in ra tên dự án
   }
}

Câu hỏi thường gặp

Tùy vào mục đích phát triển, CPT có thể khai báo ở Theme hoặc Plugin
Khi bạn cần xây dựng 1 layout riêng cho 1 kiểu bài viết nào đó hoặc landingpage

Trả lời

Chấm điểm bài viết