
mFilter
Faceted filtering for MODX 3 with SEO URL support


Snippet for breadcrumbs with filter segment support and SEO markup.
mFilterCrumbs extends pdoCrumbs by adding filter segments to breadcrumbs on pages with active filters.
Features:
| Parameter | Default | Description |
|---|---|---|
showFilterCrumbs | true | Show filter segments in breadcrumbs |
tplFilterCrumb | from &tpl | Template for filter item |
schemaJsonLd | false | Add JSON-LD markup at end of output |
| Parameter | Default | Description |
|---|---|---|
tpl | built-in with Microdata | Crumb item template |
tplCurrent | built-in | Current item (no link) |
tplHome | — | Home page template |
tplWrapper | built-in nav/ol | Wrapper for full list |
| Parameter | Default | Description |
|---|---|---|
showCurrent | true (on filtered) | Show current item |
showHome | true | Show home page |
fastMode | false | Fast chunk parsing mode |
outputSeparator | (empty) | Separator between items |
| Parameter | Default | Description |
|---|---|---|
toPlaceholder | — | Output to placeholder instead of return |
return | — | data — return array instead of HTML |
| Placeholder | Description |
|---|---|
{$id} | Resource ID (0 for filters) |
{$pagetitle} | Page title / filter value |
{$menutitle} | Menu title / filter value |
{$longtitle} | Long title |
{$link} | Item URL |
{$idx} | Index number |
{$position} | Position for Schema.org |
| Placeholder | Description |
|---|---|
{$is_filter} | true if this is a filter item |
{$filter_key} | Filter key (color, size, price...) |
{$filter_label} | Localized filter label |
{$filter_values} | Filter values array |
{'!mFilterCrumbs' | snippet}{'!mFilterCrumbs' | snippet: [
'schemaJsonLd' => true
]}Outputs additionally:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://site.com/"},
{"@type": "ListItem", "position": 2, "name": "Catalog", "item": "https://site.com/catalog/"},
{"@type": "ListItem", "position": 3, "name": "Red"}
]
}
</script>{'!mFilterCrumbs' | snippet: [
'tpl' => '@INLINE <li><a href="{$link}">{$menutitle}</a></li>',
'tplCurrent' => '@INLINE <li class="active">{$menutitle}</li>',
'tplWrapper' => '@INLINE <nav><ul class="breadcrumb">{$output}</ul></nav>'
]}{'!mFilterCrumbs' | snippet: [
'showFilterCrumbs' => false
]}{'!mFilterCrumbs' | snippet: [
'toPlaceholder' => 'crumbs'
]}
{* Later in template *}
{$_modx->getPlaceholder('crumbs')}{set $crumbs = '!mFilterCrumbs' | snippet: ['return' => 'data']}
{foreach $crumbs as $crumb}
{$crumb.menutitle} ({$crumb.link})
{/foreach}By default the snippet outputs Schema.org Microdata:
<nav class="mfilter-crumbs" aria-label="Breadcrumb">
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/"><span itemprop="name">Home</span></a>
<meta itemprop="position" content="1">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/catalog/"><span itemprop="name">Catalog</span></a>
<meta itemprop="position" content="2">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<span itemprop="name">Red</span>
<meta itemprop="position" content="3">
</li>
</ol>
</nav>Basic styles are included in mfilter.css:
.mfilter-crumbs ol {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
list-style: none;
margin: 0;
padding: 0;
}
.mfilter-crumbs li:not(:last-child)::after {
content: '/';
margin-left: 0.5rem;
color: var(--mfilter-text-muted, #6c757d);
}