Để tăng cường độ chính xác cho bộ công cụ tìm kiếm của WP, bạn cần thêm function sau vào tập tin functions.php của WP (áp dụng vừa tìm Tiêu đề và Nội dung):
// Thêm bộ lọc 'posts_search' với function 'pvs_search_is_exact' và độ ưu tiên là 20.
add_filter('posts_search', 'pvs_search_is_exact', 20, 2);
/**
* Tìm kiếm chính xác từ.
*
* @param string $search Dòng tìm kiếm.
* @param WP_Query $wp_query Đối tượng WP_Query.
* @return string Dòng tìm kiếm đã được chỉnh sửa.
*/
function pvs_search_is_exact($search, $wp_query) {
// Lấy toàn cục $wpdb
global $wpdb;
// Nếu không có từ khóa tìm kiếm, trả về $search.
if (empty($search))
return $search;
// Lấy các biến từ $wp_query
$q = $wp_query->query_vars;
$n = !empty($q['exact']) ? '' : '%';
// Chuẩn bị chuỗi tìm kiếm mới
$new_search = '';
$search_and = '';
// Xử lý từng từ khóa tìm kiếm
foreach((array) $q['search_terms'] as $term) :
$term = esc_sql(like_escape($term));
$new_search .= "{$search_and}(({$wpdb->posts}.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ({$wpdb->posts}.post_content REGEXP '[[:<:]]{$term}[[:>:]]'))";
$search_and = ' AND ';
endforeach;
// Cuối cùng, nếu có từ khóa tìm kiếm, thêm vào $search.
if (!empty($new_search)) :
$new_search = " AND ({$new_search}) ";
if (!is_user_login())
$new_search .= " AND ({$wpdb->posts}.post_password = '') ";
endif;
// Trả về chuỗi tìm kiếm mới.
return $new_search;
}
Chúc các bạn thành công.
Lam Lai
Thank a đã share bài nhưng theo em biết thì Hàm ‘like_escape()’ đã bị bỏ từ bản 4.0 rồi á a. Em cập nhật nhẹ lại đoạn code như sau: