{"id":376338,"date":"2026-09-28T07:27:18","date_gmt":"2026-09-28T07:27:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/heurix-search-for-woocommerce\/"},"modified":"2026-09-28T09:51:12","modified_gmt":"2026-09-28T09:51:12","slug":"heurix-search-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/fr.wordpress.org\/plugins\/heurix-search-for-woocommerce\/","author":23573081,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.1","stable_tag":"0.2.1","tested":"7.1.2","requires":"5.9","requires_php":"8.1","requires_plugins":null,"header_name":"Heurix Search for WooCommerce","header_author":"Heurix","header_description":"Replaces WooCommerce native product search with the Heurix engine (typo tolerance, trade synonyms, ranking rules you control) -- without touching your templates, filters or product pages.","assets_banners_color":"283671","last_updated":"2026-09-28 09:51:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/heurix.fr\/en\/woocommerce.html","header_author_uri":"https:\/\/heurix.fr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":52,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"heurix","date":"2026-09-28 09:29:18","revision":3716762},"0.2.1":{"tag":"0.2.1","author":"heurix","date":"2026-09-28 09:51:12","revision":3716816}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3716551,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3716551,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3716551,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.0","0.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3716762,"resolution":"1","location":"assets","locale":"","width":2880,"height":2688},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3716762,"resolution":"2","location":"assets","locale":"","width":2880,"height":730},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3716816,"resolution":"3","location":"assets","locale":"","width":2880,"height":1800}},"screenshots":{"1":"WooCommerce &gt; Heurix Search: your API key (never displayed), your catalog, and\nthe rule packs the engine publishes -- read when you save the key, with the date\nthey were read. The report of the last full indexing run is at the bottom.","2":"When Heurix does not answer, native WooCommerce search serves the shop --\nsilently for your visitors, and no longer silently for you. One line per cause,\nwith how many searches, the first one and the last one, and a button to reset\nthe counter.","3":"A results page, as a visitor sees it. The term was typed with a mistake --\n\"vis hexagonle\" -- and the products found are spelled correctly. Native\nWooCommerce search returns nothing at all for that query, on this same shop."}},"plugin_section":[],"plugin_tags":[282,944,286],"plugin_category":[45],"plugin_contributors":[283097],"plugin_business_model":[],"class_list":["post-376338","plugin","type-plugin","status-publish","hentry","plugin_tags-ecommerce","plugin_tags-search","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-heurix","plugin_committers-heurix"],"banners":{"banner":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/banner-772x250.png?rev=3716551","banner_2x":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/banner-1544x500.png?rev=3716551","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/icon-256x256.png?rev=3716551","icon_2x":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/icon-256x256.png?rev=3716551","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/screenshot-1.png?rev=3716762","caption":"WooCommerce &gt; Heurix Search: your API key (never displayed), your catalog, and\nthe rule packs the engine publishes -- read when you save the key, with the date\nthey were read. The report of the last full indexing run is at the bottom."},{"src":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/screenshot-2.png?rev=3716762","caption":"When Heurix does not answer, native WooCommerce search serves the shop --\nsilently for your visitors, and no longer silently for you. One line per cause,\nwith how many searches, the first one and the last one, and a button to reset\nthe counter."},{"src":"https:\/\/ps.w.org\/heurix-search-for-woocommerce\/assets\/screenshot-3.png?rev=3716816","caption":"A results page, as a visitor sees it. The term was typed with a mistake --\n\"vis hexagonle\" -- and the products found are spelled correctly. Native\nWooCommerce search returns nothing at all for that query, on this same shop."}],"raw_content":"<!--section=description-->\n<p>Heurix Search intercepts WooCommerce product search and replaces the results\nwith ones computed by the Heurix engine -- without touching your templates, your\nfaceted filters or your product pages. Only which products come out, and in\nwhat order, changes.<\/p>\n\n<p><strong>What the plugin does:<\/strong><\/p>\n\n<ul>\n<li>Indexes your published catalog into your Heurix account<\/li>\n<li>Re-syncs each product when it is saved (price, stock, new product)<\/li>\n<li>Replaces native search results with Heurix's, in the relevance order returned<\/li>\n<li>Steps aside silently -- native WooCommerce search, unchanged -- when Heurix is\ntemporarily unreachable<\/li>\n<\/ul>\n\n<p><strong>What the plugin does not do (v0.2.1):<\/strong><\/p>\n\n<ul>\n<li>It does not search variation attributes separately (colour, size): the parent\nproduct is indexed, not each individual variation<\/li>\n<\/ul>\n\n<h4>Compatibility: what has actually been run<\/h4>\n\n<p>The headers above carry only versions that have REALLY BEEN RUN. Recorded on\n22 September 2026, completed on the 23rd.<\/p>\n\n<p>ONE OF THOSE LINES IS LESS PRECISE THAN THE MEASUREMENT, AND THE PARSER IS WHY.\n    Tested up to says 7.1; WordPress 7.1.2 is what ran. Plugin Check 2.1.0 -- the\nofficial wordpress.org tool -- rejects the third number: \"invalid_tested_upto_minor\n[...] should only include major versions 7.1\", an ERROR, measured on this plugin\non 23 September 2026. The exact number is on the WordPress line below.<\/p>\n\n<ul>\n<li>PHP 8.1.34 and 8.5.10: the tests\/ suites, green on both (49 assertions on the\nmorning of 22 September, 59 after the two suites added that day). The version\nannounced before that day was 7.4, and 7.4 had never been run once.<\/li>\n<li>WordPress 5.9 to 7.1.2: RUN. 7.1.1 and 7.1.2 on the circuit-breaker bench\n(MariaDB 12.3.3, and SQLite through the SQLite Database Integration plugin\n3.0.2), then 5.9.18, 6.0.16, 6.1.14, 6.3.12, 6.5.12, 6.7.9 and 6.9.9 on\n23 September 2026, each with a WooCommerce that accepts it, inside a real\nproduct loop. The records carry the version (<code>wordpress.version<\/code>) and the\narchive verified against its published sha1.\nThe lower bound is measured under PHP 8.1, and it is WordPress that sets it,\nnot this plugin: 5.8.17 and 5.6.21 do not start under PHP 8.1, because mysqli\nthrows by default there and their <code>wp-db.php<\/code> does not set\n  mysqli_report( MYSQLI_REPORT_OFF ). That line appears in WordPress 5.9,\nwith the WordPress comment that names PHP 8.1.\nNOT MEASURED: WordPress 5.8 and earlier under a PHP they accept (they go down\nto 5.6.20). That would need a PHP 7.x, ruled out on 23 September -- the\nHomebrew formula has been dead since 2022, it would mean a third-party tap and\none more php-fpm. That gap cannot open on a merchant's site: WordPress refuses\nto activate a plugin whose <code>Requires PHP<\/code> is not satisfied, and ours asks for\n8.1.<\/li>\n<li>WooCommerce 6.1 to 11.1.2: RUN, on 23 September 2026. Thirteen versions played\ninside a real product loop, on WordPress 7.1.2 (tests\/banc-disjoncteur,\n  crochets scenario). What was checked each time: that WooCommerce sets\n  posts_per_page before the plugin reads it, that the Customizer's\n  loop_shop_per_page takes effect, that the order returned by Heurix survives\nthe loop, and that page two returns the next slice.\nThe lower bound is measured, not chosen: 6.0.0 does not hold\n(<code>loop_shop_per_page<\/code> has no effect, page 2 comes out empty), 6.1.0 holds. The\nlines \"WC requires at least: 7.0\" and \"WC tested up to: 9.0\" announced until\n22 September rested on nothing at all.\nNot measured: the intermediate versions of each branch (the runs cover 4.9.5,\n5.9.2, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.5.0, 6.7.0, 6.9.5, 7.0.0, 7.9.2, 8.9.5,\n9.9.7, 10.9.4, 11.1.2), and WooCommerce 3.9.5, which stops on a PHP error\nbefore reaching the measurement.<\/li>\n<\/ul>\n\n<p>What this means for you: on WooCommerce 6.0 or older, Heurix search shows the\nfirst page and returns an empty second one. The plugin does not detect this -- it\ndoes not read the WooCommerce version, only whether it is present.<\/p>\n\n<p>THE TWO BOUNDS GUARD EACH OTHER, AND THAT IS MEASURED. WordPress refuses to\nactivate a plugin whose <code>Requires at least<\/code> or <code>Requires PHP<\/code> is not satisfied --\nverified on 23 September 2026, both ways:<\/p>\n\n<pre><code>\"Current WordPress version (6.9.9) does not meet minimum requirements\n [...] The plugin requires WordPress 7.1.\"\n\"Current versions of WordPress (6.9.9) and PHP (8.1.34) do not meet\n minimum requirements [...] requires WordPress 7.1 and PHP 9.9.\"\n<\/code><\/pre>\n\n<p>So \"Requires at least: 5.9\" is not an idle line. WordPress 5.9 to 6.2 officially\naccept PHP 5.6.20, and we have exercised them only under 8.1 -- but a site on\nPHP 7.x cannot activate this plugin at all, since <code>Requires PHP: 8.1<\/code> forbids\nit. What we have not measured therefore cannot happen on a merchant's site.<\/p>\n\n<p>\"Requires PHP: 8.1\" IS STILL A PRECAUTIONARY BOUND. 8.1.34 and 8.5.10 are\nexercised; nothing below. It is the one holding the whole thing up, and it has\nnever been taken down.<\/p>\n\n<p>A THIRD BOUND, DECLARED ON PURPOSE: WooCommerce MUST BE ACTIVE TO ACTIVATE THIS\nPLUGIN, on WordPress 6.5 and later. That is the plugin dependency header, added\nat the request of the wordpress.org review. Two things it is worth knowing,\nmeasured on 27 September 2026:<\/p>\n\n<ul>\n<li>WordPress resolves the dependency by the NAME OF THE INSTALLED FOLDER, not by\nWooCommerce itself. If your WooCommerce lives in a folder that is not called\n  woocommerce, WordPress will refuse to activate this plugin even though\nWooCommerce is running and the plugin would work. Rename the folder to\n  woocommerce, or install WooCommerce from wordpress.org.<\/li>\n<li>A plugin that is ALREADY ACTIVE is not deactivated if the dependency stops\nbeing satisfied. Upgrading to a version carrying this header cannot turn your\nsearch off.<\/li>\n<\/ul>\n\n<p>On WordPress 5.9 to 6.4 the header does nothing at all -- it is ignored in\nsilence, and does not even show on the Plugins screen. There, as before, the\nplugin activates without WooCommerce and simply does nothing: it tells you so on\nthe Plugins screen, and native WooCommerce search is untouched.<\/p>\n\n<h4>Requirements<\/h4>\n\n<p>An active Heurix account, with a server API key (prefix <code>hx_<\/code>) and a catalog\ncreated. See <a href=\"https:\/\/heurix.fr\/en\/docs.html\">heurix.fr\/docs<\/a> to get started.<\/p>\n\n<h4>The external service, what it costs, and what it receives<\/h4>\n\n<p>This plugin is an interface to Heurix, a hosted search service\n(https:\/\/heurix.fr). Ranking, typo tolerance and trade synonyms are computed by\nthe service; the plugin handles indexing and the replacement of results.<\/p>\n\n<p><strong>No feature of the plugin is locked, time-limited, or held back for a paid\nversion.<\/strong> All the code shipped is active from activation onwards, with no\nlicence key and no subscription check, and the zip contains no dormant code\nwaiting to be unlocked. What you pay for is the service, not the plugin.<\/p>\n\n<p>Service pricing, as of 23 September 2026: from EUR 19 excl. VAT per month on\nmonthly billing, with a 14-day free trial and no credit card required (see\n<a href=\"https:\/\/heurix.fr\/en\/pricing.html\">heurix.fr\/pricing<\/a>). <strong>The trial is not a\nsandbox<\/strong>: it is the full service, and the same API key keeps working unchanged\nonce you subscribe. No feature appears or disappears at that point.<\/p>\n\n<p>Terms of Service: https:\/\/heurix.fr\/en\/cgv.html<\/p>\n\n<h4>What is sent to Heurix, and when<\/h4>\n\n<p>Nothing leaves your site until you have entered your API key on the\nWooCommerce &gt; Heurix Search settings page. Entering it is what grants consent;\nwithout it the plugin opens no outbound connection at all.<\/p>\n\n<p>At indexing time (manually, then whenever a published product is saved or\ndeleted), for each product: its WooCommerce ID, its SKU, its name, its\ndescription, its stock state, its price, its public URL, its brand and its main\ncategory.<\/p>\n\n<p>On each visitor search: the term typed, the number of results requested and the\npagination offset. <strong>Nothing else.<\/strong> The plugin sends no IP address, no visitor\nID, no cookie and no browser header, and it does not read <code>$_SERVER<\/code>. Every\nrequest leaves from the WordPress server; the visitor's browser never contacts\nHeurix and never sees the API key.<\/p>\n\n<p>Privacy policy: https:\/\/heurix.fr\/en\/privacy.html<\/p>\n\n<p>If the service stops responding, native WooCommerce search takes back over\nautomatically: the shop stays usable without an active subscription.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>heurix-search<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin from the WordPress Plugins menu<\/li>\n<li>Go to WooCommerce &gt; Heurix Search<\/li>\n<li>Enter your API key and your catalog name<\/li>\n<li>Test the connection, then run a full indexing<\/li>\n<li>Run a search on your shop to check the result<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20happens%20if%20heurix%20is%20unavailable%3F\"><h3>What happens if Heurix is unavailable?<\/h3><\/dt>\n<dd><p>Native WooCommerce search takes back over automatically -- visitors see no\noutage.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20modify%20my%20woocommerce%20products%3F\"><h3>Does the plugin modify my WooCommerce products?<\/h3><\/dt>\n<dd><p>No. It reads your products in order to index them on the Heurix side, but it\nnever writes to your WooCommerce database.<\/p><\/dd>\n<dt id=\"is%20my%20api%20key%20exposed%20to%20visitors%27%20browsers%3F\"><h3>Is my API key exposed to visitors' browsers?<\/h3><\/dt>\n<dd><p>No. Every request to Heurix leaves from the WordPress server, never from the\nvisitor's browser.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.1<\/h4>\n\n<p><strong>Your search page says what was searched again.<\/strong><\/p>\n\n<p>Since 0.2.0, a results page served by Heurix announced an empty search. The\nterm was missing from the page title, from the heading, from the breadcrumb,\nfrom the RSS feed -- and, worst of all, from the search box itself: a visitor\nwho mistyped could not correct the query, they had to retype it. Measured on\n28 September 2026 on two themes, one block-based and one classic, pages 1 and 2.<\/p>\n\n<p>The cause: to stop WordPress from adding its own <code>LIKE %term%<\/code> to the list of\nproducts Heurix returned -- which would have dropped exactly the results the\nengine is paid to find, the ones matched by synonym or despite a typo -- the\nplugin emptied the search term from the query. Everything that displays the\nterm reads it from there.<\/p>\n\n<p>It now empties the SQL clause instead of the term. The database query is\nbyte-for-byte identical; only the page changed.<\/p>\n\n<p>One thing it did NOT affect, and it is the unpleasant part: a search where\nHeurix found NOTHING was always correct. The bug only showed when the plugin\nwas doing its job.<\/p>\n\n<h4>0.2.0<\/h4>\n\n<p>First release on wordpress.org. 0.1.0 was never published here; what follows is\nwhat changed since it. If you are installing for the first time, read it as a\ndescription of what the plugin does.<\/p>\n\n<p><strong>What it does when Heurix does not answer<\/strong><\/p>\n\n<ul>\n<li>Native WooCommerce search takes over, one search at a time, as it already\ndid -- and you can now SEE it happen. WooCommerce &gt; Heurix Search lists the\nsearches that were served by native search instead of Heurix: a count, the\nfirst one and the last one, for each of four causes (all call slots taken,\ncircuit breaker open, call failed, rejected by the engine). A button resets\nthe counter. In 0.1.0 this was invisible: a shop could run for weeks on\nnative search without anything saying so.<\/li>\n<li>At most two searches wait for Heurix at the same time; a third one goes\nstraight to native search. Without that limit, a Heurix that was slow but\nalive saturated the shop: six simultaneous searches held the five processes\nof a default PHP-FPM pool for three seconds, and a page that searched\nnothing waited 2.8 seconds for its turn.<\/li>\n<li>The circuit breaker opens after 2 failed searches within 60 seconds, and\nstays open for 60 seconds. 0.1.0 needed 3.<\/li>\n<li>The search timeout is a setting now, 3 seconds by default. Past it, that\nsearch is answered by native WooCommerce search. In 0.1.0 the 3 seconds\nwere fixed in the code.<\/li>\n<li>WordPress on SQLite works -- WordPress Playground, or the SQLite Database\nIntegration plugin. Both mechanisms above need MySQL features that SQLite\ndoes not have, and they fall back to a form it does. Before, the two call\nslots looked permanently taken there and NO search ever reached Heurix.<\/li>\n<li>When the engine rejects your API key or your catalog, a notice says so on\nyour product screens, with the count and the date of the last one. Same for\nan indexing run that was rejected. You no longer have to open the settings\npage to find out.<\/li>\n<\/ul>\n\n<p><strong>What it shows you<\/strong><\/p>\n\n<ul>\n<li>The rule packs on the settings page are the list published by the engine,\nread when you save your key, with the date it was read and a button to read\nit again. A pack name you typed that the engine does not list is shown as\nsuch. In 0.1.0 the field was free text and the readme sent you to your\nHeurix console.<\/li>\n<li>The indexing report says how many products were processed, how many failed,\nthe cause of the first failure, and whether the run stopped there.<\/li>\n<\/ul>\n\n<p><strong>What it supports<\/strong><\/p>\n\n<ul>\n<li>Result pages past the first hundred. 0.1.0 asked Heurix for the first 100\nproducts on every page and let WordPress paginate inside them: at 16 per\npage you got 7 pages and then a 404, on a catalog where the engine had\nfound 3,334 matches. Heurix now serves the page you asked for, and the\nresult count shown is the engine's total, not the size of one page.<\/li>\n<li>A shop that shows more than 100 products per page, or \"show all\": the\nsearch page falls back to 100, which is the engine's own ceiling. In 0.1.0\nevery single one of those searches fell back to native search.<\/li>\n<li>Declared compatibility is measured now, not hoped: WordPress 5.9 to 7.1,\nWooCommerce 6.1 to 11.1.2, PHP 8.1 and 8.5. Each lower bound is the version\nwhere the plugin stops working, found by trying them one at a time -- the\nsection \"Compatibility: what has actually been run\" says what was run and\non what. 0.1.0 announced WordPress 6.0, WooCommerce 7.0 and PHP 7.4; none\nof the three had ever been run.<\/li>\n<li>Every screen of the plugin, and this page, are in English. 0.1.0 was in\nFrench.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: search interception, initial batch indexing, automatic re-sync on save and on delete, a circuit breaker (3 consecutive failures, network and 5xx only, reset after 60 seconds) that degrades immediately to native search during an outage, and a settings page.<\/li>\n<\/ul>","raw_excerpt":"Replaces WooCommerce product search with the Heurix engine: typo tolerance, trade synonyms, ranking rules you control.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376338"}],"author":[{"embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/heurix"}],"wp:attachment":[{"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376338"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376338"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376338"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376338"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376338"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}