{"id":366775,"date":"2026-09-15T08:44:49","date_gmt":"2026-09-15T08:44:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/smart-product-filter-for-woocommerce\/"},"modified":"2026-09-16T11:36:59","modified_gmt":"2026-09-16T11:36:59","slug":"catcode-smart-filter","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/catcode-smart-filter\/","author":23504569,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"CatCode Smart Filter for WooCommerce","header_author":"CatCode","header_description":"Faceted product filter that stays fast on a large catalogue: its own index table instead of attribute meta queries, honest counters, merging of duplicate values (\"12 V\" \/ \"12v\") and numeric sorting. Applies without a page reload, with a mobile drawer and a price slider.","assets_banners_color":"ffffff","last_updated":"2026-09-16 11:36:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/catcode.com.ua\/modules\/smart-filter-woocommerce\/","header_author_uri":"https:\/\/catcode.com.ua","rating":0,"author_block_rating":0,"active_installs":0,"downloads":56,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"catcodestudio","date":"2026-09-16 11:36:59","revision":3698448}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3698448,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3698448,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3698448,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3698448,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3698448,"resolution":"1","location":"assets","locale":"","width":1120,"height":430},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3698448,"resolution":"2","location":"assets","locale":"","width":585,"height":996},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3698448,"resolution":"3","location":"assets","locale":"","width":1120,"height":490},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3698448,"resolution":"4","location":"assets","locale":"","width":1120,"height":470}},"screenshots":{"1":"The filter block on a shop page","2":"The mobile view: the filter panel opens from the \"Filters\" button","3":"Facets in the admin: source, widget, logic and order","4":"The index tab"}},"plugin_section":[],"plugin_tags":[270234,28913,237179,6033,286],"plugin_category":[45],"plugin_contributors":[271712],"plugin_business_model":[],"class_list":["post-366775","plugin","type-plugin","status-publish","hentry","plugin_tags-attribute-filter","plugin_tags-faceted-search","plugin_tags-price-filter","plugin_tags-product-filter","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-catcodestudio","plugin_committers-catcodestudio"],"banners":{"banner":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/banner-772x250.png?rev=3698448","banner_2x":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/banner-1544x500.png?rev=3698448","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/icon-128x128.png?rev=3698448","icon_2x":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/icon-256x256.png?rev=3698448","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/screenshot-1.png?rev=3698448","caption":"The filter block on a shop page"},{"src":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/screenshot-2.png?rev=3698448","caption":"The mobile view: the filter panel opens from the \"Filters\" button"},{"src":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/screenshot-3.png?rev=3698448","caption":"Facets in the admin: source, widget, logic and order"},{"src":"https:\/\/ps.w.org\/catcode-smart-filter\/assets\/screenshot-4.png?rev=3698448","caption":"The index tab"}],"raw_content":"<!--section=description-->\n<p>Most WooCommerce filters ask the database the same expensive question on every click \u2014 join the attribute tables, join the meta tables, count. On a catalogue of a few thousand products that question takes seconds, and the shopper leaves before the answer arrives.<\/p>\n\n<p>This plugin keeps its own flat index of \"which product carries which value\", rebuilt in the background and kept current by every product save. Filtering reads that one table, so the query cost stops growing with the number of attributes.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Facets from product attributes, from any product taxonomy (categories, tags, brands) and from a custom field.<\/li>\n<li>Checkboxes, radio buttons, a select, a range slider or a toggle \u2014 per facet.<\/li>\n<li>Price slider in the shop's display currency, an \"in stock \/ out of stock\" facet and a rating facet.<\/li>\n<li>Honest counts next to every value: a count tells you what you will get, and the value you already picked keeps showing its siblings instead of collapsing to itself.<\/li>\n<li>Values with no products are hidden \u2014 or shown greyed out, if you prefer the shopper to see the whole range.<\/li>\n<li>Numeric values sort as numbers: <code>1.5 \/ 2 \/ 10 \/ 12.5<\/code>, not the alphabetical <code>1.5 \/ 10 \/ 12.5 \/ 2<\/code> every term-sorted filter shows.<\/li>\n<li>Applying a filter does not reload the page: the listing and the filter block are swapped in place and the URL goes into the browser history, so Back works and the link can be copied and shared.<\/li>\n<li>Mobile drawer with a \"Show N products\" button, so the count is visible before the tap.<\/li>\n<li>Chips for what is currently applied, with a one-click reset.<\/li>\n<li>Readable URLs: <code>?ccf=pa_color:\u0447\u0435\u0440\u0432\u043e\u043d\u0438\u0439;p:100-2500<\/code> \u2014 one state has exactly one URL, so nothing turns into a duplicate.<\/li>\n<li>Crawl control out of the box: a filtered view is <code>noindex,follow<\/code> with a canonical back to the clean archive, and the shop keeps its crawl budget.<\/li>\n<li>Placement as a widget or through the <code>[catcode_filter]<\/code> shortcode.<\/li>\n<li>Works with the theme's own product grid \u2014 the swapped selector is a setting, <code>ul.products<\/code> by default.<\/li>\n<li>Merging duplicate values: <code>12 \u0412<\/code>, <code>12\u0432<\/code> and <code>12 V<\/code> become one checkbox while the products keep their own terms.<\/li>\n<li>As many facets as your catalogue needs \u2014 nothing here is capped or time-limited.<\/li>\n<li>HPOS (custom order tables) compatible.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WooCommerce 6.0 or newer<\/li>\n<li>WordPress 6.2 or newer<\/li>\n<li>PHP 7.4+<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/catcode-smart-filter\/<\/code><\/li>\n<li>Activate it in the \"Plugins\" menu<\/li>\n<li>Go to WooCommerce \u2192 Smart Filter \u2192 Facets and import the attributes you want to filter by<\/li>\n<li>Open the \"Index\" tab and press \"Rebuild the index\" once<\/li>\n<li>Place the block: the \"CatCode: Smart Filter\" widget, or the <code>[catcode_filter]<\/code> shortcode<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"the%20filter%20block%20does%20not%20appear\"><h3>The filter block does not appear<\/h3><\/dt>\n<dd><p>It renders only where a product listing does \u2014 the shop, a product category or tag archive, and product search results. Check that a facet is imported and active, and that the index has been built at least once (WooCommerce \u2192 Smart Filter \u2192 Index).<\/p><\/dd>\n<dt id=\"clicking%20a%20value%20reloads%20the%20whole%20page\"><h3>Clicking a value reloads the whole page<\/h3><\/dt>\n<dd><p>The AJAX swap needs to know which element holds the product grid. Most themes use <code>ul.products<\/code>, which is the default; if yours does not, put its selector into \"Product grid selector\" in the settings.<\/p><\/dd>\n<dt id=\"the%20counts%20do%20not%20match%20the%20listing\"><h3>The counts do not match the listing<\/h3><\/dt>\n<dd><p>Press \"Rebuild the index\". A count and a listing can only disagree when the index is behind the catalogue \u2014 after a bulk import that wrote to the database directly, for example.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20a%20page%20cache%3F\"><h3>Does it work with a page cache?<\/h3><\/dt>\n<dd><p>Yes. Filtered views carry a query string, so they are served fresh; the clean archive stays cacheable. The counts have their own cache with a lifetime you set.<\/p><\/dd>\n<dt id=\"will%20google%20index%20thousands%20of%20filter%20urls%3F\"><h3>Will Google index thousands of filter URLs?<\/h3><\/dt>\n<dd><p>No. A filtered view is <code>noindex,follow<\/code> with a canonical pointing at the clean archive. Every filtered combination stays out of the index.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"A faceted product filter that stays fast on a large catalogue: its own index table, honest counts and no reload on every click.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/366775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=366775"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/catcodestudio"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=366775"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=366775"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=366775"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=366775"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=366775"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=366775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}