Thiết lập tìm kiếm chính xác trong WordPress (ok)

https://hoangan.net/thiet-lap-tim-kiem-chinh-xac-trong-wordpress.html

Chú ý: Có thay đổi cho đúng hơn.

Gốc: 
$search.= "{$searchand}($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]')";
Thay đổi: 
$search .= " {$searchand}(($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ($wpdb->posts.post_content REGEXP '[[:<:]]{$term}[[:>:]]')) ";

Tôi thấy nhiều bạn có ý kiến về việc công cụ tìm kiếm của WordPress hơi cùi bắp, tìm kiếm không chính xác.

Nay tôi xin phép viết 1 bài chia sẻ cách thiết lập để công cụ tìm kiếm của WordPress chính xác hơn.

Trong bài này, tôi có 2 phần

  • Thiết lập tìm kiếm chính xác (Tìm cả trong tiêu đề và nội dung)

  • Thiết lập tìm kiếm chính xác (Chỉ tìm trong tiêu đề)

1 – Tìm kiếm chính xác trong tiêu đề và nội dung

Các bạn, hãy mở file functions.php của theme đang sử dụng và bỏ vào đó đoạn code sau:

add_filter('posts_search', 'pvs_search_is_exact', 20, 2);
function pvs_search_is_exact($search, $wp_query){

    global $wpdb;

    if(empty($search))
        return $search;

    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';

    $search = $searchand = '';

    foreach((array)$q['search_terms'] as $term) :

        $term = esc_sql(like_escape($term));

        $search .= " {$searchand}(($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ($wpdb->posts.post_content REGEXP '[[:<:]]{$term}[[:>:]]')) ";

        $searchand = ' AND ';

    endforeach;

    if(!empty($search)) :
        $search = " AND ({$search}) ";
        if(!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    endif;

    return $search;

}

2 – Tìm kiếm chính xác chỉ trong tiêu đề

add_filter('posts_search', 'pvs_search_is_exact', 20, 2);
function pvs_search_is_exact($search, $wp_query){

    global $wpdb;

    if(empty($search))
        return $search;

    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';

    $search = $searchand = '';

    foreach((array)$q['search_terms'] as $term) :

        $term = esc_sql(like_escape($term));

        $search.= "{$searchand}($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]')";

        $searchand = ' AND ';

    endforeach;

    if(!empty($search)) :
        $search = " AND ({$search}) ";
        if(!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    endif;

    return $search;

}

Kết luận

Trên đây là thủ thuật nhỏ dựa trên các dự án thực tế của tôi. Hy vọng nó hữu ích với bạn. Nếu có bất kỳ câu hỏi nào, vui lòng comment dưới bài viết này.

Last updated