Налаштування мультисайтовості Craft CMS
Craft CMS підтримує кілька сайтів з однієї інсталяції: різні домени, мови, регіони. Контент може бути унікальним для кожного сайту або синхронізуватися між ними.
Архітектура мультисайту
Інсталяція Craft
├── Site Group: Main
│ ├── Site: mysite.ru (ru-RU) — основний
│ ├── Site: mysite.com (en-US)
│ └── Site: mysite.de (de-DE)
└── Site Group: Microsite
└── Site: promo.mysite.ru (ru-RU)
Налаштування через CP або Project Config
# config/project/sites/mysite-ru.yaml
name: 'My Site RU'
handle: mySiteRu
language: ru-RU
primary: true
enabled: true
hasUrls: true
baseUrl: 'https://mysite.ru/'
Nginx конфігурація для кількох доменів на одну інсталяцію:
# Обидва домени вказують на один document root
server {
server_name mysite.ru mysite.com mysite.de;
root /var/www/mysite/web;
# ...стандартний Craft Nginx конфіг...
}
Управління контентом по сайтах
propagationMethod у Section визначає, як контент поширюється:
-
all— запис створюється для всіх сайтів автоматично -
none— тільки для сайту, де створена -
siteGroup— для сайтів з тієї ж групи -
language— для сайтів з тією ж мовою
# config/project/sections/blog.yaml
propagationMethod: all
siteSettings:
mySiteRu:
hasUrls: true
uriFormat: 'blog/{slug}'
template: blog/_entry
mySiteEn:
hasUrls: true
uriFormat: 'en/blog/{slug}'
template: blog/_entry
mySiteDe:
hasUrls: true
uriFormat: 'de/blog/{slug}'
template: blog/_entry
Поля з різною локалізацією
Field "title": translationMethod = site (свій заголовок для кожного сайту)
Field "publishDate": translationMethod = none (одна дата)
Field "heroImage": translationMethod = none (спільне зображення)
Field "body": translationMethod = site (унікальний текст)
Field "slug": translationMethod = site (slug на мові сайту)
Переключник мов у шаблоні
{# Список всіх версій поточної сторінки #}
<nav class="language-switcher">
{% for site in craft.app.sites.getAllSites() %}
{% set localeEntry = entry.getLocalized().site(site).one() %}
{% if localeEntry %}
<a href="{{ localeEntry.url }}"
lang="{{ site.language | slice(0, 2) }}"
{% if site.id == currentSite.id %}aria-current="page"{% endif %}>
{{ site.language | upper | slice(0, 2) }}
</a>
{% endif %}
{% endfor %}
</nav>
Запити з урахуванням сайту
{# Контент поточного сайту (автоматично) #}
{% set posts = craft.entries().section('blog').all() %}
{# Явне указання сайту #}
{% set enPosts = craft.entries().section('blog').site('mySiteEn').all() %}
{# Через PHP у модулі #}
$entries = Entry::find()
->section('blog')
->site(\Craft::$app->sites->getSiteByHandle('mySiteRu'))
->all();
Переводи інтерфейсу
// translations/ru/site.php
return [
'Read more' => 'Читать далее',
'Published on {date}' => 'Опубликовано {date}',
];
У Twig:
{{ "Read more" | t('site') }}
{{ "Published on {date}" | t('site', { date: entry.postDate | date('d.m.Y') }) }}
Налаштування мультисайту з 2–3 мовами для існуючого проекту займає 2–4 дні.







