Tạo Custom Post Type trong WordPress: Hướng dẫn từ A-Z (Plugin & Code)

Tạo Taxonomy tùy chỉnh với CPT UI

Bạn có bao giờ cảm thấy website WordPress của mình cần nhiều hơn chỉ là “Bài viết” và “Trang” không? Có lẽ bạn muốn tạo một khu vực riêng cho “Dự án,” “Sản phẩm,” “Đánh giá,” “Thành viên đội ngũ,” hay “Công thức nấu ăn”? Đó chính là lúc Custom Post Type (CPT) phát huy tác dụng.

Trong bài hướng dẫn toàn diện này tại axidigi.com, chúng ta sẽ đi sâu vào cách tạo custom post type trong WordPress, một kỹ năng thiết yếu để tùy biến website của bạn. Chúng tôi sẽ trình bày hai cách tiếp cận phổ biến: dùng plugin thân thiện với người mới bắt đầu và viết code PHP cho những ai muốn kiểm soát tối đa.

Custom Post Type là gì và Tại sao bạn cần nó?

Mặc định, WordPress cung cấp một số kiểu nội dung (post type) như post (Bài viết), page (Trang), attachment (Tệp đính kèm), revision (Bản sửa đổi), và nav_menu_item (Mục menu). Custom Post Type cho phép bạn định nghĩa các kiểu nội dung mới hoàn toàn tách biệt.

Lợi ích của việc sử dụng Custom Post Type:

  1. Tổ chức nội dung tốt hơn: Tách biệt các loại nội dung khác nhau (ví dụ: giữ blog posts riêng biệt với portfolio projects).
  2. Quản lý dễ dàng: Tạo các menu quản trị riêng cho từng CPT trong Dashboard WordPress.
  3. Giao diện tùy chỉnh: Dễ dàng tạo các mẫu template riêng (ví dụ: single-sanpham.php, archive-duan.php) để hiển thị CPT theo cách bạn muốn.
  4. Thêm trường dữ liệu tùy chỉnh (Custom Fields): Kết hợp CPT với các plugin như Advanced Custom Fields (ACF) để thêm thông tin đặc thù cho từng loại nội dung (ví dụ: giá sản phẩm, ngày hoàn thành dự án, địa chỉ bất động sản).
  5. Cải thiện SEO: Tạo các URL và cấu trúc nội dung rõ ràng, thân thiện với công cụ tìm kiếm hơn cho các loại nội dung cụ thể.

Phương pháp 1: Tạo Custom Post Type bằng Plugin (Dễ dàng & Nhanh chóng)

Đây là cách tiếp cận phổ biến nhất, đặc biệt nếu bạn không quen với việc viết code. Các plugin cung cấp giao diện người dùng trực quan để tạo và quản lý CPT. Plugin được đề xuất hàng đầu là Custom Post Type UI (CPT UI).

Cài đặt Plugin Custom Post Type UI (CPT UI)

  1. Đi tới Trang quản trị WordPress của bạn.
  2. Điều hướng đến Plugin > Cài mới (Plugins > Add New).
  3. Trong ô tìm kiếm, gõ “Custom Post Type UI”.
  4. Tìm plugin của WebDevStudios, nhấp Cài đặt (Install Now) và sau đó Kích hoạt (Activate).

Tạo Custom Post Type đầu tiên với CPT UI

Sau khi kích hoạt, bạn sẽ thấy một mục menu mới tên là CPT UI trong trang quản trị.

  1. Nhấp vào CPT UI > Add/Edit Post Types (Thêm/Sửa loại bài viết).
  2. Điền các thông tin cơ bản:
    • Post Type Slug (Bắt buộc): Đây là định danh duy nhất cho CPT của bạn (ví dụ: sanpham, duan, danhgia). Quan trọng: Chỉ sử dụng chữ thường, không dấu, không khoảng trắng, có thể dùng dấu gạch dưới _ hoặc gạch nối -. Không được dài quá 20 ký tự.
    • Plural Label (Bắt buộc): Tên hiển thị dạng số nhiều (ví dụ: “Sản phẩm”, “Dự án”).
    • Singular Label (Bắt buộc): Tên hiển thị dạng số ít (ví dụ: “Sản phẩm”, “Dự án”).
  3. Nhấp vào nút Add Post Type (Thêm loại bài viết).

Ngay lập tức, bạn sẽ thấy một mục menu mới xuất hiện trong trang quản trị WordPress tương ứng với CPT vừa tạo (ví dụ: “Sản phẩm”).

Cấu hình Các tùy chọn Nâng cao (Labels, Supports, Settings)

CPT UI cung cấp rất nhiều tùy chọn để tinh chỉnh CPT của bạn:

  • Additional Labels: Tùy chỉnh các nhãn hiển thị trong giao diện quản trị (ví dụ: “Thêm sản phẩm mới”, “Chỉnh sửa dự án”). Thường thì CPT UI tự động điền khá tốt, nhưng bạn có thể sửa nếu cần.
  • Settings: Đây là phần quan trọng để cấu hình hành vi của CPT.
    • Public: Chọn True nếu bạn muốn CPT hiển thị công khai trên website và trong kết quả tìm kiếm.
    • Has Archive: Chọn True nếu bạn muốn tạo một trang lưu trữ (archive page) liệt kê tất cả các bài viết thuộc CPT này (ví dụ: yourdomain.com/sanpham/).
    • Hierarchical: Chọn True nếu bạn muốn CPT có cấu trúc cha-con giống như Trang (Pages). Mặc định là False (giống Bài viết).
    • Supports: Chọn các tính năng mà CPT này hỗ trợ:
      • Title: Tiêu đề bài viết.
      • Editor: Trình soạn thảo nội dung (Classic hoặc Gutenberg).
      • Featured Image: Ảnh đại diện.
      • Custom Fields: Hỗ trợ trường tùy chỉnh (quan trọng khi dùng ACF).
      • Excerpt: Đoạn trích.
      • Revisions: Lưu các phiên bản sửa đổi.
      • Author: Hiển thị tác giả.
      • Comments: Cho phép bình luận.
    • Menu Icon: Chọn một biểu tượng Dashicon cho menu CPT trong trang quản trị.
    • Rewrite Slug: Tùy chỉnh đường dẫn URL cho trang lưu trữ và trang chi tiết (nếu bỏ trống, mặc định sẽ dùng Post Type Slug).

Lời khuyên từ chuyên gia: “Khi bắt đầu với CPT UI, hãy tập trung vào Slug, Labels và phần ‘Supports’. Các cài đặt khác bạn có thể tìm hiểu dần. Đừng quên chọn ‘Featured Image’ trong ‘Supports’ nếu bạn muốn dùng ảnh đại diện!” – Nguyễn An, Chuyên gia Phát triển WordPress tại Axidigi.

(Tùy chọn) Tạo Taxonomy tùy chỉnh với CPT UI

Taxonomy giống như Categories (Chuyên mục) và Tags (Thẻ) nhưng dành riêng cho CPT của bạn (ví dụ: “Loại sản phẩm”, “Lĩnh vực dự án”).

  1. Đi tới CPT UI > Add/Edit Taxonomies (Thêm/Sửa Taxonomy).
  2. Điền Taxonomy Slug, Plural Label, Singular Label.
  3. Quan trọng nhất: Trong phần Attach to Post Type, chọn CPT bạn vừa tạo (ví dụ: “Sản phẩm”).
  4. Nhấp Add Taxonomy.

Tạo Taxonomy tùy chỉnh với CPT UITạo Taxonomy tùy chỉnh với CPT UI

Ưu và Nhược điểm của việc dùng Plugin

  • Ưu điểm:
    • Rất dễ sử dụng, không cần biết code.
    • Giao diện trực quan, nhanh chóng tạo CPT và Taxonomy.
    • Quản lý tất cả CPT/Taxonomy tại một nơi.
    • Phù hợp cho người mới bắt đầu hoặc các dự án không yêu cầu tùy chỉnh quá sâu.
  • Nhược điểm:
    • Phụ thuộc vào plugin: Nếu bạn tắt hoặc xóa plugin, CPT sẽ biến mất (dữ liệu vẫn còn trong database nhưng không truy cập được qua WP Admin).
    • Có thể thêm một chút “gánh nặng” (overhead) cho website so với code thuần.
    • Ít linh hoạt hơn so với việc tự viết code cho các trường hợp phức tạp.

Phương pháp 2: Tạo Custom Post Type bằng Code (Linh hoạt & Tối ưu)

Nếu bạn thoải mái với việc chỉnh sửa code PHP hoặc muốn kiểm soát hoàn toàn, phương pháp này là dành cho bạn. Chúng ta sẽ sử dụng hàm register_post_type() của WordPress.

Hiểu về hàm register_post_type()

Hàm này là cốt lõi để đăng ký một CPT mới. Cú pháp cơ bản:

register_post_type( 'ten_post_type', $args );

Trong đó:

  • 'ten_post_type': Là slug của CPT (giống như Post Type Slug trong CPT UI).
  • $args: Là một mảng (array) chứa các tham số cấu hình cho CPT (tương đương các Labels và Settings trong CPT UI).

Nơi đặt Code: functions.php (Theme) hay Plugin tùy chỉnh?

Bạn có thể đặt đoạn code đăng ký CPT vào:

  1. functions.php của Theme: Dễ dàng, nhưng không được khuyến khích cho theme chính. Nếu bạn cập nhật theme, các thay đổi sẽ bị mất. Nếu dùng cách này, luôn sử dụng theme con (child theme).
  2. Plugin tùy chỉnh (Custom Plugin): Đây là cách tốt nhất. Tạo một plugin nhỏ chỉ chứa code đăng ký CPT và các chức năng liên quan. Như vậy, CPT của bạn sẽ độc lập với theme đang sử dụng.

Để tạo plugin tùy chỉnh đơn giản: Tạo một thư mục mới trong wp-content/plugins/ (ví dụ: axidigi-custom-types), bên trong tạo file PHP (ví dụ: axidigi-custom-types.php) với nội dung header plugin cơ bản và code của bạn.

Đoạn Code mẫu tạo Custom Post Type “Sản phẩm”

Dưới đây là ví dụ về cách đăng ký CPT “Sản phẩm” (sanpham) bằng code. Bạn có thể đặt đoạn code này vào functions.php của theme con hoặc plugin tùy chỉnh.

<?php
/**
 * Function to register the 'Sản phẩm' Custom Post Type.
 */
function axidigi_register_sanpham_cpt() {

    $labels = array(
        'name'                  => _x( 'Sản phẩm', 'Post type general name', 'axidigi-textdomain' ),
        'singular_name'         => _x( 'Sản phẩm', 'Post type singular name', 'axidigi-textdomain' ),
        'menu_name'             => _x( 'Sản phẩm', 'Admin Menu text', 'axidigi-textdomain' ),
        'name_admin_bar'        => _x( 'Sản phẩm', 'Add New on Toolbar', 'axidigi-textdomain' ),
        'add_new'               => __( 'Thêm mới', 'axidigi-textdomain' ),
        'add_new_item'          => __( 'Thêm sản phẩm mới', 'axidigi-textdomain' ),
        'new_item'              => __( 'Sản phẩm mới', 'axidigi-textdomain' ),
        'edit_item'             => __( 'Sửa sản phẩm', 'axidigi-textdomain' ),
        'view_item'             => __( 'Xem sản phẩm', 'axidigi-textdomain' ),
        'all_items'             => __( 'Tất cả sản phẩm', 'axidigi-textdomain' ),
        'search_items'          => __( 'Tìm kiếm sản phẩm', 'axidigi-textdomain' ),
        'parent_item_colon'     => __( 'Sản phẩm cha:', 'axidigi-textdomain' ),
        'not_found'             => __( 'Không tìm thấy sản phẩm nào.', 'axidigi-textdomain' ),
        'not_found_in_trash'    => __( 'Không có sản phẩm nào trong thùng rác.', 'axidigi-textdomain' ),
        'featured_image'        => _x( 'Ảnh đại diện sản phẩm', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'axidigi-textdomain' ),
        'set_featured_image'    => _x( 'Đặt ảnh đại diện', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'axidigi-textdomain' ),
        'remove_featured_image' => _x( 'Xóa ảnh đại diện', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'axidigi-textdomain' ),
        'use_featured_image'    => _x( 'Sử dụng làm ảnh đại diện', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'axidigi-textdomain' ),
        'archives'              => _x( 'Lưu trữ sản phẩm', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'axidigi-textdomain' ),
        'insert_into_item'      => _x( 'Chèn vào sản phẩm', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'axidigi-textdomain' ),
        'uploaded_to_this_item' => _x( 'Tải lên sản phẩm này', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'axidigi-textdomain' ),
        'filter_items_list'     => _x( 'Lọc danh sách sản phẩm', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'axidigi-textdomain' ),
        'items_list_navigation' => _x( 'Điều hướng danh sách sản phẩm', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'axidigi-textdomain' ),
        'items_list'            => _x( 'Danh sách sản phẩm', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'axidigi-textdomain' ),
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,  // Hiển thị công khai
        'publicly_queryable' => true,  // Có thể truy vấn công khai
        'show_ui'            => true,  // Hiển thị giao diện quản trị
        'show_in_menu'       => true,  // Hiển thị trên menu quản trị
        'query_var'          => true,  // Cho phép query_var
        'rewrite'            => array( 'slug' => 'san-pham' ), // Đường dẫn URL tùy chỉnh (ví dụ: yourdomain.com/san-pham/ten-san-pham/)
        'capability_type'    => 'post', // Loại quyền hạn (thường là 'post' hoặc 'page')
        'has_archive'        => true,  // Kích hoạt trang lưu trữ (ví dụ: yourdomain.com/san-pham/)
        'hierarchical'       => false, // Không phân cấp (giống Bài viết)
        'menu_position'      => 5,     // Vị trí trên menu quản trị (5 = dưới Bài viết)
        'menu_icon'          => 'dashicons-products', // Biểu tượng menu
        'supports'           => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ), // Các tính năng hỗ trợ
        'show_in_rest'       => true, // Cho phép sử dụng với Gutenberg/REST API
    );

    register_post_type( 'sanpham', $args ); // Đăng ký post type 'sanpham' với các cấu hình $args

}
add_action( 'init', 'axidigi_register_sanpham_cpt' ); // Hook vào 'init' để chạy hàm đăng ký

// Quan trọng: Flush rewrite rules sau khi thêm code này lần đầu
// Đi tới Cài đặt > Đường dẫn tĩnh (Settings > Permalinks) và nhấn nút "Lưu thay đổi" (Save Changes).
// Không cần thay đổi gì, chỉ cần nhấn Lưu để WordPress cập nhật cấu trúc URL.
?>

Giải thích một số tham số $args quan trọng:

  • labels: Mảng chứa các nhãn hiển thị trong WP Admin.
  • public: true để CPT hiển thị công khai.
  • has_archive: true để tạo trang liệt kê tất cả các bài thuộc CPT này. Mặc định slug trang lưu trữ sẽ là slug CPT (sanpham), bạn có thể tùy chỉnh trong rewrite.
  • rewrite: Cho phép tùy chỉnh slug URL. array( 'slug' => 'san-pham' ) sẽ tạo URL dạng yourdomain.com/san-pham/ cho trang lưu trữ và yourdomain.com/san-pham/ten-bai-viet/ cho trang chi tiết.
  • menu_position: Xác định vị trí CPT trên menu quản trị. Xem các giá trị vị trí tại đây.
  • menu_icon: Chọn biểu tượng từ WordPress Dashicons.
  • supports: Mảng liệt kê các tính năng mà trình soạn thảo CPT sẽ hỗ trợ (tiêu đề, nội dung, ảnh đại diện, v.v.).
  • show_in_rest: true là cần thiết nếu bạn muốn sử dụng trình soạn thảo Gutenberg hoặc tương tác qua WordPress REST API.

Trích dẫn từ chuyên gia: “Viết code tạo CPT mang lại sự kiểm soát tuyệt đối. Bạn có thể tối ưu từng chi tiết và không phụ thuộc vào plugin bên thứ ba. Tuy nhiên, hãy chắc chắn bạn hiểu rõ về các tham số của register_post_typeluôn đặt code vào theme con hoặc plugin tùy chỉnh để tránh mất mát khi cập nhật.” – Trần Minh Khang, Lập trình viên WordPress Backend.

(Tùy chọn) Đăng ký Taxonomy tùy chỉnh bằng Code (register_taxonomy())

Tương tự như CPT, bạn có thể đăng ký taxonomy tùy chỉnh bằng hàm register_taxonomy().

<?php
/**
 * Function to register the 'Loại sản phẩm' Taxonomy.
 */
function axidigi_register_loaisanpham_taxonomy() {
    $labels = array(
        'name'              => _x( 'Loại sản phẩm', 'taxonomy general name', 'axidigi-textdomain' ),
        'singular_name'     => _x( 'Loại sản phẩm', 'taxonomy singular name', 'axidigi-textdomain' ),
        'search_items'      => __( 'Tìm kiếm Loại sản phẩm', 'axidigi-textdomain' ),
        'all_items'         => __( 'Tất cả Loại sản phẩm', 'axidigi-textdomain' ),
        'parent_item'       => __( 'Loại sản phẩm cha', 'axidigi-textdomain' ),
        'parent_item_colon' => __( 'Loại sản phẩm cha:', 'axidigi-textdomain' ),
        'edit_item'         => __( 'Sửa Loại sản phẩm', 'axidigi-textdomain' ),
        'update_item'       => __( 'Cập nhật Loại sản phẩm', 'axidigi-textdomain' ),
        'add_new_item'      => __( 'Thêm Loại sản phẩm mới', 'axidigi-textdomain' ),
        'new_item_name'     => __( 'Tên Loại sản phẩm mới', 'axidigi-textdomain' ),
        'menu_name'         => __( 'Loại sản phẩm', 'axidigi-textdomain' ),
    );

    $args = array(
        'hierarchical'      => true, // true = giống Category (có phân cấp), false = giống Tag
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true, // Hiển thị cột taxonomy trong danh sách CPT
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'loai-san-pham' ), // Slug URL cho taxonomy
        'show_in_rest'      => true, // Hỗ trợ REST API
    );

    // Đăng ký taxonomy 'loaisanpham' và gắn vào CPT 'sanpham'
    register_taxonomy( 'loaisanpham', array( 'sanpham' ), $args );
}
add_action( 'init', 'axidigi_register_loaisanpham_taxonomy', 0 );

// Nhớ Flush rewrite rules sau khi thêm code này!
?>

Đừng quên Flush Rewrite Rules bằng cách vào Cài đặt > Đường dẫn tĩnh và nhấn Lưu thay đổi sau khi thêm hoặc sửa code đăng ký CPT/Taxonomy.

Ưu và Nhược điểm của việc dùng Code

  • Ưu điểm:
    • Kiểm soát hoàn toàn mọi khía cạnh của CPT/Taxonomy.
    • Không phụ thuộc vào plugin bên thứ ba.
    • Code thường nhẹ và tối ưu hơn plugin.
    • Phù hợp cho các nhà phát triển, các dự án phức tạp hoặc yêu cầu hiệu suất cao.
    • Dễ dàng tích hợp vào quy trình phát triển theme/plugin.
  • Nhược điểm:
    • Yêu cầu kiến thức về PHP và WordPress API.
    • Dễ gây lỗi nếu viết code sai.
    • Cần quản lý và bảo trì code cẩn thận (đặc biệt khi cập nhật WordPress).
    • Mất thời gian hơn so với việc dùng plugin cho các tác vụ cơ bản.

Plugin hay Code: Nên chọn phương pháp nào?

Việc lựa chọn giữa plugin tạo custom post typecode tạo custom post type phụ thuộc vào nhu cầu và kỹ năng của bạn:

  • Chọn Plugin (như CPT UI) nếu:
    • Bạn là người mới bắt đầu hoặc không muốn đụng đến code.
    • Bạn cần tạo CPT nhanh chóng và dễ dàng.
    • Dự án của bạn không yêu cầu tùy chỉnh quá phức tạp.
  • Chọn Code nếu:
    • Bạn là nhà phát triển hoặc có kiến thức về PHP.
    • Bạn muốn kiểm soát tối đa và tối ưu hóa hiệu suất.
    • Bạn đang xây dựng theme/plugin tùy chỉnh.
    • Bạn không muốn phụ thuộc vào plugin bên thứ ba.

Cách tiếp cận kết hợp: Bạn cũng có thể sử dụng plugin như CPT UI để đăng ký CPT/Taxonomy, sau đó dùng code (hoặc plugin như ACF) để thêm các trường tùy chỉnh (custom fields) phức tạp hơn.

Hiển thị Dữ liệu Custom Post Type trên Giao diện

Việc tạo CPT chỉ là bước đầu. Để hiển thị nội dung này trên website, bạn cần:

  1. Tạo Template Files Tùy chỉnh: WordPress sử dụng hệ thống phân cấp template (template hierarchy). Bạn có thể tạo các file template đặc biệt trong thư mục theme (hoặc theme con) để kiểm soát giao diện CPT:
    • archive-{post_type}.php: Hiển thị trang lưu trữ (ví dụ: archive-sanpham.php).
    • single-{post_type}.php: Hiển thị trang chi tiết của một bài viết CPT (ví dụ: single-sanpham.php).
    • taxonomy-{taxonomy_slug}.php: Hiển thị trang lưu trữ cho taxonomy tùy chỉnh (ví dụ: taxonomy-loaisanpham.php).
  2. Sử dụng Page Builders: Nhiều page builder phổ biến như Elementor Pro, Beaver Themer, hoặc Oxygen Builder cho phép bạn thiết kế trực quan các template này mà không cần code nhiều.
  3. Viết WP_Query Tùy chỉnh: Bạn có thể truy vấn và hiển thị CPT ở bất kỳ đâu trên website bằng cách sử dụng lớp WP_Query trong code PHP của mình.

Đây là một chủ đề lớn, chúng tôi sẽ có bài viết chi tiết hơn về cách hiển thị CPT trên giao diện. Hãy theo dõi liên_kết_nội_bộ_wordpress_liên_quan tại Axidigi.com!

Kết luận

Tạo custom post type trong WordPress mở ra vô vàn khả năng tùy biến website của bạn. Dù bạn chọn sử dụng plugin tiện lợi như CPT UI hay đi sâu vào viết code với register_post_type, việc hiểu và áp dụng CPT sẽ giúp bạn xây dựng những trang web có cấu trúc tốt hơn, dễ quản lý hơn và đáp ứng chính xác nhu cầu cụ thể của dự án.

Hy vọng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và các bước thực hiện chi tiết. Đừng ngần ngại thử nghiệm trên trang web thử nghiệm (staging site) của bạn trước! Bạn đã tạo CPT cho mục đích gì? Chia sẻ kinh nghiệm của bạn trong phần bình luận bên dưới nhé!

Câu hỏi thường gặp (FAQ) về Tạo Custom Post Type

  1. Điều gì xảy ra với nội dung CPT nếu tôi tắt plugin CPT UI?
    • Các CPT và Taxonomy bạn đã tạo sẽ không còn được đăng ký và sẽ biến mất khỏi menu quản trị cũng như giao diện website. Tuy nhiên, dữ liệu (các bài viết bạn đã tạo) vẫn còn trong cơ sở dữ liệu. Nếu bạn kích hoạt lại plugin hoặc đăng ký lại CPT/Taxonomy đó bằng code (với cùng slug), dữ liệu sẽ xuất hiện trở lại.
  2. Tôi có thể chuyển từ việc dùng plugin sang code không?
    • Có thể. Bạn cần viết code PHP sử dụng register_post_typeregister_taxonomy với chính xác các slug và các cài đặt quan trọng (như public, has_archive, rewrite, supports) mà bạn đã cấu hình trong plugin. Sau khi code hoạt động đúng, bạn có thể tắt plugin CPT UI. Nhớ flush rewrite rules sau khi chuyển đổi.
  3. Làm cách nào để thêm các trường dữ liệu riêng cho CPT (ví dụ: Giá, Màu sắc cho Sản phẩm)?
    • Bạn cần sử dụng Custom Fields. Cách phổ biến nhất là dùng plugin Advanced Custom Fields (ACF) hoặc Meta Box. Các plugin này cho phép bạn tạo giao diện để nhập liệu cho các trường tùy chỉnh và dễ dàng hiển thị chúng trong template. Chúng tôi có hướng dẫn chi tiết về ACF tại liên_kết_nội_bộ_wordpress_liên_quan.
  4. Làm sao để tạo kiểu (style CSS) cho trang lưu trữ và trang chi tiết của CPT?
    • Bạn có thể nhắm mục tiêu các trang này bằng các lớp CSS mà WordPress tự động thêm vào thẻ <body>. Ví dụ: trang lưu trữ CPT ‘sanpham’ sẽ có lớp post-type-archive-sanpham, trang chi tiết sẽ có lớp single-sanphampostid-{id}. Bạn cũng có thể tạo các file template tùy chỉnh (archive-sanpham.php, single-sanpham.php) để có cấu trúc HTML riêng và dễ dàng tạo kiểu hơn.
  5. Chỉnh sửa file functions.php của theme có an toàn không?
    • Chỉnh sửa trực tiếp functions.php của theme gốc là không an toàn vì mọi thay đổi sẽ bị ghi đè khi bạn cập nhật theme. Luôn sử dụng theme con (child theme) để thêm code vào functions.php của nó, hoặc tốt hơn nữa là tạo một plugin tùy chỉnh riêng cho các chức năng của bạn.
5/5 - (1412)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *