
mFilter
Faceted filtering for MODX 3 with SEO URL support


Snippet for generating an XML sitemap of filtered pages.
mFilterSitemap creates an XML sitemap for filter virtual pages (SEO URLs). Works on the sitemap index principle — it only generates filter URLs that can be added to the main sitemap.
Features:
| Parameter | Default | Description |
|---|---|---|
parents | auto | Resource IDs (comma-separated). Empty = all pages with filter sets |
filterKeys | all | Filter keys to include (comma-separated) |
| Parameter | Default | Description |
|---|---|---|
maxFilters | 1 | Max filters per URL (1 = single only) |
maxValues | 1 | Max values per filter |
| Parameter | Default | Description |
|---|---|---|
priority | 0.7 | URL priority (0.0–1.0) |
changefreq | weekly | Update frequency (always, hourly, daily, weekly, monthly, yearly, never) |
| Parameter | Default | Description |
|---|---|---|
tpl | built-in | Single URL template |
tplWrapper | built-in | urlset wrapper |
sitemapSchema | http://www.sitemaps.org/schemas/sitemap/0.9 | XML Schema |
| Parameter | Default | Description |
|---|---|---|
forceXML | true | Output XML header and exit |
return | chunks | Return type: chunks (HTML) or data (array) |
| Parameter | Default | Description |
|---|---|---|
cache | true | Enable caching |
cacheTime | 3600 | Cache TTL (seconds) |
| Parameter | Default | Description |
|---|---|---|
debug | false | Enable debug logs |
| Placeholder | Description |
|---|---|
{$url} | Full page URL |
{$lastmod} | Last modified date (ISO 8601) |
{$changefreq} | Update frequency |
{$priority} | Priority |
{$filterKey} | Filter key |
{$value} | Filter value |
{$resourceId} | Base resource ID |
| Placeholder | Description |
|---|---|
{$output} | All URL elements |
{$schema} | XML Schema |
{$charset} | Charset |
{$total} | Total URL count |
Create resource /sitemap-filters.xml with template:
{'!mFilterSitemap' | snippet}{'!mFilterSitemap' | snippet: [
'filterKeys' => 'color,size,brand'
]}{'!mFilterSitemap' | snippet: [
'maxFilters' => 2,
'priority' => '0.6'
]}Warning: With many values this can produce a very large number of URLs!
{'!mFilterSitemap' | snippet: [
'parents' => '5,10,15',
'filterKeys' => 'color,brand'
]}{set $sitemapXml = '!mFilterSitemap' | snippet: [
'forceXML' => false
]}
{* Can process or save *}
{$sitemapXml}{set $urls = '!mFilterSitemap' | snippet: [
'return' => 'data',
'forceXML' => false
]}
{* urls is array of data *}
Total URLs: {$urls | count}{'!mFilterSitemap' | snippet: [
'tpl' => '@INLINE <url>
<loc>{$url}</loc>
<lastmod>{$lastmod}</lastmod>
<changefreq>{$changefreq}</changefreq>
<priority>{$priority}</priority>
<xhtml:link rel="alternate" hreflang="en" href="{$url}"/>
</url>'
]}mFilter includes a task for automatic sitemap generation via MODX Scheduler.
mfl_generate_sitemap is created automatically{
"parents": "",
"filterKeys": "",
"maxFilters": 1,
"priority": "0.7",
"changefreq": "weekly",
"outputFile": "assets/sitemap-filters.xml"
}$scheduler = $modx->services->get('scheduler');
$task = $scheduler->getTask('mfilter', 'mfl_generate_sitemap');
$task->schedule('+0 seconds');Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/sitemap-filters.xmlIf you use pdoSitemap for the main sitemap, create a separate resource for filters:
/sitemap.xml — pdoSitemap (main pages)
/sitemap-filters.xml — mFilterSitemap (filters)
/sitemap-index.xml — index file<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap.xml</loc>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-filters.xml</loc>
</sitemap>
</sitemapindex>Google recommends no more than 50,000 URLs per sitemap file. For large catalogs:
maxFilters at 1parents)Suggested values:
For filters, weekly or monthly is usually enough, since structure changes infrequently.