Chỉ hiển thị parent category trong loop WordPress
Giới Thiệu Về Hiển Thị Danh Mục Cha Trong WordPress Loop
Khi xây dựng một website WordPress phức tạp, việc quản lý và hiển thị danh mục (category) đóng vai trò quan trọng trong việc cấu trúc nội dung và giúp người dùng dễ dàng tìm kiếm thông tin. Đôi khi, bạn chỉ muốn hiển thị danh mục cha của một bài viết trong vòng lặp (loop) của WordPress, bỏ qua các danh mục con để tránh sự lặp lại hoặc đơn giản hóa giao diện người dùng. Bài viết này sẽ hướng dẫn bạn các phương pháp khác nhau để đạt được điều này, từ những cách cơ bản sử dụng hàm WordPress có sẵn đến những tùy chỉnh nâng cao hơn.
Các Hàm WordPress Cơ Bản Để Lấy Danh Mục
WordPress cung cấp nhiều hàm để truy xuất thông tin về danh mục của một bài viết. Trước khi đi sâu vào việc chỉ hiển thị danh mục cha, chúng ta cần nắm vững các hàm này:
get_the_category(): Hàm này trả về một mảng các đối tượng category của bài viết hiện tại trong loop. Mỗi đối tượng chứa thông tin như ID, tên, slug, và mô tả của danh mục.the_category(): Hàm này hiển thị danh sách các danh mục của bài viết hiện tại trực tiếp lên trang web, được phân tách bằng dấu phẩy theo mặc định.get_the_category_list(): Hàm này trả về một chuỗi HTML chứa danh sách các danh mục của bài viết hiện tại, với mỗi danh mục được liên kết đến trang lưu trữ của danh mục đó.
Để bắt đầu, chúng ta sẽ xem cách sử dụng các hàm này để hiển thị *tất cả* các danh mục của một bài viết:
<?php
$categories = get_the_category();
if ( ! empty( $categories ) ) {
echo '<p>Categories: ';
foreach( $categories as $category ) {
echo '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '">' . esc_html( $category->name ) . '</a> ';
}
echo '</p>';
}
?>
Hiển Thị Danh Mục Cha Duy Nhất
Bây giờ, chúng ta sẽ tập trung vào việc chỉ hiển thị danh mục cha. Để làm điều này, chúng ta cần kiểm tra xem mỗi danh mục có phải là danh mục cha hay không. Một danh mục là danh mục cha nếu thuộc tính `parent` của nó bằng 0.
<?php
$categories = get_the_category();
if ( ! empty( $categories ) ) {
echo '<p>Category: ';
foreach( $categories as $category ) {
if ( $category->parent == 0 ) {
echo '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '">' . esc_html( $category->name ) . '</a> ';
// Chỉ hiển thị một danh mục cha, dừng vòng lặp sau khi tìm thấy
break;
}
}
echo '</p>';
}
?>
Trong đoạn code trên, chúng ta lặp qua tất cả các danh mục của bài viết. Nếu một danh mục có `parent` bằng 0 (tức là nó là danh mục cha), chúng ta hiển thị nó và sau đó sử dụng `break` để dừng vòng lặp. Điều này đảm bảo rằng chúng ta chỉ hiển thị một danh mục cha duy nhất, ngay cả khi bài viết thuộc nhiều danh mục cha.
Xử Lý Trường Hợp Bài Viết Không Có Danh Mục Cha Trực Tiếp
Trong một số trường hợp, một bài viết có thể chỉ thuộc các danh mục con và không có danh mục cha trực tiếp. Trong tình huống này, đoạn code trên sẽ không hiển thị gì cả. Để xử lý trường hợp này, chúng ta có thể thêm một điều kiện kiểm tra để hiển thị danh mục đầu tiên nếu không tìm thấy danh mục cha.
<?php
$categories = get_the_category();
$parent_found = false;
if ( ! empty( $categories ) ) {
echo '<p>Category: ';
foreach( $categories as $category ) {
if ( $category->parent == 0 ) {
echo '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '">' . esc_html( $category->name ) . '</a> ';
$parent_found = true;
break;
}
}
// Nếu không tìm thấy danh mục cha, hiển thị danh mục đầu tiên
if ( ! $parent_found && ! empty( $categories ) ) {
$first_category = reset($categories);
echo '<a href="' . esc_url( get_category_link( $first_category->term_id ) ) . '">' . esc_html( $first_category->name ) . '</a> ';
}
echo '</p>';
}
?>
Ở đây, chúng ta thêm một biến `$parent_found` để theo dõi xem chúng ta đã tìm thấy danh mục cha hay chưa. Nếu sau khi lặp qua tất cả các danh mục mà `$parent_found` vẫn là `false`, chúng ta sử dụng hàm `reset()` để lấy danh mục đầu tiên trong mảng `$categories` và hiển thị nó.
Sử Dụng Truy Vấn SQL Trực Tiếp (Nâng Cao)
Nếu bạn muốn kiểm soát hoàn toàn quá trình truy vấn và tối ưu hóa hiệu suất, bạn có thể sử dụng truy vấn SQL trực tiếp để lấy danh mục cha. Tuy nhiên, cần lưu ý rằng việc sử dụng truy vấn SQL trực tiếp có thể phức tạp hơn và đòi hỏi kiến thức về cơ sở dữ liệu WordPress.
<?php
global $wpdb;
$post_id = get_the_ID();
$query = $wpdb->prepare(
"SELECT t.term_id, t.name, t.slug
FROM {$wpdb->prefix}terms AS t
INNER JOIN {$wpdb->prefix}term_taxonomy AS tt ON t.term_id = tt.term_id
INNER JOIN {$wpdb->prefix}term_relationships AS tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tr.object_id = %d AND tt.taxonomy = 'category' AND tt.parent = 0",
$post_id
);
$results = $wpdb->get_results( $query );
if ( ! empty( $results ) ) {
echo '<p>Category: ';
foreach( $results as $category ) {
echo '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '">' . esc_html( $category->name ) . '</a> ';
break; // Chỉ hiển thị một danh mục cha
}
echo '</p>';
}
?>
Truy vấn SQL này tìm kiếm các danh mục cha (có `tt.parent = 0`) liên kết với bài viết có ID `$post_id`. Hàm `$wpdb->prepare()` được sử dụng để ngăn chặn tấn công SQL injection.
Tùy Biến Nâng Cao Với Bộ Lọc (Filters) WordPress
WordPress cung cấp một hệ thống bộ lọc (filters) mạnh mẽ cho phép bạn sửa đổi dữ liệu trước khi nó được hiển thị. Bạn có thể sử dụng bộ lọc để tùy chỉnh cách hiển thị danh mục trong loop.
Ví dụ, bạn có thể sử dụng bộ lọc `get_the_categories` để sửa đổi mảng danh mục trước khi nó được trả về bởi hàm `get_the_category()`:
<?php
add_filter( 'get_the_categories', 'filter_parent_categories' );
function filter_parent_categories( $categories ) {
$parent_categories = array();
foreach ( $categories as $category ) {
if ( $category->parent == 0 ) {
$parent_categories[] = $category;
}
}
return $parent_categories;
}
?>
Đoạn code này tạo một hàm `filter_parent_categories` để lọc mảng danh mục, chỉ giữ lại các danh mục cha. Sau đó, nó sử dụng hàm `add_filter()` để gắn bộ lọc này vào bộ lọc `get_the_categories`. Bây giờ, mỗi khi bạn gọi hàm `get_the_category()`, nó sẽ chỉ trả về các danh mục cha.
Tổng Kết
Bài viết này đã trình bày các phương pháp khác nhau để chỉ hiển thị danh mục cha trong vòng lặp của WordPress. Bạn có thể lựa chọn phương pháp phù hợp nhất với nhu cầu và trình độ kỹ thuật của mình. Dưới đây là một vài điểm cần ghi nhớ:
- Sử dụng hàm
get_the_category()để lấy mảng các đối tượng danh mục. - Kiểm tra thuộc tính
parentcủa mỗi danh mục để xác định xem nó có phải là danh mục cha hay không. - Sử dụng truy vấn SQL trực tiếp để kiểm soát hoàn toàn quá trình truy vấn (nâng cao).
Việc hiểu rõ cách quản lý và hiển thị danh mục sẽ giúp bạn xây dựng một website WordPress có cấu trúc rõ ràng và thân thiện với người dùng.
- Chống spam form liên hệ WordPress 9 cách
- Cách xóa version number WordPress đúng cách
- Thêm link “Read More” vào text copied WordPress
- Thay đổi số bài viết trang blog WordPress
- Thêm blogroll WordPress không cần plugin
- 3 cách thêm đường kẻ ngang trong WordPress
- Hướng dẫn tắt hoàn toàn bình luận WordPress
