Site logo

Archived topic

WP Search entire words not partial

2 replies · Started by Marius on November 19, 2021

Viewing posts 1–3 of 3

Right now the search on my website is searching for partial words (searching for "and", will return posts containing "andrew", "land").
I tried using some functions found online but they all restrict the search to the title of the posts, ignoring the content.

I would appreciate any help with a function that will allow the website to search for whole words, not partials, but without ignoring the content of the posts.

I found a function that seems to do the trick. I will leave it here, in case anyone else is looking for the same thing.

add_filter( 'posts_search', 'my_search_is_perfect', 20, 2 );
function my_search_is_perfect( $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 ';
    }

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

    return $search;
}

Thank you for sharing!

This archived topic is closed to new replies.