Try 14 days free
Skip to content

Search vs filtering on WooCommerce category archives

A category page is not a search engine. The visitor is already in “Men > Sneakers” and wants to narrow that collection by size, color, and price. The search bar in the header does the opposite: free text across the whole catalog, and often across pages and posts as well. InstantFilter keeps those jobs apart. It makes WooCommerce archives filterable immediately, including a search field that only searches the products of that archive, without replacing the header search bar and without starting a SQL query on every click.

What is the difference between search and filtering in WooCommerce?

Search starts with an empty field and an unknown collection. The visitor types “blue running shoe size 42” and expects the shop to guess what they mean: synonyms, typos, relevance across the whole catalog. That is a retrieval problem. WordPress solves the default variant with the query parameter s and a LIKE across post_title and post_content. Dedicated search plugins build their own index around that, with weights per field and sometimes fuzzy matching.

Filtering starts with a collection that is already fixed. The URL is a category, a tag, a brand, or another product archive. The visitor chooses known values: size 42, color blue, price up to €120. That is a set operation, not a free-text search. Every click should show the intersection of those facets, with a count next to options that still yield something after that.

Those two paths run side by side in a shop, not through each other:

  • Header search bar (sitewide search). Free text across the catalog. The destination is usually a search results page. A search plugin remains responsible for this.
  • Category archive (filtering). The visitor browses within one branch of the catalog. Facets, price, and sorting belong here—not a second search engine that walks the whole database again.

The confusion arises because both can have an input field. YITH Ajax Product Filter is an archive filter; YITH WooCommerce Ajax Search is a search plugin. Those are two products. Anyone who searches for “yith woocommerce ajax search” and then installs a filter plugin on the category page is solving the wrong problem. The InstantFilter comparison with the filter product is on InstantFilter vs YITH Ajax Product Filter.

Why does a search engine not belong on your category archive?

A category archive already has the collection. WooCommerce has already decided via the taxonomy query which products belong to “Sneakers”. Starting a sitewide search at that point throws that boundary away or stacks a heavy text query on top of it. The result is slow, and the visitor sees products that fall outside the category—or too few—because a title does not contain the word they filtered on.

Classic AJAX filters make it worse. Every click on “Size 42” sends a request to admin-ajax.php. WordPress boots, WooCommerce builds a tax_query and often a meta_query, and MySQL joins wp_postmeta. That costs 800ms to 2.5 seconds. A search plugin that also queries the database on every keystroke on the same archive page occupies the same PHP workers. During a peak, not only the filtering visitor waits, but also someone who is checking out.

Facets are not meant to be search results. “Blue (14)” is a count of the intersection with the other chosen filters, within this archive. A full-text engine ranks documents by relevance. Those two answers look similar in the interface and are technically something else. Relevance ranking on a category page hides products that are size 42, because their title looks less like the search term. A facet shows them.

A concrete example. A visitor is on “Sneakers” and wants blue size 42. In a search widget on that same page they type “blue 42”. The search plugin ranks the whole catalog—or at best the category—by text match. A sneaker that is blue and 42 in its attributes, but is only called “Roadrunner” in the title, sinks or disappears. Another sneaker with “blue” in the product description and size 44 floats to the top. Then they still click a facet, and that click starts a second round of SQL. Two systems answer one intersection, and both load PHP.

The same archive with an archive filter works differently. Size and color are values already attached to the product. The intersection is exact: every product that has both values counts, whether or not the word appears in the title. The search field in the filter bar is there for the moment the visitor does know a name within this category (“Roadrunner”), not to replace the facet logic. That name is matched against the products of this archive, not against the rest of the site.

SEO suffers when the archive HTML depends on a search response. Googlebot must see the products of that category on /product-category/sneakers/, server-side rendered, with links and prices. A page that only fills a grid after a JavaScript search returns an empty or incomplete archive to the bot. The architecture behind that is covered in the guide AJAX vs frontend-first filtering.

How does the header search bar differ from a filter on a category page?

The header search bar is sitewide. The visitor does not know the category yet, or they want a single SKU number. The query may find products, and with a broad search plugin pages as well. The index lives on the server, because the collection is the whole site and ranking is computed per request. Plugins such as Relevanssi or ElasticPress belong in that bar. InstantFilter does not take that place.

A category page is already a query. The term, the children of that term, and the pagination are fixed before anyone touches a filter. What changes afterward is the intersection: which of those products are size 42 and blue. The browser can do that once it has the archive data, without asking the header search index.

Header search barCategory archive
Starting pointEmpty field, whole siteURL of a category, tag, or brand
Question“Find something that matches this”“Keep only these values”
CollectionCatalog, sometimes pages tooOnly products in this archive
AnswerRelevance listIntersection plus facet counts
Right toolSearch plugin in the headerArchive filter, such as InstantFilter

If you build the archive in Elementor or Bricks Builder, that separation stays the same. The page builder is the shell. Filtering does not belong in a heavy builder loop, and the header search bar should not be mimicked in that loop with an AJAX search widget on every category.

What does the search field in the InstantFilter filter bar actually do?

InstantFilter does have a search field, but it sits in the archive filter bar, not in the header. In the markup the field is called instant-filter-search (id if-filter-bar-input). The default placeholder is “Search by product name or filter…”. That field searches the products of the current archive.

After hydration that happens in the browser. The engine keeps contextItems: the products that belong to this category, tag, or other product archive. A listing with “respect context” limits that set to the current term and the child terms, via if_terms_map. Typing filters that set. The query is split into tokens and compared with a search index built per product from the title and the facet labels. Input waits 140ms after the last keystroke, so not every letter walks the whole set again. After that the same intersection applies as for a facet click: only products that match both the text and the chosen filters. The first page of that intersection is shown. That is not a request to admin-ajax.php and it costs no SQL.

On the server path, before that hydration or via the archive API, the same boundary applies. A submitted search term narrows the already bounded archive query: a LIKE on the title in if_strings or on the item slug. Not on blog posts, not on pages, and not detached from the archive taxonomy. The first HTML of the category stays server-side rendered, so the category URL remains an archive for search engines.

Suggestions under the field and chips above the grid belong to that same archive. A suggestion selects a facet value in this set. A chip removes that choice again. Neither opens a sitewide search results page.

How do a search plugin and an archive filter keep working side by side?

Leave the search plugin in the header. Leave InstantFilter on the archives. They answer a different question, so they do not need to share each other’s index.

  1. Header. The existing search plugin stays on the sitewide bar. It indexes titles, and if you want content and synonyms as well, across the catalog. InstantFilter does not register itself as a replacement for that bar.
  2. Archive. On category, tag, and brand you place the InstantFilter archive: in Bricks one of the four native elements, in Elementor the archive shortcode. You configure the layout of grid, cards, and the search field in the bar via InstantFilter → Layouts, not in a builder loop.
  3. Do not stack. Do not put a second AJAX search widget—such as a filter plugin’s live search—on the category page. JetSmartFilters and similar AJAX filters then still send every change to the server, exactly the latency the archive does not need.
  4. Cache. Because filtering and searching in the bar happen in the browser after hydration, the category HTML stays cacheable. How that works with WP Rocket, Redis, LiteSpeed, and Cloudflare is covered in the guide on WooCommerce filter caching.

Large catalogs do not change this separation. Even with tens of thousands of SKUs, the header search bar remains a server index, and the archive a bounded set that the browser filters. Above roughly 100,000 SKUs the JSON codebook can become too large for a slow mobile connection. Then an indexed server solution for the archive is the honest trade-off—not a search engine you put on the category page. In that scenario the header remains the place for free text; only the way the archive itself is narrowed changes.

Which approach belongs with search, and which with a category archive?

Three patterns shops confuse, side by side:

Sitewide searchAJAX filter on the archiveInstantFilter on the archive
PlaceHeaderCategory, often via a filter pluginCategory, tag, brand
CollectionWhole siteArchive, but every click asks the serverOnly the current archive
Text fieldFree search queryOften a second live search to admin-ajax.phpSearch field in the filter bar, on this set
Latency after the first loadServer roundtrip800ms – 2,500ms1.5ms – 5ms
SQL per click or keyYes, on the search indexYes, joins on meta and terms0 in the browser
Facet countsNoYes, via COUNT queriesYes, in memory
Replaces the headerIs the headerNo, but loads the same PHP workersNo

You do not replace the header. You give the archive its own engine.

  1. Leave the search plugin in place. The header keeps doing the sitewide search. Test that bar on a SKU number and on a typo, separate from the category pages.
  2. InstantFilter on the archive. Activate the plugin. The index builds products, terms, and titles into its own tables. The archive gets its codebook from that.
  3. Keep context on. On a category the listing must respect the current archive, including child categories. Otherwise the search field in the bar shows products from outside that branch, and behaves like a stealth sitewide search.
  4. Place it in the builder. In Bricks you drag an InstantFilter element into the category template. In Elementor you place the archive shortcode. The search field, the facets, and the grid come from the Layout Builder.
  5. Verify. Open a category. The first HTML shows products of that category. A click on a facet and a few letters in the filter bar narrow only that set, without a spinner to the server. The number of visible cards should always match exactly the facet count for that intersection, not a search engine relevance score. The header search bar still opens its own results page, even when the archive is already filtered.

Use an archive filter when

  • The visitor is already in a category: size, color, brand, and price are known values, not free text across the whole site.
  • Speed on the archive matters: every click should land in 1.5ms to 5ms, even when dozens of people filter at once.
  • The header search bar already has a search plugin: that stays sitewide; the archive should not run SQL for that again.

Use a search plugin when

  • Someone does not yet know where the product sits: a SKU number, a brand name, or a vague description belongs in the header.
  • You also want to find pages and posts: an archive filter does not search the blog or CMS pages.
  • The catalog sits well above 100,000 SKUs: then the codebook for the archive becomes too heavy for a slow connection, and the trade-off belongs with a server index.

Frequently asked questions about search and filtering in WooCommerce

No. InstantFilter is an archive filter for categories, tags, brands, and other product archives. The search field sits in that archive’s filter bar and only searches the products of that set. The search bar in the header remains a separate search plugin.
YITH WooCommerce Ajax Search is a search plugin for free text, usually from the header. YITH Ajax Product Filter is an archive filter that asks the server on every click. InstantFilter replaces that filter pattern on the archive, not the sitewide search plugin. The comparison with the filter product is on the InstantFilter vs YITH page.
No. After hydration it filters the contextItems of the current archive: the products of this category, tag, or brand, including child terms when the listing respects the WordPress context. On the server path the search term is a LIKE on title or slug within that same archive index, not a search across pages and posts.
Yes. Let that plugin handle the header. Put InstantFilter on the category archives and do not stack a second AJAX search widget on top. Filtering and the search field in the bar then happen in the browser, so the category page stays cacheable.
The category URL itself is server-side rendered with the products of that archive. Search engines see that HTML without using the search field. Narrowing in the browser is the visitor’s interaction, not the content the bot indexes as the archive.

Go deeper into archives and filter architecture

Search in the header and filtering on a category answer a different question. These guides go further on the archive:

Try InstantFilter for 14 days on staging or live. The header search bar stays. Categories respond in milliseconds, with no SQL per click.

Ready to make filtering instant?

Download the free 14-day trial of Pro. No credit card required — test immediately.