
mFilter
Faceted filtering for MODX 3 with SEO URL support


Faceted filtering of products and resources for MODX Revolution 3.x with SEO-friendly URL support.
/catalog/brand_apple/color_black/| Requirement | Version |
|---|---|
| MODX Revolution | 3.0.0+ |
| PHP | 8.1+ |
| MySQL | 5.7+ / MariaDB 10.3+ |
After installation:
In Extras → mFilter → Filter sets:
{* Filter form *}
{'!mFilterForm' | snippet}
{* Paginated results *}
{'!mFilter' | snippet: [
'element' => 'msProducts',
'paginator' => 'pdoPage',
'parents' => $_modx->resource.id,
'limit' => 24,
'tpl' => 'mfilter.row'
]}
{* Pagination *}
{$_modx->getPlaceholder('page.nav')}SEO URLs are on by default. Filters produce URLs like:
/catalog/brand_apple/color_black-or-white/price_1000-5000/To customize, go to Filter sets and set slugs for filter values.
┌─────────────────────────────────────────────────────────┐
│ Front-end │
├─────────────────┬───────────────────────────────────────┤
│ SSR mode │ Headless mode │
│ (mFilterForm) │ (Vue/React/Svelte) │
├─────────────────┴───────────────────────────────────────┤
│ JavaScript API │
│ FilterUI / ApiClient / FilterAPI / Hooks │
├─────────────────────────────────────────────────────────┤
│ REST API │
│ /api/v1/filter/schema | apply | suggestions | ... │
├─────────────────────────────────────────────────────────┤
│ Services │
│ Filter | FilterSet | SlugManager | UrlRouter | SEO... │
├─────────────────────────────────────────────────────────┤
│ Database │
│ FilterSets | Slugs | Patterns | WordForms | Cache │
└─────────────────────────────────────────────────────────┘mFilter is a fully rewritten component for MODX 3.x:
| Aspect | mFilter2 | mFilter |
|---|---|---|
| MODX | 2.x | 3.x |
| PHP | 5.6+ | 8.1+ |
| Interface | ExtJS | Vue 3 + PrimeVue |
| Architecture | Procedural | Service-based |
| SEO URL | Separate plugin | Built-in |
| Headless API | No | REST API v1 |
| Filter types | Fixed | Extensible |
| Configuration | In snippet | Filter sets in admin |
| Caching | Basic | Multi-level |
Traditional mode — HTML is generated on the server:
{'!mFilterForm' | snippet}
{'!mFilter' | snippet: ['element' => 'msProducts']}Advantages:
API mode for modern frameworks:
// Get filter schema
const schema = await mfilter.getSchema(resourceId);
// Apply filters
const result = await mfilter.apply(
{ brand: ['apple'], price: { min: 1000, max: 5000 } },
{ sort: 'price-asc', page: 1 }
);More: Headless API