Tối ưu hiển thị danh mục Custom Post Type: Khai thác sức mạnh get_the_terms
Khi làm việc với WordPress và các Custom Post Type (CPT), việc hiển thị danh mục (categories) có thể trở thành một thách thức nếu bạn chỉ dựa vào các hàm mặc định như the_category(). Hàm get_the_terms() chính là giải pháp mạnh mẽ và linh hoạt, mang lại khả năng kiểm soát hoàn toàn cách các danh mục của CPT được trình bày trên website của bạn. Việc hiểu sâu về hàm này không chỉ giúp bạn hiển thị thông tin chính xác mà còn tối ưu hóa trải nghiệm người dùng và SEO cho các CPT.
Tại sao get_the_terms() lại quan trọng hơn the_category() cho Custom Post Type?
Hàm the_category() được thiết kế riêng để làm việc với loại bài viết mặc định (post) và taxonomy category của WordPress. Khi bạn tạo một Custom Post Type (ví dụ: Product) và gán các taxonomy tùy chỉnh cho nó (ví dụ: product_category hoặc thậm chí category mặc định), the_category() sẽ không thể truy xuất hoặc hiển thị các danh mục này một cách chính xác.

Đây là lúc get_the_terms() phát huy tác dụng. Nó cung cấp một cách thức tổng quát để lấy tất cả các thuật ngữ (terms) từ bất kỳ taxonomy nào được gán cho một bài viết cụ thể (dù là post hay Custom Post Type). Điều này mang lại sự linh hoạt vượt trội, cho phép nhà phát triển truy cập và xử lý dữ liệu danh mục theo nhiều cách khác nhau, từ việc hiển thị tên đơn giản đến xây dựng các liên kết phức tạp hoặc bộ lọc tùy chỉnh.
Khai thác các thông số của get_the_terms()
Để sử dụng get_the_terms(), bạn cần hiểu rõ hai thông số chính của nó:
$id(Bắt buộc): Đây là ID của bài viết mà bạn muốn lấy danh mục. Trong vòng lặp WordPress (while (have_posts()) : the_post();), bạn có thể dễ dàng lấy ID bài viết hiện tại bằngget_the_ID()hoặc$post->ID. Việc chỉ định rõ ràng ID giúp hàm hoạt động chính xác trong mọi ngữ cảnh, không chỉ trong vòng lặp chính.$taxonomy(Bắt buộc): Đây là tên (slug) của taxonomy mà bạn muốn lấy các thuật ngữ từ đó. Ví dụ, nếu bạn muốn lấy các danh mục “sản phẩm” cho CPTProduct, và taxonomy của bạn có slug làproduct_category, thì$taxonomysẽ là'product_category'.- Ý nghĩa: Tham số này là chìa khóa để
get_the_terms()phân biệt giữa các loại phân loại khác nhau mà một CPT có thể có. Một CPT có thể liên kết với nhiều taxonomy (ví dụ:product_categoryvàproduct_tag), và$taxonomycho phép bạn chỉ định chính xác taxonomy nào cần truy vấn. - Cách tìm tên taxonomy: Bạn có thể tìm thấy tên taxonomy trong URL quản trị WordPress khi chỉnh sửa hoặc xem các thuật ngữ của taxonomy đó. Ví dụ,
wp-admin/edit-tags.php?taxonomy=**category**cho biết tên taxonomy làcategory.
- Ý nghĩa: Tham số này là chìa khóa để
Giá trị trả về và tiềm năng tùy chỉnh
Khi gọi get_the_terms(), hàm này sẽ trả về một mảng các đối tượng stdClass Object nếu có thuật ngữ, hoặc false nếu không có, hoặc WP_Error nếu có lỗi. Mỗi đối tượng trong mảng đại diện cho một thuật ngữ (category/tag) và chứa các thuộc tính quan trọng:
term_id: ID duy nhất của thuật ngữ. Hữu ích cho việc truy vấn hoặc liên kết với các bảng dữ liệu khác.name: Tên hiển thị của thuật ngữ (ví dụ: “Laptop Gaming”).slug: Chuỗi định danh duy nhất của thuật ngữ, thường được dùng trong URL (ví dụ: “laptop-gaming”).description: Mô tả của thuật ngữ. Có thể được dùng cho SEO hoặc hiển thị thông tin bổ sung.parent: ID của thuật ngữ cha nếu đây là một taxonomy phân cấp. Quan trọng cho việc xây dựng cấu trúc danh mục cây.count: Số lượng bài viết được gán cho thuật ngữ này. Có thể dùng để hiển thị “X sản phẩm trong danh mục này” hoặc cho các mục đích phân tích.taxonomy: Tên slug của taxonomy mà thuật ngữ này thuộc về.
Ý nghĩa: Việc truy cập được các thuộc tính này cho phép bạn không chỉ hiển thị tên danh mục mà còn có thể:
- Tạo liên kết động đến trang danh mục bằng
get_term_link($term->slug, $term->taxonomy). - Tạo các thẻ meta description tùy chỉnh dựa trên
descriptioncủa danh mục. - Xây dựng các bộ lọc sản phẩm phức tạp dựa trên
term_idhoặc cấu trúcparent. - Hiển thị số lượng bài viết trong mỗi danh mục để cung cấp cái nhìn tổng quan cho người dùng.
Ví dụ minh họa và giải pháp toàn diện
Đoạn code ví dụ ban đầu cho thấy cách lấy tên danh mục và nối chúng thành một chuỗi:
<?php
$terms = get_the_terms( $post->ID, 'product_svl' );
if ( $terms && ! is_wp_error( $terms ) ) :
$draught_links = array();
foreach ( $terms as $term ) {
$draught_links[] = $term->name;
}
$on_draught = join( ", ", $draught_links );
?>
<p>
Chuyên mục: <span><?php echo $on_draught; ?></span>
</p>
<?php endif; ?>
Tuy nhiên, để có một giải pháp toàn diện hơn, bao gồm cả việc hiển thị liên kết và hỗ trợ nhiều taxonomy cho một CPT, bạn có thể sử dụng hàm tiện ích sau. Đây là một ví dụ mạnh mẽ về cách kết hợp các hàm WordPress để tạo ra một giải pháp linh hoạt:
<?php
// get taxonomies terms links
function custom_taxonomies_terms_links(){
// get post by post id
$post = get_post( get_the_ID() ); // Sử dụng get_the_ID() để đảm bảo lấy đúng ID
// get post type by post
$post_type = $post->post_type;
// get post type taxonomies
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
$out = array();
foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
// get the terms related to post
$terms = get_the_terms( $post->ID, $taxonomy_slug );
if ( !empty( $terms ) ) {
$out[] = "<h2>" . $taxonomy->label . "</h2>n<ul>";
foreach ( $terms as $term ) {
$out[] = ' <li><a href="' . get_term_link( $term->slug, $taxonomy_slug ) .'">' . $term->name . "</a></li>n";
}
$out[] = "</ul>n";
}
}
return implode('', $out );
}
?>
Phân tích sâu hàm custom_taxonomies_terms_links():
get_post(get_the_ID()): Đảm bảo chúng ta đang làm việc với đối tượng bài viết hiện tại.get_object_taxonomies($post_type, 'objects'): Đây là điểm mấu chốt. Thay vì phải biết trước tên taxonomy, hàm này tự động lấy tất cả các taxonomy đã đăng ký cho Custom Post Type hiện tại. Điều này làm cho hàm trở nên cực kỳ linh hoạt và tái sử dụng được cho bất kỳ CPT nào.- Vòng lặp
foreach ($taxonomies as $taxonomy_slug => $taxonomy): Duyệt qua từng taxonomy mà CPT có. Điều này cho phép hiển thị danh mục từ nhiều taxonomy khác nhau (ví dụ: “Danh mục sản phẩm” và “Thương hiệu sản phẩm”) một cách riêng biệt. get_term_link($term->slug, $taxonomy_slug): Hàm này là cần thiết để tạo ra URL chính xác đến trang lưu trữ của từng danh mục. Nó sử dụngslugcủa thuật ngữ vàslugcủa taxonomy để đảm bảo liên kết hoạt động đúng.
Để sử dụng, bạn chỉ cần chèn <?php echo custom_taxonomies_terms_links(); ?> vào file template (ví dụ: single-product.php hoặc content-product.php) trong vòng lặp while() của WordPress.
Kết luận
get_the_terms() không chỉ là một hàm thay thế cho the_category() khi làm việc với Custom Post Type mà còn là một công cụ mạnh mẽ, cung cấp khả năng kiểm soát chi tiết và linh hoạt cao trong việc quản lý và hiển thị các mối quan hệ phân loại. Việc tận dụng các thông số và giá trị trả về của hàm này, cùng với các hàm bổ trợ như get_term_link() và get_object_taxonomies(), cho phép bạn xây dựng các giao diện động, thân thiện với người dùng và tối ưu cho công cụ tìm kiếm. Khuyến nghị mạnh mẽ là hãy tích hợp giải pháp này vào các dự án WordPress có sử dụng Custom Post Type để đảm bảo tính chính xác, hiệu quả và khả năng mở rộng của website.
Các câu hỏi thường gặp (FAQ)
Hàm `get_the_terms()` quan trọng hơn `the_category()` cho Custom Post Type (CPT) như thế nào?
the_category() chỉ được thiết kế cho loại bài viết mặc định (post) và taxonomy category. get_the_terms() cung cấp cách thức tổng quát để lấy tất cả các thuật ngữ từ bất kỳ taxonomy nào được gán cho một bài viết cụ thể, mang lại sự linh hoạt vượt trội cho CPT.Các thông số bắt buộc khi sử dụng hàm `get_the_terms()` là gì?
$id: Là ID của bài viết mà bạn muốn lấy danh mục (có thể lấy bằng get_the_ID() hoặc $post->ID).
$taxonomy: Là tên (slug) của taxonomy mà bạn muốn lấy các thuật ngữ từ đó (ví dụ: ‘product_category’).Làm thế nào để tìm tên taxonomy?
wp-admin/edit-tags.php?taxonomy=**category**).Hàm `get_the_terms()` trả về giá trị gì?
stdClass Object nếu có thuật ngữ, hoặc false nếu không có, hoặc WP_Error nếu có lỗi.Mỗi đối tượng thuật ngữ (term) được trả về bởi `get_the_terms()` chứa những thuộc tính quan trọng nào?
term_id (ID duy nhất), name (tên hiển thị), slug (chuỗi định danh duy nhất), description (mô tả), parent (ID thuật ngữ cha), count (số lượng bài viết), và taxonomy (tên slug của taxonomy).Việc truy cập các thuộc tính của thuật ngữ cho phép làm gì?
Hàm tiện ích `custom_taxonomies_terms_links()` có những điểm mấu chốt nào?
get_post(get_the_ID()): Đảm bảo làm việc với đối tượng bài viết hiện tại.
get_object_taxonomies($post_type, 'objects'): Tự động lấy tất cả các taxonomy đã đăng ký cho CPT hiện tại.
Vòng lặp foreach: Duyệt qua từng taxonomy mà CPT có, cho phép hiển thị danh mục từ nhiều taxonomy khác nhau.
get_term_link($term->slug, $taxonomy_slug): Tạo ra URL chính xác đến trang lưu trữ của từng danh mục.Làm thế nào để sử dụng hàm `custom_taxonomies_terms_links()`?
<?php echo custom_taxonomies_terms_links(); ?> vào file template (ví dụ: single-product.php hoặc content-product.php) trong vòng lặp while() của WordPress.



