Menu

Hướng dẫn custom post type trong wordpress từ a đến z

Trong hệ sinh thái phát triển web hiện nay, custom post type trong WordPress được coi là chìa khóa vàng mở ra khả năng tùy biến vô hạn cho mọi loại website. Nếu như trước đây, người ta chỉ biết đến nền tảng này với vai trò là một trang blog đơn giản, thì sự ra đời của tính năng này đã biến nó thành một hệ quản trị nội dung (CMS) thực thụ. Việc nắm vững cách triển khai custom post type không chỉ giúp bạn quản lý dữ liệu một cách khoa học mà còn nâng tầm sự chuyên nghiệp cho dự án của mình.

Tại sao chúng ta lại cần đến custom post type? Hãy tưởng tượng bạn đang xây dựng một website về bất động sản. Nếu bạn cố gắng nhồi nhét thông tin về căn hộ, biệt thự vào phần “Bài viết” (Posts) mặc định, dữ liệu của bạn sẽ nhanh chóng trở nên hỗn loạn. Với custom post type, bạn có thể tách biệt hoàn toàn các thực thể này, giúp cấu trúc cơ sở dữ liệu rõ ràng và tối ưu SEO tốt hơn.

Custom post type trong WordPress là gì?

Về cơ bản, custom post type trong WordPress là một loại nội dung do người dùng tự định nghĩa, khác với các loại mặc định như Posts (Bài viết), Pages (Trang), hay Attachments (Tệp tin đính kèm). Khi bạn đăng ký một loại post mới, nó sẽ xuất hiện như một menu riêng biệt trên thanh quản trị phía bên trái, cho phép bạn thêm, sửa và xóa nội dung đó một cách độc lập.

Tính năng này cực kỳ quan trọng đối với các website đòi hỏi sự phân loại nội dung phức tạp. Ví dụ, một trang web giáo dục sẽ cần có khu vực dành riêng cho “Khóa học”, một trang web doanh nghiệp sẽ cần mục “Dịch vụ” hoặc “Dự án”. Việc tạo ra các khu vực chuyên biệt như vậy được gọi là khởi tạo custom post type. WordPress cung cấp cho chúng ta hệ thống hàm API vô cùng mạnh mẽ để thực hiện điều này mà không cần can thiệp quá sâu vào mã nguồn lõi.

Giao diện quản trị chuyên nghiệp sau khi cấu hình custom post type - Hướng dẫn custom post type trong wordpress từ a đến z
Giao diện quản trị chuyên nghiệp sau khi cấu hình custom post type

Cách tạo custom post type trong WordPress bằng code thủ công

Để tạo custom post type trong WordPress, cách bền vững nhất là sử dụng mã nguồn trong file functions.php của theme hoặc xây dựng một plugin riêng. Việc này giúp bạn hoàn toàn kiểm soát các tham số và tính năng của nội dung mới. Dưới đây là đoạn mã tiêu chuẩn để khởi tạo một loại bài viết mới có tên là Sản phẩm.

Cú pháp đăng ký chi tiết

Bạn hãy sao chép đoạn code sau và dán vào cuối file functions.php của theme đang kích hoạt. Hãy lưu ý rằng việc thay đổi mã nguồn cần được thực hiện cẩn thận để tránh gây lỗi website.

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' => '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' => 'dashicons-cart', //Đườ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
}
add_action('init', 'tao_custom_post_type');

Phân tích các tham số quan trọng

  • labels: Chứa tất cả các nhãn hiển thị trong giao diện admin. Việc tùy chỉnh nhãn giúp người quản trị dễ dàng nhận diện chức năng của khu vực đó.
  • supports: Đây là nơi bạn khai báo các tính năng mà custom post type sẽ hỗ trợ như: tiêu đề, nội dung, ảnh đại diện (thumbnail), trích dẫn (excerpt).
  • hierarchical: Nếu đặt là false, nội dung sẽ hoạt động giống như bài viết thông thường. Nếu đặt là true, nó sẽ có tính phân cấp cha-con giống như trang (Page).
  • menu_icon: Bạn có thể sử dụng các icon mặc định của WordPress (Dashicons) hoặc cung cấp đường dẫn đến icon riêng của mình.
  • show_in_rest: Tham số này cực kỳ quan trọng nếu bạn muốn sử dụng trình soạn thảo Block Editor (Gutenberg) thay vì trình soạn thảo cổ điển Classic Editor.
Lập trình viên đang thực hiện cấu hình register_post_type chuyên sâu - Hướng dẫn custom post type trong wordpress từ a đến z
Lập trình viên đang thực hiện cấu hình register_post_type chuyên sâu

Các lưu ý về kỹ thuật khi làm việc với custom post type

Khi làm việc với custom post type, một lỗi phổ biến mà các lập trình viên hay gặp phải chính là lỗi 404 khi truy cập vào link bài viết mới. Điều này xảy ra do cấu trúc đường dẫn (Permalinks) chưa được cập nhật. Để xử lý, bạn chỉ cần truy cập vào Cài đặt -> Đường dẫn tĩnh và nhấn Lưu thay đổi để hệ thống làm mới lại quy tắc rewrite.

Ngoài ra, bạn nên cân nhắc việc tách biệt logic tạo post type ra khỏi theme. Nếu bạn thay đổi giao diện, toàn bộ dữ liệu post type trong file functions.php của theme cũ sẽ biến mất trong giao diện admin (mặc dù vẫn tồn tại trong database). Giải pháp tốt nhất là viết một plugin nhỏ hoặc sử dụng các công cụ hỗ trợ để đảm bảo dữ liệu luôn khả dụng. Bạn có thể tham khảo thêm hướng dẫn Viết plugin WordPress với AI hướng dẫn siêu tốc cực đỉnh để học cách tạo plugin chuyên nghiệp.

Để hiểu rõ hơn về cách WordPress xử lý các loại dữ liệu này, bạn cũng nên đọc thêm Tài liệu chính thức về post types từ WordPress.org. Việc kết hợp kiến thức từ nhiều nguồn sẽ giúp bạn có cái nhìn tổng quan và sâu sắc hơn về kiến trúc hệ thống.

Sử dụng plugin để quản lý custom post type nhanh chóng

Nếu bạn không muốn trực tiếp động vào code, có rất nhiều plugin hỗ trợ tạo custom post type trong WordPress một cách trực quan và mạnh mẽ. Đây là lựa chọn tuyệt vời cho các dự án cần triển khai nhanh hoặc dành cho những người mới làm quen với lập trình.

  • Custom Post Type UI (CPT UI): Một trong những plugin phổ biến nhất hiện nay với giao diện dễ sử dụng, cho phép bạn cấu hình đầy đủ các tham số mà không cần viết một dòng code nào.
  • Pods – Custom Content Types and Fields: Không chỉ dừng lại ở việc tạo post type, Pods còn hỗ trợ tạo thêm các trường dữ liệu tùy chỉnh (custom fields) và quản lý mối quan hệ giữa các loại nội dung.
  • Toolset: Một giải pháp cao cấp dành cho những ai muốn xây dựng các website phức tạp với khả năng lọc, tìm kiếm và hiển thị dữ liệu nâng cao ngay từ giao diện quản trị.
Sức mạnh đa năng của WordPress nhờ khả năng tùy biến vô hạn - Hướng dẫn custom post type trong wordpress từ a đến z
Sức mạnh đa năng của WordPress nhờ khả năng tùy biến vô hạn

Cách hiển thị custom post type ra ngoài frontend

Sau khi đã có dữ liệu trong admin, bước tiếp theo là hiển thị chúng ra cho người dùng thấy. Để làm được điều này, bạn cần can thiệp vào file template của theme. WordPress sử dụng hệ thống phân cấp file rất logic để ưu tiên hiển thị custom post type.

Ví dụ, nếu post type của bạn có slug là ‘sanpham’, bạn có thể tạo file single-sanpham.php để định dạng trang chi tiết sản phẩm và archive-sanpham.php cho trang danh sách. Ngoài ra, bạn có thể sử dụng lớp WP_Query để lấy dữ liệu ở bất kỳ đâu trên website:

<?php 
  $args = array(
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'post_type'      => 'sanpham'
  );
  $the_query = new WP_Query( $args );
?>
<?php if( $the_query->have_posts() ): ?>
<?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
  // Thông tin cần lấy của 1 bài viết
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_query(); ?>

Tổng kết về sức mạnh của custom post type

Có thể khẳng định rằng, custom post type trong WordPress chính là linh hồn của các dự án website chuyên nghiệp. Nó biến một nền tảng viết blog đơn thuần trở thành một cỗ máy CMS linh hoạt, có khả năng đáp ứng mọi yêu cầu từ thương mại điện tử, quản lý nhân sự đến hệ thống booking phức tạp.

Việc làm chủ kỹ thuật này đòi hỏi sự kiên trì và thực hành thường xuyên qua các dự án thực tế. Hy vọng rằng qua bài viết này, bạn đã có cái nhìn tổng quan và nắm bắt được cách thức triển khai custom post type một cách hiệu quả nhất. Hãy bắt đầu áp dụng ngay vào dự án của mình để thấy được sự khác biệt vượt trội mà nó mang lại. Chúc bạn thành công trên con đường trở thành một chuyên gia WordPress thực thụ!

Giải đáp thắc mắc về Custom Post Type trong WordPress

Custom post type trong WordPress là gì?

Đây là loại nội dung do người dùng tự định nghĩa, cho phép tách biệt các thực thể dữ liệu khác nhau như Sản phẩm, Khóa học, hay Dự án ra khỏi mục Bài viết (Posts) mặc định.

Tại sao nên dùng custom post type thay vì dùng chuyên mục (Categories)?

Custom post type giúp quản lý dữ liệu chuyên nghiệp hơn, cho phép tùy chỉnh giao diện quản trị riêng, hỗ trợ các trường dữ liệu đặc thù và tối ưu cấu trúc SEO cho từng loại nội dung.

Làm thế nào để khắc phục lỗi 404 khi truy cập vào link custom post type?

Bạn chỉ cần truy cập vào Cài đặt -> Đường dẫn tĩnh (Permalinks) trong trang quản trị WordPress và nhấn ‘Lưu thay đổi’ để hệ thống làm mới lại quy tắc rewrite đường dẫn.

Nên đặt code tạo custom post type ở đâu để an toàn nhất?

Bạn nên viết một plugin riêng hoặc sử dụng plugin hỗ trợ thay vì dán vào file functions.php của theme để dữ liệu không bị mất khi bạn thay đổi giao diện (theme) mới.

Làm sao để kích hoạt trình soạn thảo Block Editor (Gutenberg) cho custom post type?

Trong mảng tham số $args khi đăng ký hàm register_post_type, bạn cần thiết lập giá trị ‘show_in_rest’ => true.

Những plugin nào hỗ trợ tạo custom post type tốt nhất hiện nay?

Các lựa chọn hàng đầu bao gồm Custom Post Type UI (CPT UI) để cấu hình nhanh, Pods để quản lý trường dữ liệu, hoặc Toolset cho các yêu cầu hiển thị phức tạp.

Làm thế nào để hiển thị danh sách nội dung của custom post type ra website?

Bạn có thể tạo file template archive-{slug}.php trong theme hoặc sử dụng lớp WP_Query với tham số ‘post_type’ tương ứng để lấy dữ liệu và hiển thị bằng vòng lặp.

Custom post type có thể phân cấp cha-con giống như Trang (Page) không?

Có, bạn chỉ cần đặt tham số ‘hierarchical’ => true trong phần cấu hình của custom post type để cho phép tạo các bài viết cấp cha và cấp con.

Bài trước WordPress Template Hierarchy chi tiết từ A–Z Bài tiếp theo Custom field trong wordpress và Metabox

Đánh giá từ khách hàng

Tổng hợp trải nghiệm thực tế từ khách đã lưu trú.

5,0 /5

Tuyệt vời

9 đánh giá

Tuyệt vời
9
Rất tốt
0
Trung bình
0
Tạm được
0
Tệ
0
Chất lượng nội dung
5,0
Áp dụng thực tế
5,0
Trình bày bài viết
5,0
Giá trị kiến thức
5,0
BD

Bùi Tiến Dũng

Đã đánh giá vào 12/02/2026

5,0 /5

Thông tin về file single-{slug}.php và archive-{slug}.php rất đắt giá. Nhiều bên chỉ dạy tạo trong admin thôi chứ không chỉ cách custom giao diện ngoài trang chủ. Bài viết này thực sự giúp mình giải quyết được bài toán hiển thị danh mục sản phẩm theo ý muốn. 5 sao cho chất lượng!

HM

Hoàng Ngọc Mai

Đã đánh giá vào 12/02/2026

5,0 /5

Mình là người mới tập tành làm web nên đọc phần code hơi run, nhưng nhờ bài viết giới thiệu thêm mấy plugin như CPT UI nên mình đã làm được. WordPress đúng là mạnh mẽ thật, biến hóa kiểu gì cũng được.

NK

Ngô Quốc Khánh

Đã đánh giá vào 12/02/2026

5,0 /5

Hướng dẫn quá đầy đủ từ code tay đến plugin. Mình đã thử copy đoạn code mẫu vào file functions.php và chạy rất mượt. Cái icon Dashicons-cart nhìn cũng rất hợp với mục sản phẩm mình đang làm. Cảm ơn bạn vì chia sẻ hữu ích!

ĐH

Đặng Văn Hùng

Đã đánh giá vào 12/02/2026

5,0 /5

Phần hướng dẫn hiển thị ra frontend bằng WP_Query rất dễ hiểu. Tuy nhiên, nếu mình muốn tạo thêm các bộ lọc (filter) nâng cao cho cái Custom Post Type này thì mình nên dùng thêm plugin nào là tối ưu nhất vậy admin? Pods hay Toolset ổn hơn ạ?

VY

Vũ Hải Yến

Đã đánh giá vào 12/02/2026

5,0 /5

Một bài viết rất có tâm! Đặc biệt là phần nhắc nhở về việc tách biệt logic ra khỏi theme. Trước đây mình từng bị mất hết mục sản phẩm khi đổi giao diện web cho khách, lúc đó mới tá hỏa. Hy vọng các bạn mới học WordPress sẽ đọc được bài này sớm để không mắc lỗi như mình.

PB

Phạm Gia Bảo

Đã đánh giá vào 12/02/2026

5,0 /5

Code chuẩn và sạch. Mình rất thích phần giải thích về tham số 'show_in_rest'. Trước đây mình cứ thắc mắc tại sao tạo CPT xong nó không hiện trình soạn thảo Gutenberg mà cứ ra bản Classic cũ kỹ, hóa ra là thiếu dòng này. Note lại ngay để dùng cho các dự án sau.

LL

Lê Hoàng Long

Đã đánh giá vào 12/02/2026

5,0 /5

Mình đang làm website bất động sản và gặp đúng vấn đề nhồi nhét thông tin vào phần 'Bài viết' mặc định như bạn nói. Sau khi áp dụng tạo CPT riêng cho 'Căn hộ' và 'Biệt thự' theo code mẫu trong bài, giao diện quản trị nhìn chuyên nghiệp và khoa học hơn hẳn. Cảm ơn team rất nhiều!

NA

Nguyễn Thị Minh Anh

Đã đánh giá vào 12/02/2026

5,0 /5

Bài viết hướng dẫn rất chi tiết ạ. Cho mình hỏi thêm một chút là nếu mình dùng plugin CPT UI để tạo cho nhanh, thì sau này khi gỡ plugin đó đi thì các bài viết mình đã đăng trong custom post type đó có bị mất hoàn toàn trong database không admin?

TT

Trần Thanh Tùng

Đã đánh giá vào 12/02/2026

5,0 /5

Đúng là cứu cánh! Mình vừa thực hành tạo CPT xong mà cứ bị lỗi 404 khi bấm vào xem chi tiết bài viết, loay hoay mãi không hiểu tại sao. Đọc bài này mới biết là do chưa cập nhật lại Đường dẫn tĩnh (Permalinks). Cảm ơn tác giả đã nhắc đến chi tiết nhỏ nhưng cực kỳ quan trọng này nhé!

Viết đánh giá của bạn

Vui lòng đăng nhập để gửi đánh giá.
Chất lượng nội dung
Áp dụng thực tế
Trình bày bài viết
Giá trị kiến thức

Tối đa 5 ảnh, mỗi ảnh không quá 5MB.

    Tìm kiếm... Ctrl+K

    Kira ChatBox - Trợ lý AI