Hướng dẫn thực hành toàn diện về cách tạo và xuất bản các loại bài viết tùy chỉnh trên WordPress

Đọc trong 3 phút
2026-03-17
2026-06-04
2,443
Tôi kiếm được hoa hồng khi bạn mua sắm thông qua các liên kết dưới đây, mà không phát sinh thêm chi phí nào cho bạn.

WordPress Custom Post Type là gì?

WordPress mặc định cung cấp hai loại nội dung là “Bài viết” (Article) và “Trang” (Page), nhưng điều này thường không đủ khi xây dựng các trang web phức tạp. Để đáp ứng nhu cầu đó, người dùng có thể tạo các loại bài viết tùy chỉnh (Custom Post Type – CPT). CPTĐây là một tính năng cốt lõi của WordPress, cho phép các nhà phát triển tạo ra các loại nội dung mới với cấu trúc dữ liệu độc lập và giao diện quản lý từ xa. Bạn có thể hiểu nó như một “mẫu nội dung” dùng để quản lý những loại thông tin cụ thể.

Ví dụ, một trang web đánh giá phim có thể sử dụng loại bài viết mặc định (“Bài viết”) để đăng tin tức, đồng thời tạo ra một loại bài viết tùy chỉnh có tên là “Phim” để quản lý các thông tin về phim một cách chuyên biệt; mỗi bài viết về phim có thể bao gồm các trường dữ liệu đặc thù như đạo diễn, diễn viên chính, điểm đánh giá, v.v. Một trang web thương mại điện tử có thể tạo loại bài viết “Sản phẩm”, trong khi một trang web trường học có thể tạo loại bài viết “Khóa học” hoặc “Giáo viên”. Bằng cách sử dụng các loại bài viết này, người dùng có thể tổ chức và truy cập thông tin một cách dễ d CPTCác loại nội dung khác nhau được phân tách một cách rõ ràng, giúp quản lý dữ liệu trở nên hiệu quả hơn; đồng thời tạo nền tảng vững chắc cho việc tùy chỉnh mẫu và mở rộng chức năng trong tương lai.

Làm thế nào để tạo loại bài viết tùy chỉnh?

Trong WordPress, có hai cách chính để tạo loại bài viết tùy chỉnh: đăng ký bằng mã nguồn và sử dụng plugin. Đối với các nhà phát triển, việc nắm vững cách đăng ký bằng mã nguồn là rất quan trọng, bởi vì nó mang lại tính linh hoạt và khả năng kiểm soát cao hơn, đồng thời giúp dễ dàng quản lý các phiên bản trong các chủ đề (theme) hoặc plugin tùy chỉnh.

Đọc thêm Nắm vững toàn diện loại bài đăng tùy chỉnh WordPress: Từ tạo mới đến thực hành ứng dụng nâng cao

Đăng ký loại bài viết tùy chỉnh thông qua mã nguồn

Cách tiếp cận chuẩn nhất và được khuyến nghị nhất là trong phạm vi chủ đề (theme)… functions.php Sử dụng trong tệp tin hoặc một plugin chức năng độc lập. register_post_type Hàm được đăng ký. Hàm này nhận hai tham số: mã định danh (slug) của loại bài viết tùy chỉnh và một mảng chứa tất cả các tham số cần thiết.

UltaHost – Nhà cung cấp dịch vụ máy chủ WordPress chuyên nghiệp
Bảo đảm hoàn tiền trong 30 ngày, băng thông và cơ sở dữ liệu không giới hạn, bảo vệ DDoS miễn phí, mua 3 năm ưu đãi 50%

Dưới đây là một ví dụ cơ bản về cách tạo một loại bài viết tùy chỉnh có tên “Phim”:

function create_movie_post_type() {
    $labels = array(
        'name'               => '电影',
        'singular_name'      => '电影',
        'menu_name'          => '电影管理',
        'add_new_item'       => '添加新电影',
        'edit_item'          => '编辑电影',
        'view_item'          => '查看电影',
    );
    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'movie' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-video-alt',
        'supports'           => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
    );
    register_post_type( 'movie', $args );
}
add_action( 'init', 'create_movie_post_type' );

Đoạn mã này thông qua add_action Các hook được thực thi khi WordPress được khởi tạo (initiated). create_movie_post_type Hàm. Bên trong hàm, có định nghĩa các thẻ hiển thị (display tags). $labels Và các tham số cốt lõi $argsCác tham số quan trọng bao gồm:public Kiểm soát việc hiển thị nội dung ở phía sau nền (background) hay phía trước màn hình (foreground).rewrite Định nghĩa quy tắc đổi địa chỉ URL: Khi truy cập vào liên kết của một bộ phim cụ thể, hệ thống sẽ tự động thay đổi địa chỉ URL để trỏ đến trang thông tin chi tiết về bộ phim đó. yoursite.com/movie/some-moviehas_archive Quyết định xem có nên tạo trang lưu trữ (archive page) hay không… yoursite.com/movie/);supports Mảng xác định các tính năng được hỗ trợ bởi loại nội dung đó, chẳng hạn như tiêu đề, trình soạn thảo, hình ảnh nổi bật, v.v.

Sử dụng plugin để tạo loại bài viết tùy chỉnh

Đối với những người không quen với mã nguồn, các plugin là lựa chọn tuyệt vời để bắt đầu sử dụng nhanh chóng. Custom Post Type UI và Toolset Types là hai plugin rất phổ biến. Chúng cung cấp giao diện người dùng trực quan, cho phép bạn định nghĩa các loại bài viết (post types) bằng cách đơn giản là chọn các tùy chọn cần thiết và điền vào các biểu mẫu. CPT Các thuộc tính khác nhau của nó, chẳng hạn như nhãn (labels), mức độ công khai (publicity), các tính năng được hỗ trợ (supported features), v.v.

Việc sử dụng các plugin để tạo nội dung là một phương pháp đơn giản và nhanh chóng, tuy nhiên thường sẽ dẫn đến việc tăng lượng truy vấn vào cơ sở dữ liệu, và cấu hình của chúng phụ thuộc vào chính plugin đó. Khi di chuyển trang web sang máy chủ khác hoặc thực hiện các cập nhật lớn, có thể cần thêm các bước để đảm bảo rằng các thiết lập cho các loại bài viết tùy chỉnh vẫn được giữ nguyên. Do đó, đối với môi trường sản xuất hoặc các dự án cần được bảo trì lâu dài, việc sử dụng cách thức đăng ký mã nguồn (code registration) thường là lựa chọn tốt hơn.

Đọc thêm Hướng dẫn phát triển chủ đề WordPress: Xây dựng chủ đề tùy chỉnh hiệu suất cao từ con số không

Thêm trường tùy chỉnh cho loại bài viết tùy chỉnh

Các loại bài viết tùy chỉnh (Custom Article Types) chỉ cung cấp một khung cấu cơ bản để lưu trữ thông tin. Để lưu trữ những dữ liệu đặc thù (chẳng hạn như “Ngày phát hành” hoặc “Đạo diễn” của một bộ phim), bạn cần sử dụng các trường tùy chỉnh (Custom Fields) hoặc các công cụ quản lý thông tin phức tạp hơn như các “Meta Boxes”. WordPress có sẵn bảng điều khiển “Trường tùy chỉnh” (Custom Fields) tích hợp sẵn, nhưng giao diện của nó khá đơn giản và chức năng hạn chế, không thích hợp cho người biên tập nội dung.

Sử dụng plugin cho các trường tùy chỉnh nâng cao

Advanced Custom Fields (ACC) là tiêu chuẩn trong ngành dành cho việc quản lý các trường dữ liệu tùy chỉnh. Công cụ này cho phép bạn thiết lập các trường dữ liệu một cách trực quan, thông qua giao diện đồ họa, cho nhiều loại bài viết khác nhau (bao gồm cả những bài viết do bạn tạo ra). CPTTạo ra các loại nhóm trường khác nhau, chẳng hạn như văn bản, hình ảnh, ô chọn, mối quan hệ liên kết, v.v.

Ví dụ, đối với từ “phim ảnh” CPT Hãy tạo một nhóm trường bao gồm các trường “Đạo diễn”, “Diễn viên chính” và “Năm phát hành”. Sau khi cài đặt và kích hoạt plugin ACF, hãy truy cập trang cấu hình của nó, tạo một nhóm trường mới, và thiết lập quy tắc vị trí cho nhóm này là “Loại bài viết bằng với ”Phim“”. Tiếp theo, bạn có thể thêm từng trường vào nhóm trường vừa tạo: “Đạo diễn” (trường văn bản), “Diễn viên chính” (trường vùng văn bản) và “Năm phát hành” (trường số). Sau khi lưu các thay đổi, khi bạn chỉnh sửa nội dung về phim ở phía backend, bạn sẽ thấy các ô nhập trực quan này.

Hosting.com - lưu trữ chia sẻ
Hiệu năng cao, được trang bị CPU AMD EPYC, lưu trữ SSD NVMe và LiteSpeed, hỗ trợ chuyên gia nội bộ 24 giờ/ngày, các biện pháp bảo mật tiên tiến bao gồm SSL, chống brute force, phần mềm độc hại và bảo vệ DDoS, tiết kiệm tới 73%.

Tạo các phần tử meta tùy chỉnh thông qua mã nguồn

Nếu bạn muốn kiểm soát mọi thứ hoàn toàn thông qua mã nguồn, bạn có thể làm như vậy cho ứng dụng của mình. CPT Phát triển các tiêu đề (meta boxes) tùy chỉnh cho WordPress. Quá trình này bao gồm việc sử dụng API và các hàm lưu trữ (save functions) liên quan đến tiêu đề trong WordPress. Mặc dù lượng mã nguồn khá lớn, nhưng bạn sẽ có được sự tự do tùy chỉnh hoàn toàn.

Dưới đây là một ví dụ đơn giản minh họa cách thêm trường “Đạo diễn” cho dữ liệu về “Phim”:

// 1. 添加元框
function add_movie_director_meta_box() {
    add_meta_box(
        'movie_director_meta_box', // 元框ID
        '导演信息', // 元框标题
        'render_movie_director_meta_box', // 回调函数,用于输出HTML
        'movie', // 目标文章类型
        'side', // 位置
        'default' // 优先级
    );
}
add_action( 'add_meta_boxes', 'add_movie_director_meta_box' );

// 2. 渲染元框内容
function render_movie_director_meta_box( $post ) {
    // 获取已保存的值
    $director = get_post_meta( $post->ID, '_movie_director', true );
    // 添加安全字段
    wp_nonce_field( 'movie_director_nonce_action', 'movie_director_nonce' );
    // 输出HTML
    echo '<label for="movie_director">导演姓名:</label>';
    echo '<input type="text" id="movie_director" name="movie_director" value="' . esc_attr( $director ) . '" style="width:100%;" />';
}

// 3. 保存元框数据
function save_movie_director_meta_data( $post_id ) {
    // 检查nonce、权限、自动保存等
    if ( ! isset( $_POST['movie_director_nonce'] ) || ! wp_verify_nonce( $_POST['movie_director_nonce'], 'movie_director_nonce_action' ) ) {
        return;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
    // 保存数据
    if ( isset( $_POST['movie_director'] ) ) {
        update_post_meta( $post_id, '_movie_director', sanitize_text_field( $_POST['movie_director'] ) );
    }
}
add_action( 'save_post', 'save_movie_director_meta_data' );

Đoạn mã này tạo ra một khung thông tin (meta box) nằm trong thanh bên (sidebar), chứa một trường dùng để nhập tên đạo diễn. Cần lưu ý rằng quá trình lưu dữ liệu tuân theo các quy trình kiểm tra bảo mật tiêu chuẩn của WordPress, bao gồm… nonce Kiểm tra tính hợp lệ của dữ liệu, xác thực quyền truy cập, và ngăn chặn việc xử lý dữ liệu trùng lặp khi tự động lưu. Dữ liệu được lưu sẽ được xử lý theo các quy định đã định. update_post_meta Các hàm được lưu trữ trong… wp_postmeta bảng.

Đọc thêm Hướng dẫn sử dụng plugin WooCommerce: Cẩm nang toàn diện từ cài đặt đến vận hành cửa hàng

Tạo tệp mẫu cho loại bài viết tùy chỉnh

Đã được tạo ra. CPT Sau khi điền đầy nội dung, bạn cần cung cấp một mẫu (template) để hiển thị nội dung đó trên giao diện người dùng (frontend). WordPress sử dụng một hệ thống phân cấp các mẫu, và nó sẽ tự động tìm kiếm tệp mẫu phù hợp để hiển thị nội dung của bạn.

Mẫu cho loại bài viết đơn lẻ

Khi người dùng truy cập vào nội dung của một bộ phim cụ thể (ví dụ: yoursite.com/movie/inceptionKhi cần tìm kiếm các tệp mẫu (template files), WordPress sẽ thực hiện việc tìm kiếm theo thứ tự sau:
1. single-movie.php (Cụ thể nhất)
2. single.php
3. singular.php
4. index.php

Máy chủ chia sẻ của InterServer
Lưu trữ chia sẻ với mức phí $2,50 USD mỗi tháng, giảm giá $0,1 USD trong tháng đầu tiên, mã giảm giá tryinterserver, với 461 ứng dụng đám mây và cài đặt chỉ bằng một cú nhấp chuột.

Do đó, thực hành tốt nhất là tạo một tệp có tên trong thư mục chủ đề (theme folder) của bạn. single-movie.php Đây là tệp tin chứa các thiết lập liên quan đến cách hiển thị phim. Trong tệp này, bạn có thể tùy chỉnh hoàn toàn cách phim được trình bày và sử dụng các trường dữ liệu tùy chỉnh mà bạn đã tạo trước đó.

<?php get_header(); ?>
<article id="post-<?php the_ID(); ?>" no numeric noise key 1008>
    <header class="entry-header">
        <h1 class="entry-title"><?php the_title(); ?></h1>
        <div class="entry-meta">
            <span>导演:</span>
        </div>
    </header>
    <div class="entry-content">
        
        <!-- 显示其他自定义字段,如主演、上映年份 -->
        <p><strong>Diễn viên chính:</strong><?php the_field( 'lead_actor' ); ?></p>
        <p><strong>Năm phát hành:</strong><?php the_field( 'release_year' ); ?></p>
    </div>
</article>
<?php get_footer(); ?>

Nếu sử dụng plugin ACF, bạn có thể tận dụng các tính năng mà nó cung cấp. the_field() Hàm này cho phép xuất giá trị của các trường một cách thuận tiện. Nếu các trường được lưu trữ bằng mã tự định, thì hàm sẽ sử dụng mã đó để truy xuất dữ liệu. get_post_meta() Hàm.

Mẫu trang lưu trữ (Archive Page Template)

Khi người dùng truy cập trang danh sách phim (ví dụ: yoursite.com/movie/Khi bạn thực hiện một thao tác nhất định, WordPress sẽ tìm kiếm các thông tin liên quan.
1. archive-movie.php
2. archive.php
3. index.php

Tạo ra archive-movie.php Bạn có thể sử dụng các vòng lặp trong WordPress để liệt kê tất cả các bộ phim trong tệp đó, đồng thời tùy chỉnh các điều kiện tìm kiếm hoặc áp dụng chức năng phân trang.

<?php get_header(); ?>
<h1>Thư viện phim</h1>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <article>
        <h2><a href="/vi/</?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php the_post_thumbnail( 'medium' ); ?>
        <p>导演:</p>
        <?php the_excerpt(); ?>
    </article>
<?php endwhile; the_posts_navigation(); else : ?>
    <p>Không có phim nào hiện có sẵn.</p>

Tóm lại

Việc nắm vững cách tạo các loại bài viết tùy chỉnh (custom post types) trong WordPress là bước then chốt để thoát khỏi hình thức blog đơn giản và xây dựng những trang web hiện đại với nhiều tính năng và cấu trúc rõ ràng. Bắt đầu từ việc sử dụng… register_post_type Quá trình bắt đầu với việc đăng ký mã nguồn của hàm, tiếp theo là thêm các trường đặc biệt thông qua plugin ACF hoặc các ô thông tin tùy chỉnh, và cuối cùng là tạo ra các thành phần riêng biệt theo cấu trúc của mẫu (template hierarchy). single-{cpt}.phparchive-{cpt}.php Tệp mẫu (template file); toàn bộ quá trình này tạo nên một thực thể hoàn chỉnh (a complete entity). CPT Phát triển quy trình làm việc (development workflow).

Thông qua thực hành, chúng ta đã tạo ra một loại nội dung “phim” với menu nền tảng độc lập, các trường dữ liệu riêng biệt và giao diện hiển thị được tùy chỉnh theo yêu cầu. Phương pháp tiếp cận này có thể được áp dụng một cách dễ dàng cho bất kỳ loại nội dung nào khác như “sản phẩm”, “bộ sưu tập tác phẩm”, “sự kiện”, v.v. Việc hiểu rõ và vận dụng những kiến thức này sẽ giúp bạn nâng cao đáng kể kỹ năng lập trình WordPress, từ đó tạo ra những trải nghiệm số hóa thực sự được thiết kế riêng cho người dùng.

FAQ 常见问题

Sự khác biệt giữa “Loại bài viết tùy chỉnh” (Custom Article Types) và “Hệ thống phân loại tùy chỉnh” (Custom Taxonomies) là gì?

Các loại bài viết tùy chỉnh được sử dụng để định nghĩa một loại thực thể nội dung mới, chẳng hạn như “phim” hoặc “sản phẩm”. Các hệ thống phân loại tùy chỉnh (như các thẻ hoặc mở rộng của danh mục phân loại) thì giúp phân loại và sắp xếp nội dung một cách có tổ chức. Một loại bài viết tùy chỉnh có thể được liên kết với nhiều hệ thống phân loại tùy chỉnh khác nhau. Ví dụ, loại bài viết “phim” có thể được liên kết với nhiều thẻ hoặ CPT Có thể liên kết hai hệ thống phân loại tùy chỉnh là “Loại” (hành động, hài kịch) và “Khu vực” (tiếng Trung, Hollywood).

Tôi nên đăng ký CPT (Custom Post Type) trong tệp functions.php của chủ đề hay trong một plugin độc lập?

Điều này phụ thuộc vào mức độ phức tạp của dự án và yêu cầu về khả năng di chuyển (portability). Đối với những thành phần được thiết kế để phục vụ một chủ đề cụ thể một cách chặt chẽ và không thể tái sử dụng được… CPTCó thể đặt nó trong phần tiêu đề (title) của chủ đề. functions.php Đúng vậy. Tuy nhiên, cách thực hiện tốt nhất là tạo ra một plugin chức năng riêng biệt để lưu trữ tất cả mã đăng ký cho các loại bài viết tùy chỉnh và hệ thống phân loại. Nhờ đó, ngay cả khi bạn thay đổi giao diện (theme) của trang web, các loại nội dung và dữ liệu liên quan đến chúng vẫn sẽ được giữ nguyên. Điều này giúp phân tách rõ ràng hơn giữa “chức năng” và “giao diện” của trang web.

Làm thế nào để thay đổi cấu trúc liên kết cố định của một loại bài viết tùy chỉnh hiện có?

Bạn có thể đăng ký tại đây. CPT Thời gian trôi qua… rewrite Các thiết lập thông số cũng có thể được thực hiện sau khi đăng ký. register_post_type_args Bạn cần thực hiện thay đổi trên bộ lọc (filter). Sau khi thay đổi xong, hãy truy cập trang “Cài đặt” -> “Liên kết cố định” (Settings -> Fixed Links) trong giao diện quản trị WordPress, sau đó nhấp vào nút “Lưu thay đổi” (Save Changes) một lần để cập nhật các quy tắc định tuyến (routing rules). Nếu không làm như vậy, cấu trúc liên kết mới có thể sẽ không được áp dụng.

Tại sao tôi không thể thấy các loại bài viết tùy chỉnh mà tôi đã tạo ở giao diện người dùng?

Điều này thường xảy ra do cài đặt các tham số đăng ký không đúng cách. Vui lòng kiểm tra hàm đăng ký trước tiên. $args in the array 'public''publicly_queryable' Đã chưa thiết lập tất cả các tham số chưa? trueThứ hai, hãy đảm bảo rằng… 'show_ui''show_in_nav_menus' Và cũng vậy… trueCuối cùng, hãy kiểm tra tệp tin mẫu (template file).single-{cpt}.phparchive-{cpt}.phpLiệu tệp tin có được tạo ra đúng cách và nằm trong thư mục gốc của chủ đề sự kiện (activity theme) hay không?