
mFilter
Faceted filtering for MODX 3 with SEO URL support


mFilter provides a set of snippets for filtering, navigation, and SEO.
| Snippet | Purpose |
|---|---|
| mFilter | Output filtered results |
| mFilterForm | Render the filter form |
| mFilterSelected | Show selected filters |
| mFilterCrumbs | Breadcrumbs with filters |
| mFilterNav | SEO navigation by filter values |
| mFilterSitemap | Generate sitemap for filters |
The main combination for product filtering:
{* Filter form in sidebar *}
<aside>
{'!mFilterForm' | snippet}
</aside>
{* Filter results *}
<main>
{'!mFilter' | snippet: [
'element' => 'msProducts',
'paginator' => 'pdoPage',
'parents' => $_modx->resource.id,
'limit' => 24
]}
{$_modx->getPlaceholder('page.nav')}
</main>Shows current active filters with the ability to remove them:
<main>
{'!mFilterSelected' | snippet}
{'!mFilter' | snippet: [...]}
</main>Breadcrumbs with filter segment support:
{'!mFilterCrumbs' | snippet: [
'schemaJsonLd' => true
]}On page /catalog/color_red/ it will output:
Home / Catalog / RedSEO navigation by filter values:
<nav class="brands">
<h3>Brands</h3>
{'!mFilterNav' | snippet: [
'filterKeys' => 'vendor_id',
'showCount' => true,
'element' => 'msProducts'
]}
</nav>Generate XML sitemap for filtered pages:
{'!mFilterSitemap' | snippet: [
'priority' => '0.6',
'changefreq' => 'weekly'
]}Delegates data fetching and rendering to external snippets:
{'!mFilter' | snippet: [
'element' => 'msProducts', {* Data snippet *}
'paginator' => 'pdoPage', {* Pagination snippet *}
'parents' => 5,
'limit' => 24,
'tpl' => 'mfilter.row'
]}How it works:
element with returnIds=1paginatorpaginator calls element for renderingmFilter runs queries and rendering itself (no external snippets):
{'!mFilter' | snippet: [
'parents' => 5,
'limit' => 24,
'tpl' => 'product.row',
'class' => 'msProduct'
]}Use when you need full control over the query.
All snippets support AJAX updates without page reload.
Enabled by default. The form is submitted via JavaScript; results update dynamically.
{'!mFilterForm' | snippet: ['ajax' => 0]}
{'!mFilter' | snippet: ['ajax' => 0]}| Mode | Description |
|---|---|
form | Submit on button click |
instant | Submit when any filter changes |
{'!mFilterForm' | snippet: ['ajaxMode' => 'instant']}{* Breadcrumbs *}
{'!mFilterCrumbs' | snippet: ['schemaJsonLd' => true]}
<div class="catalog">
<aside class="catalog-sidebar">
{* Filter form *}
{'!mFilterForm' | snippet}
{* SEO navigation by brands *}
<nav class="brands-nav">
<h4>Popular brands</h4>
{'!mFilterNav' | snippet: [
'filterKeys' => 'vendor_id',
'limit' => 10,
'element' => 'msProducts'
]}
</nav>
</aside>
<main class="catalog-content">
{* Selected filters *}
{'!mFilterSelected' | snippet}
{* Sort and view *}
<div class="catalog-toolbar">
<select data-mfilter-sort>
<option value="pagetitle-asc">By name</option>
<option value="price-asc">Price: low to high</option>
<option value="price-desc">Price: high to low</option>
</select>
</div>
{* Results *}
{'!mFilter' | snippet: [
'element' => 'msProducts',
'paginator' => 'pdoPage',
'parents' => $_modx->resource.id,
'limit' => 24
]}
{* Pagination *}
{$_modx->getPlaceholder('page.nav')}
</main>
</div>