The posts_search filter modifies the search SQL used in the WHERE clause of a WordPress WP_Query.
Usage
add_filter('posts_search', 'your_function_name', 10, 2);
function your_function_name($search, $query) {
// your custom code here
return $search;
}
Parameters
$search(string) – The search SQL for the WHERE clause.$query(WP_Query) – The current WP_Query object.
More information
See WordPress Developer Resources: posts_search
Examples
Change search logic
Modify the search logic to include searching for post tags.
add_filter('posts_search', 'search_tags_in_posts', 10, 2);
function search_tags_in_posts($search, $query) {
if (!is_admin() && $query->is_search) {
global $wpdb;
$search_term = esc_sql($query->query['s']);
$search .= " OR (t.name LIKE '%{$search_term}%')";
$search = " AND ({$search}) ";
}
return $search;
}
Exclude specific post types from search
Prevent search from returning results for specific post types.
add_filter('posts_search', 'exclude_post_types_from_search', 10, 2);
function exclude_post_types_from_search($search, $query) {
global $wpdb;
if (!is_admin() && $query->is_search) {
$search .= " AND {$wpdb->posts}.post_type NOT IN ('exclude_this_post_type', 'exclude_this_too')";
}
return $search;
}
Include custom fields in search
Extend the search to include custom fields (meta values).
add_filter('posts_search', 'include_custom_fields_in_search', 10, 2);
function include_custom_fields_in_search($search, $query) {
global $wpdb;
if (!is_admin() && $query->is_search) {
$search_term = esc_sql($query->query['s']);
$search .= " OR ({$wpdb->postmeta}.meta_value LIKE '%{$search_term}%')";
}
return $search;
}
Filter search results by category
Limit search results to a specific category.
add_filter('posts_search', 'filter_search_by_category', 10, 2);
function filter_search_by_category($search, $query) {
if (!is_admin() && $query->is_search) {
$search .= " AND ({$wpdb->term_taxonomy}.taxonomy = 'category' AND {$wpdb->term_taxonomy}.term_id = 'your_category_id')";
}
return $search;
}
Exclude specific words from search
Prevent search results from returning posts containing specific words.
add_filter('posts_search', 'exclude_words_from_search', 10, 2);
function exclude_words_from_search($search, $query) {
global $wpdb;
if (!is_admin() && $query->is_search) {
$search .= " AND {$wpdb->posts}.post_content NOT REGEXP '(word1|word2|word3)'";
}
return $search;
}