﻿{"id":205,"date":"2026-03-03T09:12:17","date_gmt":"2026-03-03T08:12:17","guid":{"rendered":"https:\/\/baqueiro.es\/store\/?post_type=baqueiro_plugin&#038;p=205"},"modified":"2026-03-05T17:38:18","modified_gmt":"2026-03-05T16:38:18","slug":"b-baqueiro-loop-filter","status":"publish","type":"baqueiro_plugin","link":"https:\/\/baqueiro.es\/store\/plugins\/b-baqueiro-loop-filter\/","title":{"rendered":"[B] Baqueiro Loop Filter \u2014 Live Search Filter for Elementor Loop Grid"},"content":{"rendered":"<section class=\"bq-hero\">\n<h1>Elementor Loop Grid Filtering. Finally, Done Right.<\/h1>\n<p class=\"lead\">Elementor Pro&#8217;s Loop Grid is powerful \u2014 but it has no built-in search or filter widget. Every workaround either breaks pagination, loses the filter on page refresh, or requires a separate plugin with a 200-setting configuration panel. <strong>[B] Baqueiro Loop Filter<\/strong> solves it cleanly: one widget, one setting, zero configuration overhead.<\/p>\n<\/section>\n<section class=\"bq-problem\">\n<h2>The Problem Every Elementor Developer Hits<\/h2>\n<p>You build a Loop Grid to display a custom post type \u2014 team members, properties, courses, products, portfolio items. The client asks: &#8220;Can users search or filter by name?&#8221; You say yes. Then you spend two hours trying to wire up AJAX, figure out why pagination breaks, and explain why the filter resets on page load.<\/p>\n<p>The standard solutions are over-engineered. JetSmartFilters, FacetWP, and similar tools are built for complex multi-filter scenarios. If all you need is a text search against one or two custom fields \u2014 you&#8217;re paying for and configuring ten features you&#8217;ll never use.<\/p>\n<p>And if you try to build it yourself? You&#8217;re fighting Elementor&#8217;s query hooks, URL parameter sanitisation, and debounce timing on a per-project basis. Every. Single. Time.<\/p>\n<\/section>\n<section class=\"bq-solution\">\n<h2>One Widget. One Setting. It Works.<\/h2>\n<p><strong>[B] Baqueiro Loop Filter<\/strong> is a native Elementor widget that adds a text search field to any page containing a Loop Grid. You configure the custom field meta key to filter against, drop the widget on the page, and it works \u2014 including pagination.<\/p>\n<p>The filter value is written into the URL as a query parameter. That means the filtered state survives page refresh, can be bookmarked, and works correctly with Elementor&#8217;s native Loop Grid pagination. No AJAX session state to manage. No hidden fields. No JavaScript frameworks.<\/p>\n<p>The widget integrates with Elementor&#8217;s standard Controls Manager, so typography, text colour, and spacing are all styled directly from the Elementor Style panel \u2014 no custom CSS required unless you want it.<\/p>\n<\/section>\n<section class=\"bq-bullets\">\n<h2>What Makes It Different<\/h2>\n<ul>\n<li><strong>Filters any custom field (postmeta) on a Loop Grid<\/strong> \u2014 set the meta key in the widget settings and the filter runs a <code>LIKE<\/code> query against that field. Partial matches work out of the box.<\/li>\n<li><strong>Filter state lives in the URL<\/strong> \u2014 the search value is passed as a URL query parameter, so pagination works correctly, the filtered state is bookmarkable, and the browser back button behaves as expected.<\/li>\n<li><strong>800ms debounce on keyup<\/strong> \u2014 the filter only fires after the user stops typing, avoiding unnecessary page reloads on every keystroke.<\/li>\n<li><strong>Multiple filters on one page<\/strong> \u2014 each widget instance targets a different meta key. The query hook accumulates all active filters with AND logic and applies them once, preventing duplicate query modification.<\/li>\n<li><strong>Styled directly inside Elementor<\/strong> \u2014 typography group control and text colour control are exposed in the widget&#8217;s Style tab. No external stylesheet to override.<\/li>\n<li><strong>No AJAX. No REST API. No configuration.<\/strong> \u2014 the filter works via a standard URL redirect. There is no async request layer to configure, debug, or secure.<\/li>\n<li><strong>Supports both exact match and LIKE search<\/strong> \u2014 append <code>__like<\/code> to the meta key for partial matching (default), or use the exact key for strict equality filtering.<\/li>\n<\/ul>\n<\/section>\n<section class=\"bq-anchor\">\n<h2>What This Replaces<\/h2>\n<p>JetSmartFilters costs \u20ac39\/year per site and requires configuring filter providers, indexing, and AJAX endpoints. FacetWP starts at $99\/year and has a full learning curve. A custom implementation takes a senior developer 3\u20135 hours per project at \u20ac80\u2013\u20ac120\/hour.<\/p>\n<p><strong>[B] Baqueiro Loop Filter starts at \u20ac29\/year.<\/strong> If you build even one Elementor site per year that needs a Loop Grid filter, it pays for itself in the first hour.<\/p>\n<\/section>\n<section class=\"bq-guarantee\">\n<h2>Our Guarantee<\/h2>\n<p>This plugin is written and maintained by a senior developer with 18+ years of experience. It hooks into Elementor&#8217;s official query API \u2014 no core hacks, no monkey-patching. If it doesn&#8217;t work as described on your Elementor Pro site, you get your money back.<\/p>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Add a live text search filter to any Elementor Loop Grid \u2014 filters by custom field, preserves the query in the URL, and works with native Elementor pagination. No AJAX config. No shortcodes. Drop the widget and go.<\/p>\n","protected":false},"featured_media":250,"template":"","plugin_category":[38,87],"use_case":[75,88,89,78],"license_type":[71],"compatibility":[92,91,90,93,94],"class_list":["post-205","baqueiro_plugin","type-baqueiro_plugin","status-publish","has-post-thumbnail","hentry","plugin_category-elementor","plugin_category-search-filter","use_case-agencies","use_case-developers","use_case-directories","use_case-e-commerce","license_type-commercial","compatibility-acf","compatibility-custom-post-types","compatibility-elementor-pro","compatibility-metabox","compatibility-pods"],"_links":{"self":[{"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/baqueiro_plugin\/205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/baqueiro_plugin"}],"about":[{"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/types\/baqueiro_plugin"}],"version-history":[{"count":1,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/baqueiro_plugin\/205\/revisions"}],"predecessor-version":[{"id":217,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/baqueiro_plugin\/205\/revisions\/217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/media\/250"}],"wp:attachment":[{"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/media?parent=205"}],"wp:term":[{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/plugin_category?post=205"},{"taxonomy":"use_case","embeddable":true,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/use_case?post=205"},{"taxonomy":"license_type","embeddable":true,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/license_type?post=205"},{"taxonomy":"compatibility","embeddable":true,"href":"https:\/\/baqueiro.es\/store\/wp-json\/wp\/v2\/compatibility?post=205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}