Trong hướng dẫn này, chúng ta sẽ học cách tự động thêm chuyên mục (category) vào bài viết WordPress dựa trên tiêu đề. Đặc biệt, chỉ thêm chuyên mục nếu bài viết chưa có chuyên mục hoặc thuộc chuyên mục “Uncategorized”. Ngoài ra, nếu tiêu đề chứa nhiều chuyên mục, chúng ta sẽ chọn chuyên mục con nhất (cấp thấp nhất) và đảm bảo rằng chỉ một chuyên mục được thêm.

Mục Tiêu

  1. Kiểm tra trạng thái bài viết: Chỉ áp dụng với các bài viết đã xuất bản.
  2. Tự động thêm chuyên mục: Chuyên mục sẽ được thêm dựa trên tiêu đề bài viết.
  3. Xử lý chuyên mục “Uncategorized”: Loại bỏ chuyên mục “Uncategorized” khi thêm chuyên mục mới.
  4. Chọn chuyên mục cấp con nhất: Nếu tiêu đề chứa nhiều chuyên mục, chỉ chọn chuyên mục con nhất.
  5. Giữ nguyên các chuyên mục đã có: Không ảnh hưởng đến các chuyên mục đã được thêm trước đó.

Bước 1: Kiểm Tra Trạng Thái Bài Viết

Trước tiên, chúng ta chỉ muốn thêm chuyên mục nếu bài viết đã được xuất bản. Để kiểm tra trạng thái bài viết, ta sử dụng hàm get_post_status($post_id):

if (get_post_status($post_id) != 'publish') {
    return;
}

Bước 2: Lấy Tiêu Đề Bài Viết

Tiếp theo, ta cần lấy tiêu đề bài viết bằng cách sử dụng hàm get_the_title($post_id):

$post_title = get_the_title($post_id);

Bước 3: Lấy Danh Sách Tất Cả Chuyên Mục

Để kiểm tra chuyên mục nào có trong tiêu đề, chúng ta cần lấy tất cả các chuyên mục, bao gồm cả những chuyên mục không có bài viết. Sử dụng hàm get_terms():

$categories = get_terms(array(
    'taxonomy' => 'category',
    'hide_empty' => false,
));

Bước 4: Lấy Chuyên Mục Hiện Tại Của Bài Viết

Sử dụng wp_get_post_categories($post_id) để lấy danh sách các chuyên mục hiện tại của bài viết:

$current_categories = wp_get_post_categories($post_id);

Bước 5: Xử Lý Chuyên Mục Mặc Định (Uncategorized)

WordPress có một chuyên mục mặc định, thường là “Uncategorized.” Để loại bỏ chuyên mục này, trước hết ta cần lấy ID của nó bằng cách sử dụng get_option('default_category'):

$default_category_id = get_option('default_category');

Bước 6: Kiểm Tra Tiêu Đề Chứa Chuyên Mục

Để kiểm tra xem tiêu đề có chứa tên chuyên mục hay không, ta sẽ chuyển cả tiêu đề và tên chuyên mục thành chữ thường để tránh phân biệt chữ hoa chữ thường. Sau đó sử dụng hàm strpos() để kiểm tra:

$lowercase_title = mb_strtolower($post_title);
$lowercase_category = mb_strtolower($category->name);

if (strpos($lowercase_title, $lowercase_category) !== false) {
    $categories_to_add[] = $category;
}

Bước 7: Chọn Chuyên Mục Con Nhất (Nếu Có Nhiều Chuyên Mục)

Nếu tiêu đề chứa nhiều chuyên mục, ta sắp xếp các chuyên mục để chọn chuyên mục con nhất, tức chuyên mục có mức độ cha lớn nhất:

usort($categories_to_add, function($a, $b) {
    return ($b->parent  $a->parent);
});

$category_to_add = $categories_to_add[0]->term_id;

Bước 8: Loại Bỏ “Uncategorized” và Thêm Chuyên Mục Mới

Nếu bài viết thuộc chuyên mục “Uncategorized”, ta sẽ loại bỏ nó trước khi thêm chuyên mục mới:

if (in_array($default_category_id, $current_categories)) {
    $current_categories = array_diff($current_categories, array($default_category_id));
}

$all_categories = array_merge($current_categories, array($category_to_add));
wp_set_post_categories($post_id, $all_categories);

Bước 9: Gắn Hàm Vào Hook save_post

Cuối cùng, ta gắn hàm vào hook save_post để tự động thực hiện khi lưu hoặc cập nhật bài viết:

add_action('save_post', 'auto_add_category_from_title');

Code Hoàn Chỉnh

Dưới đây là toàn bộ code hoàn chỉnh:

// Hàm tự động thêm chuyên mục vào bài viết dựa trên tiêu đề
function auto_add_category_from_title($post_id) {
    // Kiểm tra nếu đây là bài viết đã xuất bản
    if (get_post_status($post_id) != 'publish') {
        return;
    }

    // Lấy tiêu đề của bài viết
    $post_title = get_the_title($post_id);

    // Lấy tất cả các chuyên mục (bao gồm cả các chuyên mục không có bài viết)
    $categories = get_terms(array(
        'taxonomy' => 'category',
        'hide_empty' => false, // Bao gồm cả những chuyên mục không có bài viết
    ));

    // Lấy ID của chuyên mục mặc định (Uncategorized)
    $default_category_id = get_option('default_category');

    // Lấy các chuyên mục hiện tại của bài viết
    $current_categories = wp_get_post_categories($post_id);

    // Nếu bài viết chỉ thuộc "Uncategorized" hoặc không có chuyên mục nào
    if (count($current_categories) == 1 && in_array($default_category_id, $current_categories)) {
        // Mảng chứa chuyên mục cần thêm vào
        $categories_to_add = array();

        // Kiểm tra xem tiêu đề có chứa các chuyên mục hay không
        foreach ($categories as $category) {
            // Chuyển tiêu đề và tên chuyên mục sang chữ thường để không phân biệt hoa thường
            $lowercase_title = mb_strtolower($post_title);
            $lowercase_category = mb_strtolower($category->name);

            // Kiểm tra tiêu đề có chứa đúng tên chuyên mục không
            if (strpos($lowercase_title, $lowercase_category) !== false) {
                // Nếu tìm thấy chuyên mục trong tiêu đề
                $categories_to_add[] = $category;
            }
        }

        // Nếu có chuyên mục cần thêm
        if (!empty($categories_to_add)) {
            // Sắp xếp để lấy chuyên mục cấp con nhất
            usort($categories_to_add, function($a, $b) {
                return ($b->parent  $a->parent);
            });

            // Lấy chuyên mục cấp con nhất
            $category_to_add = $categories_to_add[0]->term_id;

            // Loại bỏ "Uncategorized" nếu đang có
            if (in_array($default_category_id, $current_categories)) {
                // Loại bỏ chuyên mục "Uncategorized"
                $current_categories = array_diff($current_categories, array($default_category_id));
            }

            // Cập nhật chuyên mục mới
            $all_categories = array_merge($current_categories, array($category_to_add));

            // Cập nhật lại chuyên mục cho bài viết
            wp_set_post_categories($post_id, $all_categories);
        }
    }
}

// Gắn hàm vào hook save_post
add_action('save_post', 'auto_add_category_from_title');

Kết Luận

Với đoạn mã trên, bạn đã tự động thêm chuyên mục vào bài viết dựa trên tiêu đề một cách chính xác và linh hoạt. Điều này giúp bài viết của bạn luôn được gắn với chuyên mục phù hợp mà không cần phải thực hiện thủ công.

Việc tự động thêm chuyên mục vào bài viết dựa trên tiêu đề không chỉ giúp bạn tiết kiệm thời gian mà còn đảm bảo bài viết luôn được phân loại một cách chính xác. Điều này đặc biệt hữu ích cho các trang web có lượng bài viết lớn, nơi việc quản lý chuyên mục thủ công có thể trở nên rườm rà và dễ mắc sai sót. Ngoài ra, việc chọn chuyên mục con nhất từ tiêu đề giúp cải thiện cấu trúc phân loại của website, làm cho nội dung trở nên rõ ràng và dễ tiếp cận hơn với người dùng. Đặc biệt, loại bỏ chuyên mục “Uncategorized” sẽ giúp bài viết của bạn tránh được tình trạng không có chuyên mục cụ thể, cải thiện SEO và trải nghiệm người đọc.

Với hướng dẫn chi tiết và từng bước thực hiện, bạn có thể dễ dàng áp dụng phương pháp này vào website WordPress của mình. Từ đó, bạn sẽ tạo ra một hệ thống quản lý nội dung tự động hiệu quả, đồng thời duy trì chất lượng và tính nhất quán của các bài viết mà không cần can thiệp quá nhiều. Hãy áp dụng và tối ưu hóa trải nghiệm người dùng ngay hôm nay!