Исходная точка: что было у клиента и почему WP-шаблон не подошёл
Меня зовут Семёнов Евгений Сергеевич, я технический директор ITfresh. Мы обслуживаем компании до 50 рабочих мест в Москве — и частные клиники в этом сегменте встречаются регулярно: юрлицо, десяток врачей, три администратора, никакого своего ИТ-штата. Сегодняшний кейс — как раз такая клиника, обратившаяся к нам на комплексное обслуживание, в составе которого был и сайт.
Что было на старте: сайт-визитка десятилетней давности на конструкторе — пять страниц, телефон в шапке и прайс отдельным PDF-файлом на 30 листов, который администраторы пересобирали в Word при каждом изменении цен. Запись на приём — только по телефону. Пациенты искали услуги в поисковике, попадали на агрегаторы и уходили к конкурентам, у которых на сайте были нормальные страницы услуг с ценами.
Требование клиники к новому сайту формулировалось просто, а реализовывалось сложно: связка «направление → услуги → врачи → цены». У каждого направления (стоматология, УЗИ, гинекология…) — свои услуги; у каждой услуги — карточка с ценой и подготовкой к процедуре; у каждого врача — карточка со специализацией, стажем и расписанием; и всё это перекрёстно связано: на странице услуги — врачи, которые её оказывают, на странице врача — его услуги.
Рамки проекта зафиксировали на берегу: два месяца на разработку от прототипа до запуска, наполнение силами клиники по подготовленным нами шаблонам карточек, приёмка по чек-листу — скорость, формы, микроразметка, миграция старых адресов с редиректами, чтобы не потерять то немногое, что визитка успела накопить в поиске. Отдельным пунктом договора — год сопровождения: медицинский сайт без присмотра деградирует так же уверенно, как сервер без обновлений.
Первой мыслью, не скрою, был WordPress — на нём мы делаем много. Но примерка показала: готовые медицинские темы WP рисуют красивые карточки врачей, а вот связи многие-ко-многим между услугами и врачами в них либо нет, либо она сделана костылём на трёх плагинах, каждый из которых обновляется как хочет. Нестандартная структура данных — главный аргумент в пользу MODX Revolution: эта CMS не навязывает свою модель контента, а позволяет спроектировать свою. Подробно о самой системе — в нашем обзоре MODX.
Проектирование структуры контента в MODX
Дерево ресурсов
В MODX любой документ — это ресурс в дереве, а шаблон и набор полей у каждого ресурса свои. Мы спроектировали так: направления — контейнеры верхнего уровня, внутри них — ресурсы услуг; врачи — отдельная ветка с ресурсами своего шаблона. URL получились человеческие и иерархичные: /stomatologiya/, /stomatologiya/lechenie-kariesa/, /vrachi/ivanova/ — поисковики такое любят.
TV-параметры: поля карточек
Дополнительные поля в MODX называются TV (template variables) и привязываются к шаблонам. Карточка врача получила TV: специализация, стаж, образование, фото, график приёма, список услуг. Карточка услуги: цена, длительность, подготовка к процедуре, показания. Ставили на актуальную ветку MODX 3 (сейчас это 3.2, вышла в феврале 2026-го) — админка быстрая, редактирование TV удобное, администраторы клиники освоились без сопротивления.
Шаблоны и чанки: вёрстка отдельно от контента
Вёрстку разложили по правилам MODX: три шаблона (направление, услуга, врач) плюс переиспользуемые чанки — карточка врача в списке, строка прайса, блок записи. Когда дизайнеру через полгода захотелось поменять вид карточек врачей по всему сайту, правка заняла один чанк и десять минут — а не прогулку по сорока страницам. Администраторы при этом к вёрстке не прикасаются вовсе: их зона — тексты, цены и фотографии в понятных полях.
Перекрёстные связи без дублирования
Ключевой узел проекта — связь «услуга ↔ врач». Решение штатное для экосистемы MODX: сниппет pdoResources из пакета pdoTools выбирает ресурсы по условию, и блок «врачи этой услуги» на странице услуги строится запросом по TV врачей, а «услуги этого врача» — обратным запросом. Контент нигде не дублируется: администратор отмечает услуги в карточке врача, и обе страницы обновляются сами. Ни одного скопированного руками абзаца — то, чего в шаблонной теме мы бы не добились без жёсткой доработки.

Каталог и прайс: 400+ услуг без магазинного движка
В прайсе клиники — больше четырёхсот позиций. Первый соблазн — поставить minishop2, полноценный магазинный компонент MODX. Мы от него отказались осознанно: услуги — не товары, корзины и оплаты на сайте не будет (пациент записывается, а платит в клинике), а тащить магазинный движок ради списка с ценами — лишняя сложность и лишние обновления. Обошлись связкой Collections (табличное управление большими списками ресурсов в админке) + pdoPage (постраничный вывод с фильтрами по направлению и цене).
Отдельная история — первичная заливка прайса. Четыреста позиций руками — неделя тоскливой работы с гарантированными опечатками. Вместо этого написали скрипт: Excel-прайс клиники разбирается построчно, и через API MODX (processors ресурсов) каждая позиция создаётся как ресурс с заполненными TV — названием, ценой, длительностью, привязкой к направлению. Заливка заняла минуты, ошибок — ноль, скрипт остался клинике для будущих массовых обновлений.
Текущие правки цен администратор клиники делает сама: Collections показывает услуги таблицей, цена правится по клику, публикация мгновенная. Обучение заняло одну встречу — и это важная метрика: сайт, который клиент не может править сам, через год превращается в памятник.
Онлайн-запись и лиды
Формы записи собрали на FormIt — стандартном компоненте форм MODX. Из любой точки сайта пациент записывается в два клика: на странице услуги врач уже подставлен в форму, на странице врача — наоборот. Дальше заявка идёт двумя путями одновременно: вебхуком в CRM клиники (у них медицинская МИС с API приёма лидов) и письмом администраторам. Дублирование — осознанное: если МИС в момент отправки недоступна, заявка не теряется, а живёт в письме и в журнале отправок FormIt, откуда её можно перезабрать. За год этот запасной канал спас порядка десятка заявок — в деньгах это больше, чем стоила вся настройка форм.
Три технических детали, которые отличают работающую форму от декоративной:
- антиспам без капчи-мучителя — honeypot-поле плюс проверка времени заполнения: боты отсеиваются, пациенты ничего не замечают. Капчу с картинками на медицинском сайте, где записывается аудитория 60+, мы принципиально не ставим;
- валидация телефона — маска и проверка формата на месте: администраторы больше не перезванивают на номера из девяти цифр;
- доставляемость уведомлений — письма уходят через SMTP с корректными SPF/DKIM-записями домена, а не через php mail() с хостинга. До этого у клиники был период, когда заявки со старого сайта падали в спам, — о таких потерях бизнес обычно даже не знает.
Персональные данные и 152-ФЗ на медицинском сайте
Сайт клиники собирает ФИО и телефоны — это персональные данные, и относиться к ним надо серьёзно, тем более в медицинском контексте. Что сделали:
- чекбокс согласия на обработку ПДн в каждой форме — с ссылкой на политику конфиденциальности и без предпроставленной галочки;
- политика конфиденциальности с реквизитами оператора — юридический документ, а не копипаста с чужого сайта;
- хостинг в России — требование локализации ПДн выполняется физически;
- TLS на всём сайте, заявки в админке MODX закрыты отдельными правами доступа: у контент-администратора и у администраторов записи — разные роли;
- минимизация: форма не спрашивает ничего лишнего — имя, телефон, желаемая услуга. Диагнозы и жалобы в веб-форму не вводятся вовсе.
Честная граница ответственности. Сайт закрывает свой периметр: согласия, локализация, защита канала и доступа. Но регистрация оператора ПДн в Роскомнадзоре, внутренние приказы, обработка данных в МИС — зона ответственности самой клиники и её юристов. Мы всегда проговариваем эту границу письменно, чтобы у клиента не было иллюзии «сделали сайт — закрыли весь 152-ФЗ».
SEO и скорость после запуска
Структура URL по направлениям дала поисковикам то, что они ждут от медицинского сайта: страница на каждую услугу с ценой, адресом и врачами. Добавили микроразметку schema.org — Physician для карточек врачей, MedicalClinic с адресом и графиком для организации, плюс хлебные крошки. Сниппеты в выдаче стали заметно богаче.
Скорость — отдельная гордость. MODX без плагинного балласта, характерного для перегруженных WP-сборок, плюс кэширование и оптимизация картинок дали время ответа сервера (TTFB) около 180 мс против 1,4 с у старого сайта — почти в восемь раз быстрее. Все три метрики Core Web Vitals — в зелёной зоне и на мобильных, и на десктопе.

Позиции: через четыре месяца после запуска запросы вида «услуга + район» — основной трафик районной клиники — поднялись из третьего-четвёртого десятка выдачи в топ-10, часть — в топ-5. Из органики пошли записи, которые администраторы фиксируют вопросом «откуда о нас узнали». Быстрый сайт с честной структурой — это не эстетика, это прямой SEO-фактор и прямые деньги.
| Метрика | Старый сайт | Через 4 месяца на MODX |
|---|---|---|
| Время ответа сервера (TTFB) | ~1,4 с | ~180 мс |
| Core Web Vitals | красная зона | все метрики зелёные |
| Страниц услуг в индексе | 5 | 400+ |
| Запросы «услуга + район» в топ-10 | единичные | основная масса ядра |
| Запись через сайт | нет | треть всех первичных записей |
| Обновление прайса | пересборка PDF в Word | правка цены в таблице админки |
Эксплуатация: год спустя
Кейс без цифр эксплуатации — реклама. Про то, как устроен наш регламент сопровождения MODX в целом, есть отдельная статья; здесь — конкретика по этому проекту. Бэкапы — по правилу 3-2-1: ежедневный дамп базы и еженедельный полный архив файлов, копии на нашей площадке в дата-центре МТС, восстановление проверяем на стейджинге раз в квартал. А теперь цифры за первый год:
- Поддержка — 2–3 часа в месяц: обновления MODX и компонентов через стейджинг, контроль бэкапов, мелкие правки вёрстки. Для сравнения: сопоставимый по сложности клиентский сайт на WP с дюжиной плагинов ест у нас 4–6 часов — там чаще обновления и чаще конфликты;
- Взломов — ноль. MODX — редкая цель для массовых сканеров ботов, заточенных под WP, плюс стандартный харденинг: перенос админки с дефолтного адреса, fail2ban, права на каталоги. Наш регламент эксплуатации MODX мы описывали отдельной статьёй;
- Инцидентов — один: при плановом обновлении конфликтнул сторонний компонент галереи. Поймали на стейджинге, на прод не попало, решилось откатом компонента до совместимой версии. Именно поэтому обновления «сразу на бой» мы не делаем никогда;
- Стоимость владения за первый год — разработка плюс хостинг-VPS, домен, TLS-сертификат и 12 месяцев сопровождения — вышла ниже, чем клиника платила прежнему подрядчику за «просто поддержку» старой визитки. Лицензионных платежей — ноль: MODX бесплатен.
Как этот кейс переносится на другие сегменты
Модель «сущности со связями многие-ко-многим» — не медицинская специфика. Та же архитектура без изменений ложится на соседние ниши нашей клиентской базы:
- юридическая фирма: «практики × юристы × кейсы» — на странице практики видны юристы и выигранные дела, на странице юриста — его практики;
- производственная компания: «категории × изделия × техдокументация» — карточка изделия со связанными PDF-чертежами и своими характеристиками-TV;
- учебный центр: «направления × курсы × преподаватели» — один в один структура клиники.
Чек-лист из семи вопросов — признаки, что ваша задача про MODX, а не про шаблонную тему:
- У вашего контента больше одного типа сущностей (услуги, люди, объекты, документы)?
- Между сущностями есть связи, которые должны показываться на обеих сторонах?
- Готовые темы «почти подходят, но…» — и это «но» ломает главное?
- Контент будут править сотрудники без технических навыков?
- Важна скорость и позиции в поиске по структурным запросам?
- Есть внешние системы (CRM, МИС, 1С), куда должны уходить заявки?
- Бюджет — на разработку, а не на вечную аренду лицензий?
Четыре «да» и больше — приходите на бесплатный аудит: посмотрим ваш текущий сайт, прикинем модель данных и честно скажем, нужен ли вам MODX — или хватит WordPress, на котором мы тоже работаем и который для стандартных задач ставим без колебаний.

Оставить комментарий