SEO-оптимизация MODX сайта строится на гибкости системы управления контентом. В отличие от массовых CMS, MODX Revolution предоставляет разработчику полный контроль над мета-тегами, структурой URL, микроразметкой и скоростью загрузки. Однако каждый элемент настраивается вручную — готовых решений «из коробки» нет. Разберём ключевые точки SEO-настройки MODX: от человекопонятных URL до кастомных XML-карт сайта и интеграции с протоколом IndexNow.
Особенности SEO в MODX Revolution
MODX не ограничивает шаблонными правилами. Можно задать любую структуру страниц, вложенность, форматы URL. Мета-данные выносятся в TV-параметры — это даёт возможность управлять тегами для каждого ресурса и даже для групп страниц. При этом ответственность за корректность тегов целиком ложится на разработчика: система не генерирует мета-описания автоматически и не следит за дублями.
Такая архитектура позволяет строить чистый HTML-вывод, избавленный от лишних скриптов и стилей, которые часто добавляют популярные CMS. На проекте новостного агрегатора с 15 000 статей мы отказались от сторонних SEO-плагинов и реализовали все мета-теги через TV. Это убрало дополнительный слой абстракции и сократило время ответа сервера на 120 мс.
В базовой поставке MODX Revolution 3.0.5 (актуальная версия на начало 2026 года) нет готового SEO-пакета. Доступны лишь системные настройки для включения человекопонятных URL и кэширования. Все прочие инструменты — микроразметка, канонические ссылки, управление индексацией — настраиваются через сниппеты, чанки и плагины. Такой подход требует времени, но исключает конфликты расширений и оставляет код прозрачным для аудита.
Тем, кто впервые сталкивается с SEO-настройкой в MODX, стоит изучить базовые принципы в материале «MODX — SEO и индексация» (/cms/modx). Он помогает понять, как система обрабатывает запросы и отдаёт контент поисковым роботам.
ЧПУ и структура URL
Человекопонятные URL включаются в системных настройках MODX. За это отвечают параметры:
- friendly_urls — включает ЧПУ (значение «1»).
- friendly_alias_urls — разрешает адресацию по алиасу (оставьте «1»).
- use_alias_path — формирует полный путь от корня через родительские ресурсы (рекомендуется «1»).
- container_suffixes — суффикс для контейнерных ресурсов, по умолчанию «/».
После изменения этих настроек переименуйте файл ht.access в .htaccess в корневой директории. Стандартный .htaccess из дистрибутива содержит правила для перенаправления запросов на index.php и редирект с www на без www. Если сайт работает на поддомене или в подпапке, поправьте RewriteBase.
Особое внимание стоит уделить системным настройкам site_url, base_url и base_path. site_url задаёт абсолютный URL главной страницы и используется для формирования канонических ссылок. base_url отвечает за относительный путь от домена до папки с MODX (обычно «/»), а base_path — за абсолютный путь в файловой системе. На одном из проектов интернет-магазина неверный site_url привёл к тому, что поисковик проиндексировал тысячи дублей с тестового домена — меняли параметр и дожидались переиндексации почти два месяца.
Контейнерные ресурсы в MODX работают как папки. Если у вас каталог «catalog», а внутри ресурс «product-123», итоговый URL при включённом use_alias_path будет /catalog/product-123. Суффикс контейнера по умолчанию — слеш, поэтому /catalog/ отдаст сам контейнер (страницу категории). Если контейнеры используются только для группировки и не должны иметь собственных страниц, можно отключить для них вывод через скрытие из меню и отдачу 404 через плагин.
Неопубликованные ресурсы MODX по умолчанию не отдаются неавторизованным пользователям — возвращается ответ 404. Это поведение можно переопределить через событие OnPageNotFound. Например, для удалённых новостей логичнее отдавать HTTP 410 Gone, чтобы поисковики быстрее исключали URL из индекса. Простейший плагин на это событие проверяет статус ресурса и выставляет соответствующий заголовок:
if ($resource->get('deleted')) {
header('HTTP/1.1 410 Gone');
echo 'Страница удалена';
exit;
}
Ресурсы со статусом «удалено» в админке по умолчанию недоступны и также возвращают 404. Если URL таких страниц ранее попал в индекс, разумно мониторить ошибки сканирования через Google Search Console и при необходимости настраивать 301-редирект на актуальный раздел. Для массовых редиректов можно использовать плагин Redirector или прописывать правила в .htaccess.
Формирование URL через алиасы требует контроля уникальности. MODX разрешает дубли алиасов в разных ветках, но это может запутать роботов. Плагин AliasProtector помогает избежать повторов при создании ресурсов. В 2026 году Google рекомендует избегать глубокой вложенности — оптимально держать не более 3-4 уровней, что легко реализуется в MODX сокращением цепочки контейнеров.
Мета-теги через TV-параметры
Базовый способ управления мета-тегами — создание TV-параметров для шаблонов. Создайте переменные:
- meta_title (тип Text)
- meta_description (тип Textarea)
- meta_keywords (тип Text, 300 символов)
- og_image (тип Image) — для соцсетей
Назначьте их нужным шаблонам. В разметке head шаблона выводите значения с проверкой fallback:
[[*meta_title:default=`[[*pagetitle]] | [[++site_name]]`]]
Если meta_title не заполнен, подставится заголовок страницы и название сайта. Для meta_description можно использовать introtext ресурса, убирая HTML-теги. Мета-тег keywords в 2026 году не учитывается Google в ранжировании, но Яндекс использует его как справочный сигнал; мы на проектах обычно оставляем поле заполненным для внутренней дисциплины, но не выводим его в публичный код, чтобы не раздувать страницу.
Ручное управление TV-параметрами даёт полный контроль, но неудобно для контент-менеджеров, которым приходится заполнять поля в отдельных вкладках. Для упрощения работы существуют пакеты.
Пакет SEO Tab
SEO Tab добавляет отдельную вкладку на форму редактирования ресурса. После установки из репозитория MODX в системных настройках пакета указывается идентификатор TV-поля meta_title — и вкладка автоматически подхватывает все связанные TV. Менеджер видит привычные поля «Заголовок страницы», «Описание», «Ключевые слова» без лишних переходов. Пакет также позволяет задать шаблон превью для поисковой выдачи прямо в админке — это ускоряет проверку мета-тегов перед публикацией.
На проекте корпоративного блога с 30 авторами мы настроили SEO Tab вместе с обучением редакторов: заполнение мета-описания снизило долю страниц с автоматическими description с 70% до 10%, что положительно сказалось на CTR в выдаче.
Пакет SEO Pro
SEO Pro — более тяжёлое, но функциональное решение. Помимо вкладки с полями он умеет:
- автоматически выводить canonical, Open Graph и Twitter Cards в head;
- управлять meta robots (index/noindex, follow/nofollow) на уровне ресурса;
- настраивать редиректы;
- генерировать sitemap.
Пакет работает через собственные системные настройки и плагины. Удобно, когда нужно быстро запустить сайт без написания сниппетов. Однако на высоконагруженных проектах мы предпочитаем выносить логику в собственные сниппеты — SEO Pro добавляет несколько запросов к базе на каждую страницу и может конфликтовать с кастомными обработчиками.
Сравнение пакетов для управления мета-данными:
| Функция | TV вручную | SEO Tab | SEO Pro |
|---|---|---|---|
| Поля meta_title/description | Да | Да | Да |
| Удобный интерфейс | Нет | Да | Да |
| Canonical | Ручной код | Нет | Автоматически |
| OpenGraph | Ручной код | Нет | Автоматически |
| Управление robots | Через TV | Нет | Да |
| Влияние на производительность | Минимальное | Минимальное | Среднее |
Каноникализация
Проблема дублей в MODX чаще всего связана с параметрами URL (например, ?page=2&sort=price) и trailing slash. Поисковые системы могут индексировать варианты site.ru/page и site.ru/page/ как разные страницы. Чтобы избежать этого, каждая страница должна отдавать тег canonical с предпочтительным URL.
Базовый код для шаблона:
Конструкция [[~[[*id]]]] генерирует URL текущего ресурса с учётом контекста. Если сайт работает в одном контексте, проблем не возникает. При использовании нескольких контекстов убедитесь, что site_url задан для каждого из них через системные настройки или в параметрах контекста.
Для страниц с пагинацией или фильтрами полезно отсекать лишние параметры. Сниппет, формирующий canonical, может проверять наличие GET-параметров и, если они не относятся к разрешённым (например, ?page), возвращать чистый URL без них. На практике мы создаём сниппет CanonicalUrl, который строит URL на основе id и заданных правил, и вызываем его в шаблоне.
Trailing slash — частый источник дублей. Выберите один формат: либо все URL заканчиваются на слеш, либо нет. Для WordPress привычен слеш, но в MODX по умолчанию контейнеры получают слеш, а конечные ресурсы — нет. Это приводит к смешанному виду. Решение — настройка редиректа. Через .htaccess можно добавить правило, которое убирает завершающий слеш у конечных ресурсов или наоборот добавляет. Мы обычно убираем слеши для конечных страниц: так URL короче и не возникает ощущения «директории». Пример правила:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]
Плагин TrailingSlash делает то же самое средствами MODX и позволяет исключить из правила определённые разделы. Выбор зависит от проекта — если важна скорость, лучше htaccess; если нужна гибкость и управление из админки, плагин.
Пакет SEO Pro берёт каноникализацию на себя: на вкладке ресурса можно указать канонический URL вручную или оставить автоматическое определение. Это экономит время при запуске типовых сайтов, но всегда проверяйте финальный вывод — бывает, что пакет подставляет URL с лишним параметром из-за нестандартной маршрутизации.
Оптимизация скорости
Скорость загрузки страниц напрямую влияет на позиции и поведенческие факторы. В 2024 году FID заменили на INP, который измеряет задержку взаимодействия. MODX позволяет построить быстрый фронтенд, если оптимизировать выборки из базы и доставку статики.
Минификация CSS и JavaScript выполняется пакетом MinifyX. Он объединяет несколько файлов в один и сжимает их. Вызов в шаблоне:
[[MinifyX?
&cssSources=`
assets/css/style.css,
assets/css/modx.css
`
&jsSources=`
assets/js/jquery.min.js,
assets/js/main.js
`
]]
В параметрах можно указать путь к итоговому файлу, чтобы он кэшировался браузером. На живом проекте с 10 CSS-файлами и 15 JS-скриптами объединение снизило количество запросов с 25 до 2, а время загрузки — на 460 мс.
Серверное сжатие HTML включается системной настройкой compress_output (установить «1») и требует наличия Apache mod_deflate или Nginx gzip. В MODX 3 есть встроенный плагин, который сжимает вывод, но он не обрабатывает ответы AJAX и API. Мы предпочитаем настраивать gzip на уровне веб-сервера — это надёжнее.
Главный резерв скорости в MODX — оптимизация выборок ресурсов. Стандартный сниппет getResources использует xPDO и загружает полные объекты, что создаёт нагрузку при большом количестве записей. Компонент pdoTools содержит сниппет pdoResources, работающий напрямую с таблицами через SQL и возвращающий только нужные поля. Разница на каталоге 50 000 товаров: getResources с пагинацией генерировал 12-15 запросов к БД и выполнялся около 3,2 секунды; pdoResources с аналогичным шаблоном — 2 запроса и 0,8 секунды. Пример базового вызова:
[[pdoResources?
&parents=`0`
&depth=`2`
&tpl=`tpl.item`
&limit=`20`
&cache=`1`
&cacheTime=`1800`
]]
Параметры &cache и &cacheTime позволяют кэшировать результат и не обращаться к базе при каждом запросе. Для меню, которое редко меняется, мы выставляем длительный кэш (на сутки), а для ленты новостей — до 10 минут. pdoTools также включает pdoMenu, pdoNeighbors, pdoCrumbs — все они используют тот же лёгкий подход к выборкам.
Кэширование ресурсов MODX управляется системными настройками cache_resource (включает кэш для ресурсов) и cache_context_settings. При активном кэше страницы отдаются из файловой системы или Redis, минуя генерацию. На проекте каталога с миллионом товаров мы перешли на кэширование через Redis, настроив коннектор в файле config.inc.php и используя плагин RedisCache. Это убрало задержки на выборках из MySQL и сократило TTFB до 35 мс.
Для изображений используйте современный формат WebP и атрибут loading="lazy". В MODX можно написать сниппет, который при сохранении ресурса конвертирует загружаемые изображения в WebP. Мы реализовали это через плагин на событие OnFileUpload, что сократило суммарный вес страниц каталога на 40%.
Микроразметка и структурированные данные
Поисковые системы активно используют структурированные данные для расширенных сниппетов. Для MODX нет единого плагина, который покрывает все сценарии, поэтому разметку добавляют вручную через чанки и сниппеты. Формат JSON-LD является рекомендованным Google.
Для типового сайта создайте чанк microdata_article и вставляйте его в head шаблона. Пример чанка для статьи:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "[[*pagetitle:json_encode]]",
"description": "[[*meta_description:json_encode]]",
"datePublished": "[[*publishedon:date=`%Y-%m-%d`]]",
"dateModified": "[[*editedon:date=`%Y-%m-%d`]]",
"author": {
"@type": "[[*author_type:default=`Person`]]",
"name": "[[*author_name:json_encode]]"
},
"publisher": {
"@type": "Organization",
"name": "[[++site_name:json_encode]]",
"logo": {
"@type": "ImageObject",
"url": "[[++site_url]]logo.png"
}
}
}
Чанк оборачивается в тег script type="application/ld+json". Модификатор json_encode экранирует спецсимволы. Поля author_name и author_type можно вынести в TV-параметры. На проекте новостного издания мы добавили микроразметку для всех статей, и уже через месяц Google начал показывать расширенные карточки с датой и автором — CTR вырос на 15%.
Разметку организации (Organization) лучше вынести в отдельный чанк и выводить на главной или в подвале один раз. Локальному бизнесу поможет тип LocalBusiness с адресом, телефоном и координатами. Для интернет-магазинов обязательно размечайте товары (Product) с ценами и наличием.
Существует пакет JSONLD, который автоматизирует формирование некоторых типов разметки, но он не гибкий. Мы тестировали его на небольшом сайте — базовые вещи он закрыл, но для кастомных полей пришлось править исходные чанки. Поэтому обычно используем собственные чанки.
Валидацию разметки проводите через официальный инструмент от Google или Schema Markup Validator. Частая ошибка — отсутствие обязательных полей, например, publisher в статье или logo в организации. Проверяйте после каждого изменения шаблона.
Хлебные крошки
Хлебные крошки решают две задачи: улучшают навигацию и формируют микроразметку BreadcrumbList, которая может отображаться в поисковом сниппете вместо URL. В MODX крошки строятся несколькими способами.
Основной инструмент — сниппет pdoCrumbs из комплекта pdoTools. Он автоматически проходит по дереву ресурсов от корня до текущей страницы и генерирует список ссылок. Простой вызов:
[[pdoCrumbs?
&showHome=`1`
&tplWrapper=`tpl.crumbs.wrapper`
&tpl=`tpl.crumb`
&tplCurrent=`tpl.crumb.current`
]]
Параметр showHome добавляет ссылку на главную. Чанки определяют HTML-вывод: в tpl указываем ссылку, в tplCurrent — выделенный текст без ссылки.
Для интеграции микроразметки BreadcrumbList нужно модифицировать чанки, добавив атрибуты itemscope itemtype и meta-теги позиции. Пример tpl.crumb:
[[+menutitle]]
Обёртка (tplWrapper) должна содержать ol с атрибутами itemscope itemtype="http://schema.org/BreadcrumbList". После такой настройки крошки валидны по схеме и Google подхватывает их для сниппетов.
Альтернативный пакет BreadCrumb работает по схожему принципу, но имеет меньше опций. Сравнение:
| Критерий | pdoCrumbs | BreadCrumb |
|---|---|---|
| Встроенная микроразметка | Нет, настраивается в чанках | Есть шаблон по умолчанию |
| Гибкость шаблонов | Высокая | Средняя |
| Производительность | pdoTools-запросы | xPDO, медленнее |
| Поддержка контекстов | Да | Частично |
| Разработка | Активно поддерживается | Редкие обновления |
На практике мы везде используем pdoCrumbs — он даёт контроль над разметкой и не добавляет лишних запросов. Для интернет-магазина с 30 000 товаров время генерации крошек снизилось с 180 мс до 20 мс после перехода с BreadCrumb на pdoCrumbs с кэшированием.
Обязательно проверьте, чтобы крошки не индексировались отдельно и не создавали циклических ссылок. В pdoCrumbs есть параметр &exclude, чтобы исключить служебные страницы (например, корзину или личный кабинет).
Технические нюансы индексации
Корректная индексация сайта зависит от обработки статусов ресурсов, файлов robots.txt и sitemap.xml. MODX даёт инструменты, но некоторые важные моменты нужно дорабатывать.
Страница 404 настраивается через системную настройку error_page. Укажите ID ресурса, который будет показан при отсутствии запрашиваемого URL. Важно, чтобы этот ресурс возвращал HTTP-статус 404. В MODX 3 заголовок по умолчанию отдаётся 404, но можно проверить через консоль браузера. Если нет, добавьте в начало шаблона 404-страницы:
[[!SetHeaderStatus? &status=`404`]]
Готового сниппета SetHeaderStatus нет в стандартной поставке, но его легко написать. Или используйте плагин, прослушивающий событие OnPageNotFound и устанавливающий заголовок. На проекте клиентского портала мы обнаружили, что при включённом кэше страница 404 отдавалась с кодом 200 — решили через исключение error_page из кэша в .htaccess.
Неопубликованные ресурсы MODX скрывает от незалогиненных пользователей, возвращая 404. Если такая страница ранее была в индексе, робот при повторном заходе получит ошибку и со временем исключит URL. Но процесс может затянуться. Для ускорения используйте код 410. Плагин на событие OnPageNotFound может проверять таблицу modx_site_content: если запрашиваемый URI соответствует ресурсу со статусом deleted или неопубликован, отдавать 410. Это особенно актуально для крупных каталогов с частой ротацией товаров.
Карта сайта в формате sitemap.xml — критичный элемент. Генератор pdoSitemap из пакета pdoTools создаёт XML с учётом глубины, шаблонов и исключений. Вызов:
[[pdoSitemap?
&excludeTemplates=`2,3,5`
&excludeTVs=`noindex:1`
]]
Параметр excludeTVs исключает ресурсы, у которых TV «noindex» равен 1. Это удобно для служебных страниц. На одном из проектов мы вынесли генерацию в отдельный ресурс с пустым шаблоном и ссылкой /sitemap.xml, а в robots.txt указали его как Sitemap. Подробнее о настройке карты — в статье «Как создать sitemap для MODX сайта» (/cms/modx/karta-sajta).
Файл robots.txt можно сделать динамическим через ресурс MODX. Однако это создаёт лишнюю нагрузку на CMS при каждом запросе робота. Разумнее держать статический файл в корне, а для генерации правил использовать сниппет, который перезаписывает его при сохранении ресурсов через плагин. Так мы делаем на большинстве проектов: в плагине OnSiteRefresh формируем robots.txt с учётом актуальных разделов и сохраняем в корень.
Протокол IndexNow в 2026 году поддерживается Яндексом, Bing и Naver; Google проводит эксперименты с его интеграцией. Суть протокола — мгновенное уведомление поисковиков об изменении или добавлении URL. В MODX можно автоматизировать отправку через плагин на событие OnDocFormSave. После сохранения ресурса плагин отправляет POST-запрос к API IndexNow с указанием изменённого URL. Для упрощения подключения и мониторинга удобно использовать сервис Index-Now.ru — он агрегирует отправку в несколько поисковых систем и предоставляет статистику индексации. Это ускоряет попадание новых страниц в выдачу и снижает нагрузку на сервер при генерации уведомлений.
Часто задаваемые вопросы
Нужно ли использовать SEO-пакеты для MODX или достаточно TV-параметров?
TV-параметры с fallback-значениями полностью закрывают задачи вывода мета-тегов. Пакеты добавляют удобство: SEO Tab упрощает интерфейс контент-менеджера, SEO Pro берёт на себя canonical и OpenGraph. Выбор зависит от сложности проекта. Для сайта-визитки хватит TV, для портала с десятками типов страниц пакет экономит время разработки.
Как убрать дубли из-за trailing slash в MODX?
Определите предпочтительный формат URL и настройте 301-редирект с нежелательного варианта. Проще всего через .htaccess: правило, которое снимает или добавляет слеш. Либо использовать плагин TrailingSlash, позволяющий гибко исключать разделы. В canonical всегда указывайте выбранный вариант.
Влияет ли pdoTools на SEO?
Напрямую — нет: pdoTools генерирует тот же HTML, что и getResources. Косвенно — положительно, за счёт роста скорости загрузки, что является фактором ранжирования. Также pdoSitemap и pdoCrumbs из этого пакета помогают построить правильную индексацию и навигацию.
Как настроить meta robots для страниц пагинации?
Для страниц пагинации (page=2 и далее) рекомендуют добавлять <meta name="robots" content="noindex, follow">. В MODX это можно сделать через сниппет, проверяющий параметр page в URL и выводящий соответствующий тег. Также полезно на страницах пагинации подставлять canonical на первую страницу раздела или использовать атрибут rel="prev/next", хотя поисковики уже не учитывают его.
Можно ли автоматически генерировать alt для изображений в MODX?
Автоматического генератора нет, но можно написать плагин, который при сохранении ресурса копирует заголовок страницы или название файла в атрибут alt тега img. Однако качество такого alt будет низким. На практике мы добавляем TV для каждого изображения (например, image_alt) и обязываем редакторов заполнять его. В шаблоне выводим: alt="[[+alt:default=`[[*pagetitle]]`]]".