WooCommerce 11.1 wraps search_products() OR conditions in parentheses so include, exclude, status, and type clauses apply to every search group. That correction can expose assumptions in multilingual extensions that add translation joins, language conditions, fallback titles, SKU matches, or broad OR fragments. Results may change by locale, role, stock state, or cache even when the search box appears unchanged.
Use this for WPML, Polylang, custom translation tables, wholesale catalogs, memberships, search extensions, product tables, autocomplete, feeds, and APIs that depend on WooCommerce product search internals.
Quick answer
Build a fixed bilingual catalog where the same term appears in a source title, translated title, SKU, hidden product, out-of-stock item, private product, parent, and variation. Capture prepared SQL, parameters, joins, ordered product IDs, counts, timing, current language, fallback policy, and cache state before and after 11.1. Classify every changed ID. Fix multilingual filters with explicit parenthesized groups instead of appending an unowned OR condition that can escape visibility or language rules.
Test scenarios to run
Run the same controlled fixture across these branches. Write down the expected result before testing so a surprising response is easy to identify.
| Scenario | Fixture | Expected result |
| English guest | blue in title and SKU | Public English IDs only |
| Spanish guest | azul translated title | Public Spanish IDs only |
| Fallback locale | Translation missing | Owned fallback policy |
| Wholesale role | Private price catalog | Role and language both apply |
Diagnostic table
Use this table to connect the observed behavior to evidence and a verification step.
| Action | Evidence to collect | How to verify |
| Freeze bilingual fixtures, expected ordered IDs, roles, and fallback rules. | Inventory filters touching search_products(), posts clauses, product IDs, translation joins, language terms, visibility, status, stock, and SKU. | Generated SQL contains owned parenthesized search and language groups. |
| Capture old and new SQL with every active filter callback and cache key. | Create stable source-language and translated fixtures with deliberate term overlap across titles, slugs, SKUs, parents, and variations. | Guest, wholesale, private, stock, parent, and variation fixtures return expected IDs. |
| Rewrite multilingual conditions as explicit parameterized Boolean groups. | Capture prepared SQL, bindings, active callbacks, ordered IDs, totals, timing, and cache keys for each locale and role. | Autocomplete, archives, APIs, feeds, and analytics reconcile by locale. |
| Clear language and search caches, then retest every downstream surface. | Compare guest, customer, wholesale, administrator, current-language, fallback-language, hidden, private, and out-of-stock contexts. | No extension restores accidental precedence with an ungrouped raw OR fragment. |
What to check first
- Inventory filters touching search_products(), posts clauses, product IDs, translation joins, language terms, visibility, status, stock, and SKU.
- Create stable source-language and translated fixtures with deliberate term overlap across titles, slugs, SKUs, parents, and variations.
- Capture prepared SQL, bindings, active callbacks, ordered IDs, totals, timing, and cache keys for each locale and role.
- Compare guest, customer, wholesale, administrator, current-language, fallback-language, hidden, private, and out-of-stock contexts.
- Trace result IDs into autocomplete, archives, REST, product tables, feeds, analytics, and canonical URLs.
Field notes
- Use synthetic IDs and examples that can be traced from the first request or interaction to the final record.
- Keep a before and after result for every changed setting, package, selector, route, or deployed version.
- Separate user-visible success from internal success so a green interface cannot hide a failed request or inaccessible control.
- Review the evidence after caches, queues, browser history, and scheduled work have had time to settle.
Useful command or data shape
Adapt paths, IDs, and privacy handling to the site before running commands or storing data on production.
-- Intended shape
WHERE status = 'publish'
AND language = 'es'
AND visibility = 'public'
AND (translated_title LIKE '%azul%' OR sku LIKE '%azul%')
AND stock_status = 'instock'
expected_ids: 201|208
Why this usually happens
- A translation plugin appends OR translated_title LIKE without grouping it under visibility and language clauses.
- Language and product-result caches use different locale identifiers.
- Parent and variation translations join differently across search surfaces.
- Autocomplete and archive queries run different filters but share a visible count.
Decision rule
Approve the update when every changed result has an explained policy reason, language and visibility rules apply to all search terms, and every customer-facing search surface agrees on IDs and counts.
Production verification checklist
- Generated SQL contains owned parenthesized search and language groups.
- Guest, wholesale, private, stock, parent, and variation fixtures return expected IDs.
- Autocomplete, archives, APIs, feeds, and analytics reconcile by locale.
- No extension restores accidental precedence with an ungrouped raw OR fragment.
Safe fix order
Use a sequence that makes each result easy to prove. Stop when new evidence changes the scope or owner of the problem.
- Freeze bilingual fixtures, expected ordered IDs, roles, and fallback rules.
- Capture old and new SQL with every active filter callback and cache key.
- Rewrite multilingual conditions as explicit parameterized Boolean groups.
- Clear language and search caches, then retest every downstream surface.
- Monitor zero-result rate, unauthorized visibility, locale mixing, and search conversion.
Mistakes to avoid
- Changing production before recording exact versions, UTC timestamps, settings, stable fixture IDs, and a reproducible baseline.
- Treating one successful screen as proof that keyboard access, APIs, caches, jobs, reports, analytics, and downstream records agree.
- Testing only an administrator session instead of the devices, roles, networks, locales, and failure branches customers use.
- Closing the work without a named owner, rollback point, observation window, and contextual incoming link from an established guide.
Questions teams ask during testing
Can this be tested on production?
Use production for read-only checks and one narrow synthetic fixture that cannot charge a card, send customer email, expose personal data, or change inventory. Run upgrades, package changes, cache changes, and destructive repairs on staging first.
What evidence should the test report keep?
Keep exact versions, UTC timestamps, stable synthetic IDs, expected and actual results, screenshots or response excerpts, the decision owner, rollback point, and final verification. Redact credentials, tokens, customer data, private addresses, and infrastructure details.
How long should the observation window stay open?
Keep it open long enough to include at least one cache cycle, scheduled job cycle, and representative traffic period. For release changes, include logged-in and logged-out use plus the first real operational handoff.
When is the task complete?
Complete it when the primary user path passes, downstream records reconcile, failure branches are understood, monitoring is active, and an established owner page links to this guide in context.
What to tell the client or owner
Give the site owner the affected versions, exact synthetic fixture, UTC timeline, before and after evidence, cause class, decision, rollback point, unresolved risks, and next review date. State which measurements prove success and which observation window remains open.
When HandL WP should help
Bring in help when this affects leads, checkout, search visibility, security, paid media reporting, or a client production site. HandL WP can trace the issue through WordPress, hosting, cache, tracking, and Search Console, then verify the workflow after the technical fix.
If this is active on a production site, debug multilingual WooCommerce search.
Related HandL WP guides
Use these related guides when the same issue touches tracking, security, checkout, or crawler visibility.
Helpful references