Scry Search: Meilisearch for WordPress
Scry Search is built by developers for developers — but you don’t need to be one to run it.
If you can install a plugin and paste API keys, you can connect Meilisearch, pick post types, index content, tune ranking/filterable fields/synonyms/typo tolerance/weights, and turn on autosuggest from wp-admin. No theme edits required. Existing search forms keep working. WooCommerce products are a first-class post type.
If you are a developer, the same plugin is meant to be extended: scry_ms_* filters/actions, optional window.scrySearch, and a full hook reference in DOCS.md (GitHub). We use this kind of surface on client work and our own products, so the priorities are boring on purpose: stable hook names, easy-to-find call sites, a real docs file, and no forced frontend chrome.
Works from the admin (no code)
- Connection Settings — URL and API keys, with a connection test
- Index Settings — post types, searchable and filterable fields (including meta and taxonomies), ranking rules (including custom attribute:asc/desc), synonyms, stop words, dictionary, and typo tolerance; bulk index / wipe
- Search Settings — post-type weights for federated search, optional autosuggest and matched-term highlighting
- Task drawer, Logs, and Search Analytics for day-to-day ops
Site owners and agencies can go live without custom development. Developers can still hook in when a project needs it.
Headless: no frontend UI required
This plugin does not force a search UI on you. No required shortcode, widget, or results template.
What you get by default is indexing and Meilisearch-backed queries. Autosuggest and highlighting are optional and off unless you turn them on. Keep your theme’s search, or build your own UI against WP_Query / the autosuggest REST endpoint.
Drop-in WordPress search
Scry Search hooks posts_pre_query. Any WP_Query with a search string can go through Meilisearch (main search, programmatic queries, autosuggest) and still return normal WP_Post objects.
- No theme rewrites, no forced shortcodes, no widget lock-in
search.php,searchform.php, core search widgets/blocks, and page-builder search elements keep working if you use them- Opt out per query with
scry_ms_should_searchwhen you need native WP search
Works with Elementor, Divi, Beaver Builder, and similar tools: whatever search box they output still hits WordPress search, which Scry Search routes to Meilisearch.
AJAX autosuggest (optional)
Enable Autosuggest under Scry Search → Search Settings. The plugin attaches debounced AJAX to existing name="s" fields. Suggestions use the same Meilisearch indexes as full-site search. Optional CSS class selector so only the forms you choose get typeahead. Thumbnails supported when a featured image exists.
Shape the result data with scry_ms_autosuggest_results, or the rendered HTML with scry_ms_autosuggest_results_rendered. Leave autosuggest off to stay fully headless.
Per-post-type indexes and federated search
Index any registered post type independently — posts, pages, WooCommerce products, CPTs from other plugins. Each type gets its own Meilisearch index:
- Searchable fields — titles, content, excerpts, taxonomies, author, custom meta (ACF, Meta Box, etc.)
- Filterable fields — post type/status/author, post date, taxonomy IDs (
taxonomies.<name>.id), and more for facets and advanced filters - Ranking rules — drag-and-drop reorder (words, typo, proximity, attribute, sort, exactness) plus custom
attribute:asc/attribute:descrules per index - Search weights — e.g. weight products above blog posts in the merged results
Search uses Meilisearch federated multi-search: indexes queried together, results merged and re-ranked with your per–post-type weights (not a hand-stitched PHP merge).
Relevancy, filtering, and language settings
Per index from the tabbed Index Settings dialog (or via filters):
- Reorder built-in ranking rules and add custom ranking rules
- Choose which attributes are searchable and which are filterable
- Synonyms — nicknames, abbreviations, UK/US spelling, brand aliases
- Stopwords — drop noise terms that shouldn’t affect ranking
- Dictionary — keep acronyms and multi-word brand names from being split during tokenization
- Typo tolerance — enable/disable, min word sizes, and disable on numbers, words, or attributes
- View Raw JSON for each settings group when debugging
WooCommerce
Fully compatible. Select product in Index Settings, choose product fields and meta, set federation weights if you also search posts/pages. Catalog search upgrades; theme and checkout stay as they are. Same hooks as any other post type if you need custom product documents or autosuggest rows.
Search analytics
Scry Search → Search Analytics:
- Dashboard with summary metrics, charts, and recent searches
- Optional IP anonymization / omit identifying fields
- Retention period with daily WP-Cron cleanup, plus a manual “delete old events” button
- CSV export of the analytics table (admin-only, nonce-protected)
- Extra fields via
scry_ms_analytics_event_to_insert(non-column keys go intosearch_metadata)
Task monitor
Task drawer on plugin admin screens:
- Indexing tasks with status, duration, and errors
- Paginated history
- Scoped to indexes this plugin manages (shared Meilisearch instances won’t dump unrelated tasks)
Debug and error logs
Scry Search → Logs:
- Debug and Error levels, filterable in the viewer
- Stored in the database, newest first, load-more paging
- API keys / tokens redacted before storage
- Retention + daily cleanup, or clean up on demand
Automatic and manual indexing
- Auto-index on create/update; remove on trash/delete; re-index on untrash
- One-click bulk index per post type
- Wipe and rebuild when you need a clean slate
- Live search preview from the indexes UI before you ship ranking changes
For developers: hooks and JS runtime
Admin covers setup and tuning. When you need custom behavior, use the public scry_ms_* PHP hooks and the optional window.scrySearch runtime. Call sites are marked //@HOOK: scry_ms_… in source.
Full argument lists, return types, timing, and JS examples: DOCS.md on GitHub (also shipped with the plugin).
Code is split into features/<name>/ packages. Prefer a search-only API key for front-end paths; the shared client factory supports admin vs search.
PHP filters
Indexing and documents:
scry_ms_should_indexscry_ms_should_deletescry_ms_index_prepare_documentscry_ms_index_namesscry_ms_index_searchable_attributesscry_ms_index_filterable_attributesscry_ms_index_filterable_fieldsscry_ms_index_typo_tolerancescry_ms_bulk_index_query_argsscry_ms_bulk_index_batch_sizescry_ms_index_ranking_rulesscry_ms_index_fieldsscry_ms_index_meta_keys
Index settings:
scry_ms_index_settings_ajaxscry_ms_index_settings_backupscry_ms_index_ranking_rules_before_updatescry_ms_index_searchable_attributes_before_updatescry_ms_index_synonyms_before_updatescry_ms_index_stop_words_before_updatescry_ms_index_filterable_attributes_before_updatescry_ms_index_dictionary_before_updatescry_ms_index_typo_tolerance_before_update
Search and client:
scry_ms_should_searchscry_ms_meilisearch_clientscry_ms_multi_search_index_namesscry_ms_multi_search_query_paramsscry_ms_multi_search_queryscry_ms_multi_search_queriesscry_ms_multi_search_federationscry_ms_multi_search_raw_resultsscry_ms_multi_search_final_results
Autosuggest, admin, analytics, logs, window:
scry_ms_autosuggest_queryscry_ms_autosuggest_resultsscry_ms_autosuggest_results_renderedscry_ms_admin_pagesscry_ms_analytics_event_to_insertscry_ms_log_messagescry_ms_window_localizedscry_ms_premium_upgrades_display
PHP actions
scry_ms_after_index_documentscry_ms_after_delete_documentscry_ms_after_bulk_indexscry_ms_after_create_indexscry_ms_index_settings_restorescry_ms_index_update_settingsscry_ms_index_settings_sections_uiscry_ms_premium_upgrade_settings_ui
JavaScript runtime (window.scrySearch)
Optional. Enqueued on the front end (script handle scry_ms_window-script). Wait for the scrySearchReady event on document before using it.
window.scrySearch.versionwindow.scrySearch.getSearchForms()window.scrySearch.getSearchFormsByClass(className)window.scrySearch.registerUpgrade(name, version)— namespace for add-ons underwindow.scrySearch.upgrades
Per form (ScrySearch_SearchForm):
formElement,searchInput,datasubmit(),submitAjax()(debounced)addPreSubmitAction(fn, order)/addPostSubmitAction(fn, order)addPreSubmitAjaxAction(fn, order)/addPostSubmitAjaxAction(fn, order)
A search form is any <form> with role="search" or a text/search input named s. Autosuggest and similar features attach through the AJAX action lists. Details and examples: DOCS.md.
Hosting
- ScryWP Search — managed Meilisearch for WordPress
- Self-hosted — your server, full control
- Local — for development and testing
Enter URL + keys under Scry Search → Connection Settings, pick post types, index, done.
Works with your existing setup
- Theme search templates (
search.php,searchform.php) - Core search widgets and Gutenberg search blocks
- Page builders (Elementor, Divi, Beaver Builder, etc.)
- WooCommerce products and product meta
- Any registered custom post type
- Optional autosuggest / highlighting when you enable them
Get Managed Hosting from ScryWP
Don’t want to run Meilisearch yourself? ScryWP Search is managed hosting aimed at WordPress.
Requirements
- WordPress 5.2 or higher
- PHP 8.1 or higher
- A Meilisearch instance (ScryWP or self-hosted)
Support
Hooks/docs: DOCS.md or GitHub. Issues and questions: same repo or JG Web Development.