Настройка мультисайтовости 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 дня.







