Skip to content
mFilter
mFilter
Faceted filtering for MODX 3 with SEO URL support
  1. Extras
  2. mFilter

mFilterCrumbs

Snippet for breadcrumbs with filter segment support and SEO markup.

Description

mFilterCrumbs extends pdoCrumbs by adding filter segments to breadcrumbs on pages with active filters.

Features:

  • On normal pages — works like pdoCrumbs
  • On filtered pages — adds filter segments as extra items
  • Schema.org Microdata support
  • Optional JSON-LD structured output
  • Full compatibility with all pdoCrumbs parameters

Parameters

Specific parameters

ParameterDefaultDescription
showFilterCrumbstrueShow filter segments in breadcrumbs
tplFilterCrumbfrom &tplTemplate for filter item
schemaJsonLdfalseAdd JSON-LD markup at end of output

Templates (pdoCrumbs)

ParameterDefaultDescription
tplbuilt-in with MicrodataCrumb item template
tplCurrentbuilt-inCurrent item (no link)
tplHomeHome page template
tplWrapperbuilt-in nav/olWrapper for full list

Behavior (pdoCrumbs)

ParameterDefaultDescription
showCurrenttrue (on filtered)Show current item
showHometrueShow home page
fastModefalseFast chunk parsing mode
outputSeparator(empty)Separator between items

Output

ParameterDefaultDescription
toPlaceholderOutput to placeholder instead of return
returndata — return array instead of HTML

Placeholders in templates

Standard (from pdoCrumbs)

PlaceholderDescription
{$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

Filter-specific

PlaceholderDescription
{$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

Examples

Basic call

fenom
{'!mFilterCrumbs' | snippet}

With JSON-LD markup

fenom
{'!mFilterCrumbs' | snippet: [
    'schemaJsonLd' => true
]}

Outputs additionally:

html
<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>

Custom templates

fenom
{'!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>'
]}

Without filters in breadcrumbs

fenom
{'!mFilterCrumbs' | snippet: [
    'showFilterCrumbs' => false
]}

Output to placeholder

fenom
{'!mFilterCrumbs' | snippet: [
    'toPlaceholder' => 'crumbs'
]}

{* Later in template *}
{$_modx->getPlaceholder('crumbs')}

Get data as array

fenom
{set $crumbs = '!mFilterCrumbs' | snippet: ['return' => 'data']}
{foreach $crumbs as $crumb}
    {$crumb.menutitle} ({$crumb.link})
{/foreach}

SEO markup

By default the snippet outputs Schema.org Microdata:

html
<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>

CSS styles

Basic styles are included in mfilter.css:

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);
}