Autosuggest
The Search module provides autosuggest functionality, which automatically integrates with search forms on the website to show a dropdown list of suggestions as users type.
(This feature is provided by ElasticPress, with additions from Altis.)
How autosuggest works
Autosuggest works by finding search forms on your site and automatically integrating with these.
Using the element selector specified within the search configuration, ElasticPress JS listens for user input on search forms. As the user types, an Ajax request is sent to the backend to query for possible results.
Just like with other queries, ElasticPress automatically generates an Elasticsearch query based on the WordPress query being run.
Unlike regular searches, autosuggestion operates on a fuzzy basis, as it needs to match against partial inputs as the user types. ElasticPress automatically converts certain fields in the search into fuzzy search fields for this reason. Additionally, as the query is run based on user input from the frontend, restrictions are applied to ensure only public information is made available.
Specifying autosuggest behaviour
In the same way as ep_integrate
can be passed to any query class, you can pass the parameter autosuggest
along with the s
parameter (or search
for user and term queries):
$posts = new WP_Query( [
'autosuggest' => true,
// A partial search term.
// Setting `s` will cause `ep_integrate` to be added and set to true.
's' => 'str',
] );
The autosuggest
parameter defaults to true in the following circumstances:
- If the
DOING_AJAX
constant is defined andtrue
, to allow for search as you type functionality - Media library searches
- User searches
- Term searches
Modifying autosuggest behaviour
Element selector
By default, ElasticPress will listen on .ep-autosuggest
, input[type="search"]
, and .search-field
elements. This will match the
built-in search widget and search form block.
In some cases, this can interfere with other inputs on your site. This behaviour can be changed to match your theme by filtering
the ep_autosuggest_default_selectors
filter:
add_filter( 'ep_autosuggest_default_selectors', function ( string $selectors ) {
return '.my-search-input, input[type="search"].autosuggest';
} );
Altering search fields
By default, autosuggest will search against fields in the same way as a regular search query. In addition, fuzziness is applied to the fields using an n-gram model to account for partial inputs.
By default only a subset of fields are analysed for autosuggest searches, but this can be filtered to add additional fields for each indexable object type.
altis.search.autosuggest_post_fields : array
defaults to post_title
.
altis.search.autosuggest_term_fields : array
defaults to name
.
altis.search.autosuggest_user_fields : array
defaults
to user_nicename
, display_name
, user_login
, meta.first_name.value
, meta.last_name.value
and meta.nickname.value
.
Note: if the above filters are used the site content will need to be re-indexed for autosuggestions to work properly.
Modifying the query
Autosuggest queries can be modified using the low-level altis.search.autosuggest_query
filter, which provides the full
Elasticsearch query.
For example, to exclude any posts with post meta of _hide
set to 1
:
add_filter( 'altis.search.autosuggest_query', function ( array $query ) : array {
$query['post_filter']['bool']['must_not'] = [
[ 'term' => [ 'post.meta._hide.raw' => '1' ] ]
];
return $query;
} );
As autosuggest queries are sent from the client side, the post_filter
part of the query is hard coded to only allow publicly
searchable posts with the status publish
to be returned.
To alter this behaviour, you can manually override the field via the altis.search.autosuggest_query
filter:
add_filter( 'ep_term_suggest_post_status', function ( array $query ) : array {
$query['post_filter']['bool']['must'][0]['term']['post_status'] = [
'publish',
'my_custom_status',
];
return $query;
} );