Lập trình WordPress – Bài 7: Thêm phân loại danh mục và tags cho sản phẩm (taxonomy in WordPress)

Trong bài này hướng dẫn cách thêm danh mục phân loại cho sản phẩm, tiếp theo sẽ hiển thị tất cả danh mục và hiển thị tất cả sản phẩm thuộc 1 danh mục nào đó.

Tạo custom taxonomy

register_taxonomy('sanpham_cat', ['sanpham'], [
        'label' => 'Danh mục Sản phẩm',
        'hierarchical' => true,  //show dang phan cap
        'rewrite' => true,
        'show_admin_column' => true, //hien thi trong list sanpham 
        'show_in_rest' => true,   //hien thi trong form them / sua sanpham
    ]);
 
register_taxonomy_for_object_type('sanpham_cat', 'sanpham'); //dang ky taxonomy cho sanpham
    
register_taxonomy('sanpham_tags', ['sanpham'], [
        'label' => 'Tags',
        'hierarchical' => false,  //show dang flat
        'rewrite' => true,        
        'show_admin_column' => true,
        'show_in_rest' => true,
    ]);
    
register_taxonomy_for_object_type('sanpham_tags', 'sanpham');

//phia custom post time them truong sau
'taxonomies' => ['sanpham_cat', 'sanpham_tags']

Code demo đầy đủ cho custom post type + custom taxonomy

add_action('init', 'dangkyCustomPostType');

function dangkyCustomPostType()
{
    register_post_type('sanpham', [
        'public' => true,
        'has_archive' => true,
        'show_in_rest' => true,
        'supports' => ['title', 'editor', 'thumbnail'],
        'labels' => [
            'name' => 'Sản phẩm',
            'add_new_item' => 'Thêm Sản phẩm',
            'edit_item' => 'Sửa Sản phẩm',
            'all_items' => 'Tất cả Sản phẩm',
            'singular_name' => 'Sản phẩm'
        ],
        'menu_icon' => 'dashicons-products',
        'taxonomies' => ['sanpham_cat', 'sanpham_tags']
    ]);

    register_taxonomy('sanpham_cat', ['sanpham'], [
        'label' => 'Danh mục Sản phẩm',
        'hierarchical' => true,
        'query_var' => true,
        'rewrite' => true,
        'show_admin_column' => true,
        'show_in_rest' => true,
    ]);
    register_taxonomy_for_object_type('sanpham_cat', 'sanpham');
    register_taxonomy('sanpham_tags', ['sanpham'], [
        'label' => 'Tags',
        'query_var' => false,
        'rewrite' => true,
        'show_in_rest' => true,
        'show_admin_column' => true
    ]);
    register_taxonomy_for_object_type('sanpham_tags', 'sanpham');
}

Lấy tất cả custom taxonomy của một post type

Để lấy tất cả các custom taxonomy của một post type trong WordPress, bạn có thể sử dụng hàm get_object_taxonomies(). Hàm này sẽ trả về danh sách các taxonomy liên kết với post type mà bạn chỉ định.

Dưới đây là đoạn mã mẫu để lấy và in ra tất cả các custom taxonomy của một post type cụ thể:

<?php
// Hàm lấy tất cả custom taxonomy của post type
function get_custom_taxonomies_for_post_type($post_type) {
    // Lấy tất cả các taxonomy gắn với post type
    $taxonomies = get_object_taxonomies($post_type, 'objects');

    // Kiểm tra nếu có taxonomy
    if (!empty($taxonomies)) {
        echo '<ul>';
        foreach ($taxonomies as $taxonomy) {
            echo '<li>' . $taxonomy->labels->name . '</li>'; // In tên taxonomy
        }
        echo '</ul>';
    } else {
        echo 'Không có custom taxonomy nào cho post type này.';
    }
}

// Gọi hàm với post type cụ thể, ví dụ: 'product'
get_custom_taxonomies_for_post_type('product');
?>

Giải thích:

  • get_object_taxonomies($post_type, 'objects'): Lấy tất cả các taxonomy của post type (ở dạng object để dễ lấy thông tin chi tiết hơn).
  • $taxonomy->labels->name: Truy cập tên của taxonomy thông qua thuộc tính labels.

Sử dụng:

  • Bạn có thể gọi hàm get_custom_taxonomies_for_post_type() với post type mà bạn muốn kiểm tra, chẳng hạn như 'product', 'post', hoặc bất kỳ post type nào khác.

a. Thêm code để hiển thị mô tả cho từng taxonomy?
b. Thêm điều kiện kiểm tra taxonomy tùy chỉnh (custom)?

Lấy tất cả các giá trị (terms) của một taxonomy trong WordPress

<?php
// Hàm lấy tất cả các giá trị (terms) của một taxonomy cụ thể
function get_all_terms_for_taxonomy($taxonomy) {
    // Lấy tất cả các terms của taxonomy
    $terms = get_terms(array(
        'taxonomy' => $taxonomy,
        'hide_empty' => false, // Đặt thành false để lấy cả những terms không có bài viết
    ));

    // Kiểm tra nếu có terms
    if (!is_wp_error($terms) && !empty($terms)) {
        echo '<ul>';
        foreach ($terms as $term) {
            // Lấy liên kết đến trang lưu trữ của term
            $term_link = get_term_link($term);
            // Hiển thị tên term kèm theo link
            echo '<li><a href="' . esc_url($term_link) . '">' . $term->name . '</a> (' . $term->count . ' bài viết)</li>';
        }
        echo '</ul>';
    } else {
        echo 'Không có term nào cho taxonomy này.';
    }
}

// Gọi hàm với taxonomy cụ thể, ví dụ: 'category' hoặc 'product_cat'
get_all_terms_for_taxonomy('product_cat');
?>

Giải thích:

  • get_terms(): Lấy tất cả các terms của taxonomy, trong đó:
    • taxonomy: Xác định tên taxonomy mà bạn muốn lấy các giá trị.
    • hide_empty => false: Nếu đặt thành false, sẽ lấy cả những terms không có bài viết gắn với chúng. Nếu đặt thành true, chỉ lấy các terms có bài viết.
  • $term->name: Lấy tên của term.
  • $term->count: Số lượng bài viết liên quan đến term đó.
  • get_term_link(): Hàm này sẽ trả về URL của trang lưu trữ (archive page) của term.

Sử dụng:

Bạn có thể thay thế 'product_cat' bằng tên của taxonomy mà bạn muốn lấy terms, chẳng hạn 'category', 'post_tag', hoặc bất kỳ taxonomy tùy chỉnh nào.

a. Thêm bộ lọc để chỉ lấy các terms theo điều kiện cụ thể?
b. Hiển thị thêm liên kết đến trang lưu trữ của từng term?

Tạo file hiển thị danh sách post theo term

Trong WordPress, trang lưu trữ cho một taxonomy term được xác định bởi file template trong theme. WordPress sẽ tìm kiếm các file template theo thứ tự ưu tiên từ chi tiết nhất đến tổng quát nhất. Dưới đây là các tên file template mà WordPress sẽ tìm kiếm khi hiển thị một term, cụ thể dựa trên slug của taxonomy và term.

Tên file trong theme cho term với taxonomy slug:

taxonomy-{taxonomy}-{term}.php

  • Đây là template dành riêng cho một term cụ thể của taxonomy.
  • Ví dụ: Nếu taxonomy có slug là product_cat và term có slug là clothing, thì WordPress sẽ tìm file:
taxonomy-product_cat-clothing.php

taxonomy-{taxonomy}.php

  • Nếu không tìm thấy template cụ thể cho term, WordPress sẽ tìm file dành cho toàn bộ taxonomy.
  • Ví dụ: Nếu taxonomy là product_cat, thì WordPress sẽ tìm file:
taxonomy-product_cat.php

taxonomy.php

  • Nếu không tìm thấy các file trên, WordPress sẽ sử dụng file này cho bất kỳ taxonomy nào.

archive.php

  • Nếu không có file taxonomy.php, WordPress sẽ sử dụng file tổng quát cho các trang lưu trữ (archive).

index.php

  • Đây là file template mặc định cuối cùng mà WordPress sẽ sử dụng nếu không tìm thấy bất kỳ file template nào ở trên.

Ví dụ cụ thể:

Giả sử bạn có:

  • Taxonomy: product_cat
  • Term: clothing

Khi truy cập vào trang lưu trữ của term clothing, WordPress sẽ tìm các file template theo thứ tự:

  1. taxonomy-product_cat-clothing.php
  2. taxonomy-product_cat.php
  3. taxonomy.php
  4. archive.php
  5. index.php

Hiển thị sản phẩm theo danh mục

Khi click vào 1 danh mục cụ thể (term trong taxonomy), chúng ta sẽ qua trang taxonomy cho term đó, để lấy term id hoặc term slug có thể tham khảo code như dưới:

<?php
//lay id cua term
echo get_queried_object_id();

$queried_object = get_queried_object();   //hoac truy van object sau đó lấy id, slug
echo $queried_object->term_id;
echo $queried_object->slug;
?>

Sau đó sử dụng WP_Query để truy vấn các bài viết liên quan đến term đang truy cập. Dưới đây là đoạn mã mẫu để thực hiện việc này:

<h1 style="margin-top: 200px;">Danh sách Sản phẩm trong danh mục</h1>
<?php
$queried_object = get_queried_object();
$term_id = $queried_object->term_id;

//truy van cac posts theo slug hoặc id
$args = [
    'post_type' => 'book',
    'tax_query' => [
        ['taxonomy' => 'book_genre', 'field' => 'term_id', 'terms' => $term_id]
    ]
];

$dsSach = new WP_Query($args);

while ($dsSach->have_posts()) {
    $dsSach->the_post();
    ?>
    <h2><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h2>
    <?php
}
?>

Lấy danh sách terms liên quan đến post

wp_get_post_terms( int $post_id, string|string[] $taxonomy = ‘post_tag’, array $args = array() )

Trường hợp đang xem thông tin 1 post, có thể liệt kê các terms liên quan post này để trở về liên kết của term ở trên.

Để 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 *