Chỉ hiển thị parent category trong loop WordPress

2 tháng ago, WordPress Themes, Views
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 parent củ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.