Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter
  3. Интерфейс админки
  4. Паттерны URL

Паттерны URL ​

Паттерн меняет вид фильтра в SEO-адресе: переименовывает ключ, убирает его или ставит фильтр раньше других. Без паттерна фильтр записывается ключом и значением — /catalog/made_in--germaniya/. Разделители задают настройки mfilter.url_separator и mfilter.values_separator.

Паттерн создаётся на вкладке «Паттерны» кнопкой «Добавить паттерн» и действует на всех страницах каталога с фильтрами.

Поля ​

ПолеЧто задаёт
Ключ фильтраКлюч из набора фильтров: made_in, color. На один ключ — один паттерн. Есть ли такой ключ в наборах, mFilter не проверяет — сверьте написание
URL паттернВид сегмента: текст и подстановки. Новый паттерн заполнен {key}_{value} — с ним адрес станет made_in_germaniya. Чтобы оставить вид ключ--значение и задать только приоритет, очистите поле. При каждом следующем открытии окно снова подставляет {key}_{value} — очищайте поле перед сохранением
Тип парсингаКак читать значение из адреса: «По умолчанию» — список значений, «Булево» — да или нет, «Диапазон» — две границы. «URL паттерн» с {min} и {max} читается как диапазон при любом типе парсинга
ПриоритетОт 0 до 100, меньше — раньше: порядок фильтров в адресе и порядок проверки при открытии ссылки
Скрыть ключ в URLВ адресе только значение: /catalog/seryj/
АктивенВыключенный паттерн не действует — фильтр пишется ключом и значением

Подстановки ​

«URL паттерн» — не регулярное выражение: всё, кроме подстановок, попадает в адрес как есть.

ПодстановкаЧто попадает в адрес
{key}Ключ фильтра
{value}, {values}Значение — алиас с вкладки Алиасы: «Германия» → germaniya. Несколько значений соединяются через -or-
{min}, {max}Границы диапазона, см. Диапазоны

Переименовать ключ ​

Ключ made_in, URL паттерн sdelano_v--{value}:

/catalog/sdelano_v--germaniya/
/catalog/sdelano_v--germaniya-or-kitaj/
  • Адреса прежнего вида — /catalog/made_in--germaniya/ — тоже открываются. Перенаправления со старого адреса нет.
  • Канонический адрес в плейсхолдере mfilter.seo.canonical указывает на новый вид — выведите его в шаблоне ресурса, см. Плейсхолдеры.
  • Карта сайта отдаёт прежние адреса, пока не истечёт её кэш.
  • Если потом поменять «URL паттерн», ссылки с sdelano_v-- будут отдавать 404.

Скрыть ключ ​

Ключ color, флажок «Скрыть ключ в URL», URL паттерн {value}:

/catalog/seryj/
/catalog/seryj-or-sinij/

С флажком поле «URL паттерн» не учитывается — кроме диапазона. Без флажка не оставляйте «URL паттерн» из одного {value}: такой паттерн подходит к любому сегменту и забирает адреса других фильтров — они отдают 404.

Не для любого фильтра

Скрыть ключ можно, если у значений фильтра есть алиасы — текстовые значения, разделы, производители, цвета — или это год, месяц, день. Числа, 1/0 булевых фильтров и даты алиасов не получают: с такими значениями ссылка со скрытым ключом отдаст 404. Оставьте им ключ в адресе. У диапазона флажок не ставьте — см. Диапазоны.

Какие адреса без ключа открываются ​

Сегмент без ключа mFilter сверяет с алиасами фильтров со скрытым ключом. Если одинаковый алиас есть у двух таких фильтров, ссылка откроется с фильтром, у которого приоритет меньше.

Без паттерна адрес без ключа тоже открывается: последним шагом mFilter ищет алиас по всем фильтрам. Сам он таких ссылок не строит, но набранный вручную /catalog/seryj/ откроет ту же страницу, что /catalog/color--seryj/.

У года, месяца и дня алиасов нет — такой сегмент узнаётся по виду значения, который задаёт тип фильтра:

ТипЧто принимаетсяПример адреса
ГодЧетыре цифры/catalog/2026/
МесяцГГГГ-ММ/catalog/2026-03/
День месяцаОт 1 до 31, без ведущего нуля/catalog/18/

Значение другого вида — ошибка 404: /catalog/9999999/, /catalog/2026-13/, /catalog/05/. Проверяется каждое значение сегмента, поэтому /catalog/2026-or-9999999/ — тоже 404, а не второй адрес той же страницы.

Если адрес совпадает и с существующей страницей сайта, и с фильтром, открывается страница. Дочерняя страница каталога /catalog/2026/ останется собой, а фильтр по такому адресу не сработает.

Диапазоны ​

Диапазону нужны обе подстановки — {min} и {max}. Ключ price, URL паттерн ot-{min}-do-{max}:

/catalog/ot-1000-do-5000/

Без одной из них паттерн к диапазону не применяется: адрес остаётся вида /catalog/price--1000--5000/. Так же ведут себя паттерны, заданные до появления {min} и {max}, — адреса на работающих сайтах от обновления не меняются.

Адреса вида ключ--от--до открываются и после того, как паттерн задан. Адрес с дробными границами, набранный вручную, открывается, но сам mFilter округляет границы вниз до целого: /catalog/ot-999-do-5000/ вместо 999.5.

Не скрывайте ключ у диапазона

С флажком «Скрыть ключ в URL» mFilter строит адрес по паттерну — /catalog/ot-1000-do-5000/, — но открыть его не может: ссылка отдаёт 404. У паттерна диапазона флажок не ставьте.

Булевы фильтры ​

В адрес булев фильтр пишется своим значением — 1 или 0. Ключ spb, URL паттерн v-spb-{value}, тип парсинга «Булево»:

/catalog/v-spb-1/

При открытии ссылки 1 и yes читаются как «включено», 0 и no — как «выключено». Любое другое значение разбирают другие паттерны.

Порядок фильтров в адресе ​

Сначала идут фильтры с паттернами по возрастанию приоритета, затем фильтры без паттерна. made_in с приоритетом 0, spb с паттерном v-spb-{value} и приоритетом 5, у vendor_id паттерна нет:

/catalog/sdelano_v--germaniya/v-spb-1/vendor_id--acer/

Проверить адрес ​

Как mFilter разберёт адрес, покажет mfilter.api.parseUrl() в консоли браузера на странице каталога:

js
// Только часть адреса после раздела: сегменты раздела тоже попадут в разбор
const parsed = await mfilter.api.parseUrl({ url: 'seryj/' });
parsed.filters;       // { color: ['Серый'], … }
parsed.unrecognized;  // сегменты, которые не удалось разобрать

Ответ для seryj/:

json
{
  "success": true,
  "filters": {
    "color": [
      "Серый"
    ]
  },
  "tech": [],
  "page": 1,
  "sort": null,
  "limit": null,
  "unrecognized": [],
  "resource_id": 0
}

Для seryj/nesuschestvuet/ лишний сегмент попадает в unrecognized:

json
{
  "success": true,
  "filters": {
    "color": [
      "Серый"
    ]
  },
  "tech": [],
  "page": 1,
  "sort": null,
  "limit": null,
  "unrecognized": [
    "nesuschestvuet"
  ],
  "resource_id": 0
}

Подробнее — Headless API.