Plainseek documentation
Plainseek is a WooCommerce product search that understands plain language. A shopper can type "red dress under $50", and Plainseek finds red dresses that cost less than $50.
This guide explains how to install Plainseek, where the search bar appears, what every setting does, and how to use the optional AI features.
Getting started
Requirements
| Software | Version |
|---|---|
| WordPress | 6.8 or newer |
| WooCommerce | 10.0 or newer |
| PHP | 8.1 or newer |
| Database | The MySQL or MariaDB version your WooCommerce version requires |
AI features are optional. They need an account with an AI provider. See AI features.
Install
- Download the plugin from CodeCanyon. Choose Installable WordPress file only, or unzip the full download and find
plainseek.zipinside. - In WordPress, go to Plugins > Add New Plugin and click Upload Plugin.
- Choose
plainseek.zip, click Install Now, then click Activate.
WooCommerce must be active. If it is not, Plainseek shows a notice and waits.
First steps
- Open Plainseek > Dashboard. Plainseek starts indexing your products in the background as soon as you activate it. The Index card shows the progress. Most stores are ready in a few minutes.
- Look at the Try it box on the Dashboard. Type a search the way a shopper would, for example
cheapest leather boots. You see exactly what shoppers will see. - Visit your store. The theme's search box now uses Plainseek. To place the search bar somewhere else, see The search bar.
The search bar
The search bar shows results while the shopper types: product images, names, prices, categories, and what Plainseek understood from the search. Shoppers can use it with the keyboard only: the up and down arrow keys move through the results, Enter opens one, and Escape closes the list.
Replace the theme search
By default, Plainseek replaces the theme's search form, the core Search block, and the WooCommerce product search. This works in block themes and in classic themes. To turn it off, go to Plainseek > Search > Where the search bar appears.
Block
In the block editor or the Site Editor, add the Plainseek Search block. In the block settings, you can set the placeholder, the size (small, medium, or large), and whether to show the Search button. To put the search bar in your header, open Appearance > Editor, edit the Header template part, and add the block.
Shortcode
Add the search bar anywhere that accepts shortcodes:
[plainseek]
| Option | Values | Example |
|---|---|---|
placeholder | Any text | [plainseek placeholder="Search our shop"] |
size | small, medium, large | [plainseek size="large"] |
button | yes, no | [plainseek button="no"] |
Elementor
In the Elementor panel, search for Plainseek Search and drag the widget onto the page. It has the same options as the block.
How shoppers search
Plainseek reads a search before it runs it. Words that match your store become filters, and the rest is searched as text. Shoppers see what was understood as chips, for example Red Under $50. Clicking a chip removes it.
| Shopper types | Plainseek understands |
|---|---|
| under $50, below 50, less than 50 dollars | Price at most 50 |
| over 100, at least $100, $100+ | Price at least 100 |
| between 20 and 60, $20-$60 | Price from 20 to 60 |
| around $100 | Price from 80 to 120 |
| red, navy blue, leather, xl | Filter by your attribute values. Only values your products use. |
| size m, size 42 | Short or numeric values need their label, so "m" alone is not read as a size |
| A brand name | Filter by brand |
| cheapest, most expensive, newest, best selling, top rated | Sort order |
| in stock, on sale | Only products in stock, or on sale |
Typos, plurals, and synonyms
"weding dersses" finds wedding dresses, and the results say "Showing results for wedding dress". "dresses" also finds "dress". Words from your synonyms find each other, so "couch" can find sofas.
When nothing matches
If a filter leaves no products, Plainseek drops it and says so. For example, if you have no red wedding dresses, "red wedding dress" shows other wedding dresses with the note "No exact match for Red. Showing similar products." Shoppers do not see an empty page.
The results page
When a shopper presses Enter, the normal WooCommerce search results page opens. Plainseek chooses and orders the products, and your theme shows them with its usual templates. The chips appear at the top of the page. If the shopper picks a sort order from the shop's sort menu, that order is used.
Settings
Every screen is under the Plainseek menu. Settings screens show a bar at the bottom of the page when you have unsaved changes.
Search
| Setting | What it does |
|---|---|
| Prices; Colors, sizes, brands, and other attributes; Sort and stock words | Turn each kind of understanding on or off. |
| Typo tolerance | Normal allows 1 typo in short words and 2 in long words. Strict allows 1. Off allows none. |
| Match singular and plural | "dresses" finds "dress". This works for English stores. Changing it rebuilds the index. |
| Ranking weights | How much a match in each field counts. A match in the product name counts more than one in the description. Set a field to 0 to leave it out. Changing weights rebuilds the index. |
| Boost best sellers and top rated products | Popular products rank a little higher. |
| Push out of stock products down | Out of stock products rank lower. To hide them completely, use the WooCommerce setting Hide out of stock items from the catalog. |
| Search bar results | How many products the dropdown shows, and which details it shows. |
| Replace my theme's search | See Replace the theme search. |
Appearance
Choose the accent color, the corner radius, the size, and the placeholder. The text color on the Search button is picked for good contrast automatically. The preview on the right uses your real products.
Leave the placeholder empty to show an example search, such as Try "red dress under $50". This teaches shoppers that they can type plain language.
Synonyms
Synonyms teach Plainseek the words your shoppers use that your products do not.
- Two-way: every word finds the others. Example:
sofa, couch, settee. - One-way: the first word also finds the others, but not the reverse. Example:
laptoptonotebook, macbook. A search for "laptop" finds notebooks, but a search for "notebook" does not show every laptop.
Words and short phrases both work. Changes apply right away, without a rebuild.
Suggested synonyms
When shoppers search for words that find nothing, Plainseek suggests a fix in two ways:
- What shoppers typed next. If a shopper searched "red couch", found nothing, then searched "red sofa" and found products, Plainseek suggests "couch" and "sofa".
- Spelling. If a word is close to a word your products use, Plainseek suggests it.
Click Add synonym to accept a suggestion.
Import and export
The CSV file has one group per line: the type (two_way or one_way), a comma, and the words separated by |.
two_way,sofa|couch|settee
one_way,laptop|notebook|macbook
Analytics
The Analytics screen shows the number of searches, searches with no results, searches that led to a click, a daily chart, top searches, searches with no results, and the most clicked products. Export the list of searches as a CSV file with Export CSV.
Plainseek stores only the search text, the number of results, the clicked product, and the date. It does not store IP addresses or link searches to accounts. Searches by store managers are not counted by default. Bots are not counted. You choose how long data is kept, from 30 days to 3 years.
Tools
| Tool | When to use it |
|---|---|
| Rebuild index | When results look out of date, for example after you imported products directly into the database. |
| Clear cache | Search results are cached for 10 minutes and cleared when products change. Clear the cache if a change does not show. |
| Export and import settings | Save your settings and synonyms to a file, or copy them to another store. API keys are not exported. |
| Delete all Plainseek data when I delete the plugin | Off by default, so nothing is lost if you reinstall. Deactivating the plugin never deletes data. |
| Delete all analytics | Removes every recorded search. This cannot be undone. |
| System status | Versions and table sizes. Include it when you contact support. |
AI features (optional)
Plainseek works fully without AI. AI features add three things:
- Search by meaning. "Something for a beach wedding" finds sundresses and sandals, even when the product text does not contain those words.
- Long questions. A chat model turns a long question into a short search, and both result lists are combined.
- The shopping assistant. See Shopping assistant.
Plainseek does not include or resell any AI service. You connect your own account with an AI provider and pay the provider directly.
What is sent
AI features are off until you turn them on. Before you can turn them on, the AI screen shows this table and asks you to confirm.
| What is sent | To | When |
|---|---|---|
| Product name, categories, brand, attributes, tags, and descriptions | Embeddings provider | Once per product, and again when its text changes |
| The text shoppers type in the search bar | Embeddings provider, and the chat provider for long questions | When a search is not in the cache yet |
| Messages to the shopping assistant, and the parts of the store pages you pick that match the question | Chat provider | When a shopper uses the assistant |
Never sent: customer names, email addresses, orders, addresses, IP addresses, or account data. You can turn AI off at any time with Turn off AI. Nothing is sent after that.
Set up
- Go to Plainseek > AI, read what is sent, tick the box, and click Turn on AI features.
- Under Search by meaning, choose an embeddings provider, paste your API key, and click Test connection. Leave the model empty to use the suggested one, or click Load models to choose another.
- Under Chat model, choose a chat provider. It can be the same provider or a different one.
- Click Save changes. Plainseek starts sending your products to the embeddings provider in the background. The progress bar shows when every product is ready.
Exact words vs. meaning
This slider sets how results are blended. Lower values favor products that contain the typed words. Higher values favor products that match what the shopper means. 50 is a good start.
How AI search stays fast
Keyword results appear at once while the shopper types. When the shopper pauses on a search of two or more words, the search bar asks for AI-refined results and updates the list. Each search is embedded once and cached for 30 days.
Providers
| Provider | Search by meaning | Chat model |
|---|---|---|
| OpenAI | Yes | Yes |
| Google Gemini | Yes | Yes |
| Anthropic Claude | No, Anthropic has no embeddings model | Yes |
| Mistral AI | Yes | Yes |
| Cohere | Yes | Yes |
| Voyage AI | Yes | No |
| Together AI | Yes | Yes |
| DeepSeek, xAI Grok, Groq, OpenRouter | No | Yes |
| Azure OpenAI | Yes | Yes. Enter your resource address, for example https://YOUR-RESOURCE.openai.azure.com/openai/v1, and your deployment names as models. |
| Ollama | Yes | Yes. Runs on your own server, with no data leaving it. Enter the Ollama address, usually http://localhost:11434/v1. |
| Other OpenAI-compatible API | If the API supports it | If the API supports it |
If you pair Anthropic Claude as the chat model, choose another provider for search by meaning, for example Voyage AI or OpenAI.
Cost control
- AI requests per day limits shopper searches and assistant messages. When the limit is reached, search keeps working with keywords only. Indexing products does not count.
- AI searches per visitor per minute stops one visitor or a bot from using up your limit.
- The AI screen shows the estimated size of your catalog in tokens, today's requests, and chat tokens for the last 30 days.
- Products are embedded again only when their text changes. Searches and rewritten questions are cached for 30 days.
Shopping assistant
The assistant is a chat window where shoppers ask for products and get answers about your store. It needs a chat model. See Set up.
- Go to Plainseek > Assistant and turn on Turn on the shopping assistant.
- Choose where it appears: a floating button, an "Ask the assistant" row in the search bar, or both.
- Under Store pages, pick the pages with your policies, such as Shipping, Returns, or FAQ.
- Save, then use the Try it box to ask a question the way a shopper would.
What it knows
- Your products, found with Plainseek's own search.
- Your WooCommerce shipping zones and methods, read automatically.
- The parts of your chosen store pages that match the question.
- Your store name, currency, and contact page (a page with the address
/contactor/contact-us).
How it stays accurate
- It may only recommend products Plainseek found. Product cards show real prices, stock, and an add to cart button from WooCommerce, so it cannot invent a product or a price.
- It answers store questions only from your pages and shipping zones. If the answer is not there, it says it is not sure and points to your contact page.
- Questions that have nothing to do with your store get a short, polite answer.
The conversation is kept in the shopper's browser tab. It is not stored on your server. Only the question text is added to your analytics, and you can turn that off.
Privacy
Plainseek adds suggested text to Settings > Privacy > Policy Guide. Copy the parts that match how you set Plainseek up into your privacy policy.
- Analytics store search text, result counts, clicked products, and dates. No IP addresses, no user accounts.
- The search bar keeps recent searches in the shopper's own browser.
- Visitor limits use a hashed IP address that is kept for one minute only.
- With AI features on, see What is sent.
For developers
Filters
| Filter | Use |
|---|---|
plainseek_document_fields | Add text to a product's index entry, for example a custom field. Give it a weight with plainseek_field_weights. |
plainseek_field_weights | Change or add field weights. |
plainseek_is_searchable | Include or exclude a product from search. |
plainseek_brand_taxonomies | Taxonomies treated as brands. Defaults cover WooCommerce Brands and common brand plugins. |
plainseek_stopwords | Words that are ignored in the index and in searches. |
plainseek_document_language, plainseek_current_language | Language of a product and of the current search. WPML and Polylang are supported automatically. |
plainseek_search_result | Change a search result before it is cached. |
plainseek_search_response | Change the data the search bar receives. |
plainseek_search_config, plainseek_assistant_config | Change the settings passed to the front-end scripts. |
plainseek_replace_search_form | Keep a specific theme search form. |
plainseek_popular_queries | Change the popular searches shown in the empty search bar. |
plainseek_log_search | Skip logging for some searches. |
plainseek_rate_limit, plainseek_visitor_ip | Change request limits, or read the visitor IP from a proxy header. |
plainseek_ai_providers | Add a preset for another OpenAI-compatible provider. |
plainseek_assistant_instructions | Add instructions for the assistant, for example a tone of voice. |
plainseek_assistant_store_facts, plainseek_assistant_contact_url | Change what the assistant knows about the store. |
plainseek_assistant_visible | Show or hide the assistant on a page. |
plainseek_admin_screens, plainseek_settings_rules | For add-ons: add admin screens and settings. |
Example: index a custom field
add_filter( 'plainseek_document_fields', function ( $fields, $product ) {
$fields['designer'] = (string) $product->get_meta( 'designer' );
return $fields;
}, 10, 2 );
add_filter( 'plainseek_field_weights', function ( $weights ) {
$weights['designer'] = 6;
return $weights;
} );
Rebuild the index in Plainseek > Tools after adding a field.
Actions
| Action | Fires when |
|---|---|
plainseek_products_indexed | Products were indexed in the background. Receives the product IDs. |
plainseek_full_index_finished | A full index rebuild finished. |
plainseek_results_page_search | Plainseek ran the search for the results page. Receives the result. |
plainseek_clear_cache | The owner cleared the cache. |
Styling
The search bar and the assistant use CSS custom properties. Override them in your theme:
:root {
--plainseek-accent: #0f766e;
--plainseek-radius: 4px;
--plainseek-bg: #ffffff;
--plainseek-text: #111827;
--plainseek-muted: #6b7280;
--plainseek-border: #d1d5db;
--plainseek-hover: #f3f4f6;
}
REST API
| Endpoint | Use |
|---|---|
GET /wp-json/plainseek/v1/search?q=red+dress | Search. Public. Parameters: q, page, per_page (up to 24), prefix, ai. |
POST /wp-json/plainseek/v1/assistant | Assistant reply. Public when the assistant is on. Body: {"messages": [{"role": "user", "content": "..."}]}. |
/wp-json/plainseek/v1/admin/* | Admin screens. Needs the manage_woocommerce capability. |
Database tables
WordPress recommends few custom tables. Plainseek needs three, because a search index cannot be fast in the posts and meta tables.
| Table | Holds |
|---|---|
{prefix}plainseek_documents | One row per product, with the compressed AI vector when AI is on. |
{prefix}plainseek_postings | The search index: one row per word per product. |
{prefix}plainseek_log | Search analytics. |
Prices, stock, and sales are read from WooCommerce's own wc_product_meta_lookup table, so search never shows an old price.
Troubleshooting
The index stays at 0 or stops
Plainseek indexes with Action Scheduler, which WooCommerce includes. It runs on WP-Cron. If WP-Cron is off on your server (DISABLE_WP_CRON), make sure a real cron job calls wp-cron.php. You can see waiting jobs in Tools > Scheduled Actions, group plainseek. Plainseek > Tools > System status shows whether WP-Cron is on.
A product does not appear in search
- Check that it is published, not password-protected, and that its catalog visibility is Shop and search results or Search results only.
- If WooCommerce hides out of stock items, out of stock products are hidden in search too.
- Use Rebuild index in Tools.
The theme's search box did not change
Some themes build their search form without the standard WordPress functions. Add the Plainseek Search block or the [plainseek] shortcode instead, and hide the theme's own search in the theme options.
"The API key was not accepted"
Check the key and that it has permission for the model. For Azure OpenAI, check the address and use your deployment names as models.
"The provider is limiting requests or the account has no credit left"
Check your balance and rate limits with the provider. Search keeps working with keywords in the meantime. Embedding retries by itself, and Try again now on the AI screen restarts it.
Ollama on the same server cannot be reached
Use the address the web server can reach. In Docker setups this is often http://host.docker.internal:11434/v1 instead of localhost.
Support and changelog
For help, use the Support tab on the Plainseek page on CodeCanyon. Please include the System status from Plainseek > Tools.
Changelog
1.0.0 - 2026-09-25
- First release.