Thời gian đọc: 8 phút
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.
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;
}
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);
Để 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,
));
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);
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');
Để 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;
}
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;
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);
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');
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');
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!