Налаштування контекстів MODX для мультисайтовості
Вам потрібно запустити три сайти — російський, англійський та білоруський. Кожен зі своїм доменом, шаблонами та контентом. Зазвичай це означає три установки MODX: потрійні оновлення, бекапи, налаштування. Контексти MODX вирішують цю проблему: один двигун, різні сайти. Налаштування займає 2-3 дні замість тижня на три установки. Згідно з документацією MODX, контексти забезпечують повну ізоляцію без дублювання ядра. Наші інженери з 5-річним досвідом гарантують стабільну роботу мультисайтової структури. Понад 50 успішних проєктів на MODX. Середня економія на підтримці — 30%, на хостингу — до 40%.
Що таке контексти і для чого вони потрібні?
Контексти — це ізольовані середовища в межах однієї установки MODX. Кожен контекст має власні налаштування, кореневі ресурси, шаблони та навіть мовні параметри. Порівняйте з іншими підходами:
| Підхід |
Складність підтримки |
Продуктивність |
Гнучкість контенту |
Час на розгортання |
| Окремі установки MODX |
Висока (три CMS) |
Середня |
Висока |
5-7 днів |
| Одна установка + контексти |
Низька (одна CMS) |
Висока |
Висока |
2-3 дні |
| Одна установка + підпапки |
Середня |
Висока |
Низька (спільний контент) |
1 день |
Налаштування контекстів у 3 рази швидше, ніж розгортання окремих установок. Економія на хостингу — до 40%, а витрати на підтримку скорочуються на 30% в середньому за нашими проєктами. Додатково ви отримуєте єдину точку входу для управління: оновлення MODX, плагіни та компоненти керуються централізовано.
Як налаштувати контексти: покрокове керівництво
Створення та параметри контексту
Система → Контексти → Створити → ключ en (тільки латиниця, короткий). Після створення налаштуйте параметри:
Ключ: en
Ім'я: English Version
Налаштування (Settings):
base_url: /en/
site_url: https://yourdomain.com/en/
site_start: 55 (ID кореневого ресурсу)
error_page: 56
default_template: 3
cultureKey: en
locale: en_US.UTF-8
Автоматичне перемикання за доменом
Плагін на подію OnHandleRequest перемикає контекст на основі HTTP_HOST або URI:
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$contextMap = [
'ru.company.com' => 'ru',
'en.company.com' => 'en',
'by.company.com' => 'by',
];
if (isset($contextMap[$host])) {
$contextKey = $contextMap[$host];
if ($modx->context->key !== $contextKey) {
$modx->switchContext($contextKey);
}
return;
}
$prefixMap = ['/ru/' => 'ru', '/en/' => 'en', '/uk/' => 'uk'];
foreach ($prefixMap as $prefix => $contextKey) {
if (strpos($uri, $prefix) === 0) {
if ($modx->context->key !== $contextKey) {
$modx->switchContext($contextKey);
}
return;
}
}
Додаткові налаштування плагіна
Якщо вам потрібно також перемикати мовні налаштування, використовуйте `$modx->cultureKey` всередині плагіна. Для кешування карти контекстів можна застосувати `modRegistry`.
Конфігурація Nginx для піддоменів
server {
listen 443 ssl http2;
server_name ru.company.com en.company.com by.company.com;
root /var/www/company.com;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_HOST $host;
include fastcgi_params;
}
}
Ресурси та крос-контекстні посилання
Кожен ресурс прив'язується до контексту через поле context_key. Для створення ресурсу в контексті en використовуйте:
$resource = $modx->newObject('modDocument');
$resource->set('pagetitle', 'About Us');
$resource->set('alias', 'about-us');
$resource->set('context_key', 'en');
$resource->set('template', 3);
$resource->set('parent', 55);
$resource->save();
Для крос-контекстних посилань вкажіть контекст: [[~42? &context=en]].
Синхронізація налаштувань
Системні налаштування мають пріоритет: Global > Context > Namespace. Контекстні налаштування перевизначають глобальні. Приклад отримання URL для поточного контексту:
$siteUrl = $modx->getOption('site_url');
Чому контексти вигідніші за окремі установки?
- Економія ресурсів: одна база даних, одне ядро.
- Єдина адмінка: управління всіма сайтами з одного інтерфейсу.
- Швидке розгортання: новий контекст налаштовується за годину.
- Легкі оновлення: оновлюєте MODX один раз.
Переконайтеся самі: зв'яжіться з нами для консультації. Наші інженери з 5-річним досвідом допоможуть оцінити ваш проєкт. Отримайте точну оцінку та план впровадження.
Які типові помилки виникають при налаштуванні контекстів?
Навіть досвідчені розробники допускають кілька промахів. Найчастіша — неправильна прив'язка кореневого ресурсу site_start. Якщо ресурс не належить контексту, MODX не зможе відобразити сайт. Друга проблема — відсутність плагіна перемикання: без нього всі домени ведуть на один контекст. Третя — конфлікт кешу: контексти використовують спільний кеш MODX, тому налаштування можуть перезаписуватися. Рішення — розділяти кеш за контекстом, увімкнувши опцію cache_context. Четверта — забувають налаштувати cultureKey для мультимовності, через що локалізація не працює. П'ята — помилки в Nginx: неправильна директива server_name або відсутність HTTP_HOST у fastcgi_param.
| Типова помилка |
Причина |
Спосіб уникнути |
| 404 на головній |
site_start не належить контексту |
Перевірте прив'язку кореневого ресурсу |
| Однаковий контент на всіх доменах |
Плагін перемикання не спрацьовує |
Переконайтеся, що подія OnHandleRequest обробляється |
| Проблеми з локалізацією |
cultureKey не заданий або невірний |
Встановіть cultureKey для кожного контексту |
| Конфлікти кешу |
Спільний кеш для всіх контекстів |
Увімкніть cache_context у налаштуваннях |
Ці нюанси ми враховуємо при налаштуванні під ключ.
Чек-лист налаштування контекстів
- Створити контекст і задати параметри.
- Прив'язати кореневий ресурс (
site_start).
- Налаштувати плагін перемикання (домен/префікс).
- Оновити Nginx (передача HTTP_HOST).
- Перевірити крос-контекстні посилання.
- Протестувати перемикання.
Що входить у налаштування під ключ
- Аудит поточної структури сайту.
- Створення контекстів і прив'язка доменів.
- Розробка плагіна перемикання.
- Конфігурація сервера (Nginx/Apache).
- Перенесення контенту в нові контексти.
- Документація та навчання адміністраторів.
- Технічна підтримка на 2 тижні.
Замовте налаштування контекстів MODX під ключ. Зв'яжіться з нами — обговоримо деталі вашого проєкту. Отримайте готове рішення за 2-3 дні з гарантією працездатності.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.