Trong WordPress, có nhiều cách khác nhau để hiển thị danh sách tất cả các category ra trang chủ hay widget. Mặc định thì WordPress có một Widget tên Categories (đối với post) và Product Categories (đối với Woocommerce) để bạn chèn vào Widget. Tuy nhiên, nếu bạn muốn hiển thị danh sách các Category ra trang chủ, hoặc vào trong page, hoặc bất cứ chỗ nào khác thì lúc đó bạn sẽ cần code thêm chức năng để get category. Ở bài viết này, mình sẽ hướng dẫn các bạn sử dụng hàm get_categories() để hiển thị danh mục bài viết hay danh mục sản phẩm ở bất kỳ đâu trong WordPress.
Table of Contents
- 1 Category là gì?
- 2 Cách sử dụng hàm get_categories() để get category trong WordPress
- 3 Các ví dụ về get category trong WordPress
- 3.1 Hiển thị tất cả các category
- 3.2 Hiển thị tất cả product category trong woocommerce
- 3.3 Get category khi có cat_id
- 3.4 Get category khi biết category name
- 3.5 Get category khi biết slug
- 3.6 Hiển thị category dưới dạng dropdown select
- 3.7 Get Woocommerce catogry và hiển thị dưới dạng select list
- 3.8 Liệt kê các bài viết theo danh mục
- 4 Một số lỗi khi get category trong WordPress
Category là gì?
Category dịch ra tiếng Việt có nghĩa là thể loại, danh mục. Nó dùng để chỉ một nhóm các đồ vật, sự vật, hiện tượng có các đặc tính hay tính năng tương tự nhau.
Trong WordPress, Category là một thuật ngữ để chỉ một thể loại bài viết hay còn gọi là chuyên mục của bài viết. Trong tiếng Anh, Category là số ít, còn số nhiều là Categories dùng để chỉ các danh mục bài viết, hay danh mục sản phẩm.
Để cho dễ hiểu, chúng ta hãy cùng nhìn vào website huyhoa.net. Ở đây Category là các danh mục như WordPress, Woocommerce, Sức Khỏe, Làm đẹp… Các bài viết cụ thể được gắn vào các Category này tùy theo nội dung của bài viết đó viết về cái gì.
Category giúp cả người viết và người đọc phân biệt được chủ đề của một bài viết cụ thể và gom những bài viết thuộc cùng một chủ đề nào đó vào chung một trang.
Ví dụ khi truy cập vào Category Lập Trình trên huyhoa.net thì bạn sẽ chỉ thấy các bài viết liên quan tới WordPress. Sẽ không có chuyện bài viết về sức khỏe hay du lịch mà lại cho vào Category WordPress.
Cách sử dụng hàm get_categories() để get category trong WordPress
Để get category trong WordPress, ta có thể sử dụng hàm get_categories().
Để hiểu rõ cách hoạt động cũng như cách sử dụng hàm này, trước tiên ta sẽ xem qua về cú pháp của hàm get_categories().
Mã nguồn: Hàm này được tìm thấy ở trong file wp-includes/category.php
function get_categories( $args = '' ) { $defaults = array( 'taxonomy' => 'category' ); $args = wp_parse_args( $args, $defaults ); /** * Filters the taxonomy used to retrieve terms when calling get_categories(). * * @since 2.7.0 * * @param string $taxonomy Taxonomy to retrieve terms from. * @param array $args An array of arguments. See get_terms(). */ $args['taxonomy'] = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args ); // Back compat. if ( isset( $args['type'] ) && 'link' === $args['type'] ) { _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( /* translators: 1: "type => link", 2: "taxonomy => link_category" */ __( '%1$s is deprecated. Use %2$s instead.' ), '<code>type => link</code>', '<code>taxonomy => link_category</code>' ) ); $args['taxonomy'] = 'link_category'; } $categories = get_terms( $args ); if ( is_wp_error( $categories ) ) { $categories = array(); } else { $categories = (array) $categories; foreach ( array_keys( $categories ) as $k ) { _make_cat_compat( $categories[ $k ] ); } } return $categories; }
Cú pháp sử dụng:
get_categories( string|array $args = '' )
Parameters
$args: một mảng (array) nhằm xác định các tham số khi truy vấn dữ liệu. Tùy vào mục đích bạn muốn lấy là gì, mảng này sẽ có thể bao gồm 1 hoặc tất cả các tham số sau:
Các tham số này sẽ quyết định danh sách các “category” được hiển thị.
$args = array(
'type' => 'post',
'child_of' => 0,
'parent' => '',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'number' => '',
'taxonomy' => 'category',
'pad_counts' => false
);
Giải thích:
- type: ở đây là post type. Mặc định nếu không khai báo thì nó sẽ lấy post type là post. Chúng ta có thể khai báo type để xác định ví dụ như post, page, product (nếu muốn lấy danh mục sản phẩm trong Woocommerce)
- child_of: Chỉ có 1 hoặc 0. Mặc định khi không khai báo hoặc khai báo sai nó sẽ nhận là 0. 0 có nghĩa là lấy danh sách tất cả các category, nếu là 1 thì nó chỉ lấy các danh mục con mà không lấy danh mục cha. Nhìn vào hình số 2 để hiểu thêm về danh mục con và danh mục cha.
- parent: Là id của danh mục cha. Nếu khai báo thì nó sẽ chỉ lấy các danh mục là con của danh mục được khai báo này.
- orderby: Sắp xếp kết quả trả về theo cái gì? Các giá trị có thể khai báo là: id, name, slug, count, term_group. Mặc định hoặc không khai báo thì orderby sẽ là name.
- order: ASC hoặc DESC. Sắp xếp theo chiều tăng hay giảm dần. Mặt định nó là tăng dần: ASC.
- hide_empty: 1 hoặc 0. Mặc định là 1. Nếu khai báo là 1 thì nó chỉ hiển thị các category đã có bài viết. 0 thì nó lấy cả, có bài viết hay chưa có bài viết nó đều hiển thị hết.
- hierarchical: Hiện thị Category theo dạng cây (tree list). Có là 1, không thì khai báo là 0.
- exclude: nhận giá trị là mảng (array). Nó là danh sách id các category không muốn hiện.
- include: Ngược lại so với exclude. Đây là một mảng chứa danh sách các category id sẽ được hiển thị.
- number: Số lượng Category muốn hiển thị. Ví dụ chỉ hiển thị 10 category thì điền 10. Nếu website có nhiều hơn 10 categories mà khai báo number là 10 thì kết quả cũng chỉ hiển thị 10 category.
- taxomony: Vì category là một trong số rất nhiều taxonomy trong wordpress nên ta có thể khai báo biến taxonomy để lấy danh mục khác như là tag chẳng hạn.
Return:
Kết quả trả về của hàm này là một mảng chứa danh sách các “category object“. Mỗi một Object sẽ chứa danh sách các thuộc tính của một chủ đề như là id, tên, mô tả, …
Các giá trị trả về trong object:
[term_id]=> ID của category
[name]=> Tên hiển thị của category
[slug]=> đường dẫn slug của category
[term_group]=> Nhóm của category
[term_taxonomy_id]=> ID của Taxonomy
[taxonomy]=> Trả về taxonomy: category hoặc tag...
[description]=> Mô tả của category
[parent]=> ID của danh mục cha của category này
[count]=> Số bài viết trong category này
[filter]=> raw
[cat_ID] => ID của category
[category_count]=> Số bài viết trong category này
[category_description]=> Mô tả của category
[cat_name]=> Tên của category
[category_nicename]=> nicename của category
[category_parent]=> ID thư mục cha của category
Các ví dụ về get category trong WordPress
Hiển thị tất cả các category
Đoạn code này sẽ hiển thị tất cả các category đang có trên website WordPress của bạn, kể cả các category không có bài viết nào và hiển thị ra ngoài dạnh text phân cách các category bởi dấu phẩy (,).
$args_cat = array( 'type' => 'post', 'number' => 100, 'hide_empty'=> 0, 'parent' => 0 ); $categories_cat = get_categories( $args_cat ); $th_1234 = '<h2>Danh sách các chuyên mục trên huyhoa.net</h2>'; foreach ( $categories_cat as $t_cat ) { $th_1234 .= $t_cat->name. ', ' ; }
Kết quả nó sẽ hiển thị kiểu thé này
Lấy link của một category
Vẫn lấy ví dụ như bên trên, bên trong vòng lặp foreach, ta có thể lấy link của một category bằng cách dùng hàm get_term_link
$args_cat = array( 'type' => 'post', 'number' => 100, 'hide_empty'=> 0, 'parent' => 0 ); $categories_cat = get_categories( $args_cat ); $th_1234 = '<h2>Danh sách các chuyên mục trên huyhoa.net</h2>'; foreach ( $categories_cat as $t_cat ) { $th_1234 .= '<a href ="'.get_term_link($t_cat->slug, 'category').'">'.$t_cat->name. ', ' ; } echo $th_1234;
Giờ, kết quả sẽ hiển thị thế này
Hiển thị tất cả product category trong woocommerce
Các ví dụ bên trên là với post, còn đối với product category trong Woocommerce thì bạn chỉ cần thay taxonomy từ category thành product_cat
<?php $args_cat = array( 'type' => 'product', 'number' => 100, 'hide_empty'=> 0, 'parent' => 0 ); $categories_cat = get_categories( $args_cat ); $th_1234 = '<h2>Danh mục sản phẩm</h2>'; foreach ( $categories_cat as $t_cat ) { $th_1234 .= '<a href ="'.get_term_link($category->slug, 'product_cat').'">'.$t_cat->name. ', ' ; } ?>
Get category khi có cat_id
Lưu ý là đối với wordpress thì category là một taxonomy. Khi đó muốn get category theo id, slug, name hay gì thì cũng quy về là lấy thông tin của taxonomy term. Cụ thể, giả sử ta muốn get category khi biết category ID là 18, lúc đó đoạn code sẽ như thế này:
// get a taxonomy term name by the slug $category = get_term_by('id', 18, 'category'); $term_name = $category->name;
Ở ví dụ bên trên, mình có dùng hàm get_term_by() để lấy dữ liệu về category có ID 18. Giá trị trả về là một WP_Term Object với các thông tin đầy đủ về category đó. Cụ thể, kết quả trả về sẽ như thế này:
WP_Term Object ( [term_id] => 18 [name] => Tên của Category có id là 18 [slug] => slug-cua-category-co-id-18 [term_group] => 0 [term_taxonomy_id] => 18 [taxonomy] => category [description] => Mô tả của category ở đây [parent] => 0 [count] => 10 [filter] => raw )
Get category khi biết category name
Tương tự như cách làm bên trên, ta chỉ cần thay id bằng name. Lưu ý là cách này chỉ lấy term đầu tiên nó nhận được.
// get category ID by category name $category = get_term_by('name', 'Sức khỏe', 'category'); $term_name = $category->name;
Nếu các bạn muốn lấy tất cả các category ID theo category name thì phải sử dụng hàm get_terms như bên dưới đây. Sở dĩ dùng cái get_term_by() nó không trả về hết kết quả là vì có thể nó có nhiều category có cùng 1 tên, nhưng ID và slug nó khác nhau (danh mục cha, danh mục con chẳng hạn)
// Get terms whose name begins with "my_name" get_terms( 'category', array( 'name__like' => 'my_name' ) ); // Get terms whose name contains "my_name" get_terms( 'category', array( 'search' => 'my_name' ) );
(Nhìn hình bên dưới sẽ thấy có thể có nhiều category trùng tên nhưng lại có id khác nhau)
Get category khi biết slug
Lấy thông tin về category khi biết slug cũng tương tự như vậy
// get a taxonomy term name by the slug $category = get_term_by('slug', 'tin-tuc', 'category') $term_name = $category->name;
Hiển thị category dưới dạng dropdown select
Để hiện tất cả các category trong WordPress dưới dạng dropdown select, ta có thể dùng hàm wp_dropdown_categories()
<?php $args = array( 'show_option_all' => '', 'show_option_none' => __( 'All categories' ), 'option_none_value' => '', 'orderby' => 'ID', 'order' => 'ASC', 'show_count' => 1, 'hide_empty' => 0, 'child_of' => 0, 'include' => '', 'echo' => 1, 'selected' => 0, 'hierarchical' => 1, 'name' => 'category', 'id' => 'category', 'class' => 'form-control', 'depth' => 0, 'tab_index' => 0, 'taxonomy' => 'category', 'hide_if_empty' => false, 'value_field' => 'slug', ); wp_dropdown_categories( $args ); ?>
Ở đây các bạn cần lưu ý vài thông số:
- echo: 1 hiển thị luôn ra html code chứ không cần echo nữa. Giá trị là 0 thì nó trả về dạng string
- hide_empty: 0 là không ẩn các category không có bài viết nào. 1 là ẩn những category chưa có bài viết
- show_option_none: Là cái option nó hiện đầu tiên được lựa chọn
- option_none_value: Là giá trị value của cái show_option_none bên trên
- show_count: Là hiển thị số bài viết của chuyên mục đó ngay sau tên của chuyên mục
- value_field: là giá trị trong thẻ value của option đó
Get Woocommerce catogry và hiển thị dưới dạng select list
ĐỐi với post thì taxonomy là category, còn đối với Woocommerce thì taxonomy là, product_cat. Bạn chỉ cần khai báo taxonomy còn các thứ khác thì tương tự như get category của post thôi
Ví dụ:
function huyhoa_category_lists( ) { $categories = get_categories( array( 'hide_empty' => 0, 'taxonomy' => 'product_cat' // Khai báo taxonomy cho Woocommerce Product ) ); $category_lists = array(); $category_lists[0] = __( 'Select Product Category' , 'huyhoa' ); foreach( $categories as $category ){ $category_lists[$category->term_id] = $category->name; } return $category_lists; }
Liệt kê các bài viết theo danh mục
Về cơ bản thì không thể trực tiếp lấy bài viết và cả danh mục sau đó hiển thị ngay lập tức được trong WordPress. Tuy nhiên, chúng ta có thể dùng đường vòng một chút. Quy trình sẽ như thế này.
Bước 1: Trước tiên bạn cần tạo một truy vấn tùy chỉnh WP_Query để truy xuất tất cả các bài đăng đã được xuất bản
$args = array( 'posts_per_page' => -1 ); $query = new WP_Query($args); $q = array(); while ( $query->have_posts() ) { } /* Restore original Post Data */ wp_reset_postdata();
Bước 2: Sử dụng get_the_category, lấy danh sách tất cả các danh mục mà bài đăng thuộc về.
$categories = get_the_category(); foreach ( $categories as $key=>$category ) { $b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>'; }
Bước 3: Gán các biến cho tiêu đề bài viết và các thể loại của bài viết
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
và
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
Bước 4: Kết hợp hai biến này để tạo thành một mảng nhiều chiều
$q[$b][] = $a;
Để xem những gì đang xảy ra trong mảng mới tạo, chỉ cần sử dụng var_dump để nó hiện ra.
?> <pre><?php var_dump($q); ?></pre> <?php
Bước 5: Sử dụng foreachcác vòng lặp, tạo danh sách bài đăng của bạn được sắp xếp theo thể loại
foreach ($q as $key=>$values) { echo $key; echo '<ul>'; foreach ($values as $value){ echo '<li>' . $value . '</li>'; } echo '</ul>'; }
Cuối cùng là kết hợp lại ta sẽ có đoạn code hoàn chỉnh
$args = array( 'type' => 'post', 'posts_per_page' => 10 // Số lượng bài viết sẽ lấy. Nếu muốn lấy tất cả thì để là -1 ); $query = new WP_Query($args); $q = array(); while ( $query->have_posts() ) { $query->the_post(); $a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>'; $categories = get_the_category(); foreach ( $categories as $key=>$category ) { $b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>'; } $q[$b][] = $a; // Create an array with the category names and post titles } /* Restore original Post Data */ wp_reset_postdata(); foreach ($q as $key=>$values) { echo $key; echo '<ul>'; foreach ($values as $value){ echo '<li>' . $value . '</li>'; } echo '</ul>'; }
Kết quả:
Một số lỗi khi get category trong WordPress
Tại sao get_categories() chỉ trả về tất cả các danh mục đang có?
Bạn Nam Đặng có nhắn tin hỏi mình là tại sao bạn cũng dùng hàm get_categories() để get category nhưng mà kết quả trả về chỉ có 5 danh mục, trong khi bạn đã tạo 8 danh mục. Vậy còn 3 danh mục nữa tại sao nó không hiện?
Mình xin trả lời là do bạn chưa khai báo chế độ hiển thị cả các danh mục chưa có bài viết: “hide_empty” => 0. Bạn chỉ cần thêm “hide_empty” => 0, vào $args thì nó sẽ hiện tất cả các danh mục bạn đã tạo
<?php $args = array( "hide_empty" => 0, "type" => "post", "orderby" => "name", "order" => "ASC" ); $danhmuc = get_categories($args); ?>