Bạn đang tìm cách tạo custom post type wordpress code để mở rộng cấu trúc website mà không muốn phụ thuộc vào plugin? Việc tự code không chỉ mang lại sự linh hoạt tuyệt đối mà còn giúp tối ưu hóa hiệu suất đáng kể. Bài viết này từ Phạm Hải: Blog cá nhân sẽ cung cấp ví dụ thực tế, giải thích các tham số quan trọng và hướng dẫn hiển thị ra frontend một cách chuyên nghiệp nhất, dựa trên các tiêu chuẩn lập trình mới nhất hiện nay.

Tại sao nên tạo Custom Post Type bằng code thay vì dùng plugin?
Tự tạo CPT bằng code giúp bạn kiểm soát hoàn toàn tính năng, giảm dung lượng database và tránh xung đột so với việc cài đặt các plugin nặng nề.
Toàn quyền kiểm soát và tùy biến không giới hạn
Khi áp dụng hướng dẫn tạo custom post type wordpress không dùng plugin, bạn làm chủ hoàn toàn mã nguồn PHP của mình. Thay vì bị giới hạn bởi các tùy chọn có sẵn trên giao diện của một công cụ bên thứ ba, bạn có thể tự do can thiệp sâu vào hệ thống. Việc sử dụng code cho phép bạn dễ dàng thêm, bớt các tính năng thông qua việc cấu hình mảng $args một cách chính xác theo logic nghiệp vụ riêng của dự án.
Tối ưu hiệu suất và giảm tải cho website
Các plugin tạo CPT phổ biến như CPT UI hay Toolset rất tiện lợi, nhưng chúng thường tải thêm các file CSS, JavaScript và thực thi các truy vấn (query) không thực sự cần thiết vào database. Bằng cách tự viết code, bạn góp phần tối ưu hóa hiệu suất tối đa cho website. Trang web của bạn sẽ chỉ chạy những đoạn mã thực sự cần thiết, giữ cho hệ thống luôn nhẹ nhàng và hỗ trợ tăng tốc độ tải trang.
Bảo mật tốt hơn và không phụ thuộc vào bên thứ ba
Việc giảm bớt số lượng plugin đồng nghĩa với việc bạn đang thu hẹp bề mặt tấn công của website. Mã nguồn do chính bạn kiểm soát và viết ra sẽ an toàn hơn trước các đợt quét lỗ hổng tự động. Hơn nữa, bạn sẽ không bao giờ phải lo lắng về việc một plugin ngừng hỗ trợ cập nhật hoặc xảy ra xung đột với phiên bản WordPress mới.
Hướng dẫn tạo Custom Post Type WordPress bằng code (Ví dụ thực tế)

Để tạo CPT, bạn cần sử dụng hàm register_post_type kết hợp với hook add_action('init') và đặt đoạn mã PHP vào đúng vị trí trong hệ thống theme hoặc plugin.
Bước 1: Xác định nhu cầu và chuẩn bị các thông tin cần thiết
Trước khi bắt tay vào cách tạo custom post type wordpress bằng code, hãy xác định rõ loại nội dung bạn muốn thêm. Đó có thể là “Dự án”, “Sản phẩm”, “Khóa học” hay “Sự kiện”. Bạn cần chuẩn bị sẵn tên định danh (thường gọi là slug), các nhãn hiển thị trong admin menu (labels) và các tính năng mặc định mà bài viết đó sẽ hỗ trợ (supports).
Bước 2: Đăng ký Custom Post Type vào file functions.php
Cách nhanh nhất để bắt đầu là đăng ký custom post type vào functions.php. Tại Phạm Hải: Blog cá nhân, chúng tôi luôn khuyến nghị bạn sử dụng child theme để thực hiện việc này. Nếu bạn viết thẳng vào theme gốc, toàn bộ đoạn code sẽ bị xóa sạch khi bạn cập nhật theme lên phiên bản mới.
Ví dụ code tạo Custom Post Type “Dự án” hoàn chỉnh
Dưới đây là ví dụ code tạo custom post type wordpress cho loại bài đăng “Dự án” (Projects). Bạn có thể sao chép đoạn code PHP dưới đây và dán vào cuối file functions.php của child theme:
// Khởi tạo hàm đăng ký CPT
function phamhai_create_project_cpt() {
// 1. Cấu hình các nhãn hiển thị (Labels)
$labels = array(
'name' => _x( 'Dự án', 'Post type general name', 'textdomain' ),
'singular_name' => _x( 'Dự án', 'Post type singular name', 'textdomain' ),
'menu_name' => _x( 'Các Dự án', 'Admin Menu text', 'textdomain' ),
'add_new' => __( 'Thêm Dự án mới', 'textdomain' ),
'add_new_item' => __( 'Thêm Dự án', 'textdomain' ),
'edit_item' => __( 'Sửa Dự án', 'textdomain' ),
'all_items' => __( 'Tất cả Dự án', 'textdomain' ),
);
// 2. Cấu hình các tham số (Args)
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'du-an' ), // Đường dẫn tĩnh
'capability_type' => 'post',
'has_archive' => true, // Cho phép có trang lưu trữ
'hierarchical' => false,
'menu_position' => 5,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ),
'menu_icon' => 'dashicons-portfolio', // Icon hiển thị
'show_in_rest' => true, // Kích hoạt Gutenberg editor
);
// 3. Thực thi hàm register_post_type
register_post_type( 'project', $args );
}
// 4. Móc nối hàm vào hook 'init'
add_action( 'init', 'phamhai_create_project_cpt' );
Giải mã các tham số quan trọng trong hàm register_post_type
Hàm register_post_type nhận vào hai tham số chính: tên định danh và mảng $args. Việc hiểu rõ các tham số registerposttype wordpress là chìa khóa để bạn tùy biến hệ thống theo ý muốn.
Tham số ‘labels’: Tùy chỉnh tên hiển thị trong trang quản trị
Mảng labels quyết định cách CPT của bạn giao tiếp với người dùng trên giao diện admin menu. Nó bao gồm các chuỗi văn bản cho nút “Thêm mới”, “Chỉnh sửa”, “Tất cả bài viết”, v.v. Việc cấu hình chi tiết labels giúp khu vực quản trị trở nên thân thiện và chuyên nghiệp hơn, đặc biệt khi bàn giao website cho khách hàng.
Tham số ‘public’, ‘has_archive’, ‘rewrite’: Cấu hình hiển thị ngoài frontend
Đây là bộ ba tham số cốt lõi quyết định việc nội dung của bạn có được xuất hiện ra bên ngoài hay không:
public: Đặt làtrueđể CPT có thể truy cập được cả ở frontend và backend.has_archive: Cấp phép tạo trang lưu trữ (archive page). Nếutrue, bạn có thể truy cập danh sách dự án qua đường dẫndomain.com/du-an/.rewrite: Cho phép bạn định dạng lại đường dẫn tĩnh. Thay vì dùng tên gốc làproject, bạn có thể đổislugthànhdu-anđể thân thiện hơn với SEO tại Việt Nam.
Tham số ‘supports’: Xác định các tính năng được hỗ trợ
Tham số supports khai báo các meta box mặc định sẽ xuất hiện trong trình soạn thảo. Bạn có thể truyền vào một mảng bao gồm: title (tiêu đề), editor (trình soạn thảo nội dung), thumbnail (ảnh đại diện). Đặc biệt, việc thêm custom-fields vào mảng này là bước đệm quan trọng để xây dựng custom post type với custom fields chuyên sâu.
Tham số ‘menu_icon’: Thay đổi icon cho Custom Post Type của bạn
Để admin menu trực quan và dễ phân biệt hơn, bạn nên thay đổi biểu tượng mặc định. WordPress cung cấp sẵn bộ thư viện Dashicons. Bạn chỉ cần tìm icon ưng ý và truyền tên class (ví dụ: dashicons-portfolio hoặc dashicons-store) vào tham số menu_icon.
Mở rộng tính năng cho Custom Post Type
Để quản lý và tổ chức dữ liệu một cách khoa học, bạn cần kết hợp CPT với taxonomy (phân loại) và các trường dữ liệu tùy chỉnh.
Tạo Custom Taxonomy cho Custom Post Type để phân loại
Tương tự như Category và Tag của Post mặc định, việc tạo custom taxonomy cho custom post type wordpress (ví dụ: “Loại dự án”, “Công nghệ sử dụng”) giúp gom nhóm nội dung hiệu quả. Bạn sẽ sử dụng hàm register_taxonomy() và gắn nó vào CPT thông qua hook init.
| Tham số Taxonomy | Ý nghĩa | Ví dụ áp dụng |
|---|---|---|
hierarchical => true |
Hoạt động giống Category (có cha/con) | Phân loại: Dự án Web, Dự án App |
hierarchical => false |
Hoạt động giống Tag (không có cha/con) | Công nghệ: PHP, ReactJS, Node |
show_admin_column |
Hiển thị cột phân loại ở trang danh sách | Đặt true để dễ quản lý trong admin |
Tích hợp Custom Fields để thêm thông tin chi tiết
Để lưu trữ các dữ liệu đặc thù như “Ngày hoàn thành”, “Ngân sách”, hay “Tên khách hàng”, việc kết hợp custom post type với custom fields là giải pháp tối ưu. Mặc dù WordPress có sẵn custom fields mặc định, nhưng ở góc độ chuyên gia, chúng tôi khuyên bạn nên sử dụng plugin Advanced Custom Fields (ACF) hoặc Meta Box để tạo giao diện nhập liệu trực quan, sau đó dùng code PHP để gọi dữ liệu ra ngoài.
Cách hiển thị Custom Post Type ra ngoài frontend
Để hiển thị custom post type ra ngoài frontend, bạn cần nắm vững Template Hierarchy của WordPress hoặc sử dụng vòng lặp WP_Query tùy chỉnh.
Tạo file template riêng: single-{posttype}.php và archive-{posttype}.php
WordPress tự động nhận diện các file template file theo cấu trúc tên nhất định.
- Để hiển thị chi tiết một bài viết thuộc CPT “project”, bạn hãy tạo file
single-project.php. - Để hiển thị danh sách tất cả các dự án, bạn tạo file
archive-project.php.
Bạn có thể copy nội dung từ filesingle.phpvàarchive.phpcủa theme hiện tại sang các file mới này và tiến hành tùy biến giao diện bằng HTML/CSS.
Sử dụng WP_Query để thêm Custom Post Type vào trang chủ hoặc các trang khác
Cách thêm custom post type vào trang chủ wordpress hoặc bất kỳ một trang (Page) nào khác là khởi tạo một đối tượng WP_Query mới. Dưới đây là đoạn code mẫu để gọi 6 dự án mới nhất:
<?php
$args = array(
'post_type' => 'project', // Gọi đúng tên CPT
'posts_per_page' => 6,
'post_status' => 'publish'
);
$project_query = new WP_Query( $args );
if ( $project_query->have_posts() ) :
echo '<div class="project-grid">';
while ( $project_query->have_posts() ) : $project_query->the_post();
echo '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
// Gọi thêm ảnh đại diện, tóm tắt tại đây
endwhile;
echo '</div>';
wp_reset_postdata(); // Rất quan trọng để reset lại query chính
else :
echo 'Chưa có dự án nào.';
endif;
?>
Tối ưu hiệu suất và các phương pháp hay nhất
Để hệ thống hoạt động ổn định và chuyên nghiệp, bạn cần lưu ý đến cách tổ chức code, xử lý đường dẫn và tránh xung đột dữ liệu.
Chuyển code từ functions.php sang một plugin riêng để dễ quản lý
Mặc dù viết vào functions.php rất nhanh, nhưng tạo custom post type trong plugin riêng mới là tiêu chuẩn thực hành tốt nhất (best practice). Việc này giúp tách biệt dữ liệu (content) khỏi giao diện (theme). Khi bạn đổi theme mới, toàn bộ dữ liệu CPT đã tạo vẫn được giữ nguyên vẹn trong admin menu mà không bị mất đi. Bạn chỉ cần tạo một thư mục trong wp-content/plugins, tạo một file PHP và thêm phần header chuẩn của plugin WordPress.
Lưu ý về việc đặt tên và “slug” để tránh xung đột
Khi khai báo tên định danh cho $post_type, độ dài tối đa cho phép là 20 ký tự, không được chứa khoảng trắng hay chữ in hoa. Một mẹo nhỏ là hãy luôn thêm tiền tố (prefix) vào tên CPT (ví dụ: ph_project thay vì chỉ dùng project) để tránh xung đột với database của các plugin khác hoặc các tính năng cốt lõi của WordPress.
Cập nhật lại Permalinks sau khi đăng ký hoặc thay đổi Custom Post Type
Lỗi phổ biến nhất sau khi tạo CPT là gặp thông báo “Lỗi 404 Not Found” khi người dùng click xem chi tiết bài viết. Để khắc phục, bạn bắt buộc phải cập nhật lại permalinks. Rất đơn giản, bạn chỉ cần truy cập vào Cài đặt > Đường dẫn tĩnh (Settings > Permalinks) trong admin menu và nhấn nút “Lưu thay đổi”. Hành động này sẽ ra lệnh cho WordPress flush (làm mới) lại toàn bộ rewrite rules.
Việc tạo custom post type wordpress code thực sự mang lại sự linh hoạt và hiệu suất vượt trội so với việc lạm dụng cài đặt quá nhiều plugin. Bằng cách nắm vững hàm register_post_type, hiểu rõ các tham số cấu hình và cách sử dụng các hook liên quan, bạn có thể xây dựng một cấu trúc dữ liệu tùy chỉnh chuyên nghiệp. Tại Phạm Hải: Blog cá nhân, chúng tôi tin rằng việc làm chủ kỹ năng tự code CPT sẽ giúp website của bạn luôn gọn nhẹ, dễ bảo trì và đáp ứng chính xác mọi yêu cầu phức tạp của các dự án web hiện đại trong năm 2026 này.
Nếu bạn gặp bất kỳ khó khăn nào trong quá trình triển khai đoạn code trên hoặc cần tư vấn sâu hơn về cách hiển thị dữ liệu WordPress, đừng ngần ngại để lại bình luận bên dưới. Phạm Hải: Blog cá nhân luôn sẵn sàng hỗ trợ bạn!
Lưu ý: Thông tin trong bài viết này chỉ mang tính chất tham khảo. Để có được lời khuyên tốt nhất, vui lòng liên hệ trực tiếp với chúng tôi để được tư vấn cụ thể dựa trên nhu cầu thực tế của bạn.