Разработка сайта на CMS ProcessWire
ProcessWire — нереляционная CMS с API, построенным вокруг концепции «всё есть страница». Каждая единица контента — это страница с полями; шаблон — это PHP-файл, который рендерит страницу. Подобная архитектура даёт полный контроль над структурой данных без ограничений, характерных для WordPress или Drupal.
Когда выбирают ProcessWire
ProcessWire выигрывает в задачах, где контентная структура сложная и нестандартная: каталоги услуг с десятками атрибутов, многоязычные порталы, сайты с нестандартной иерархией страниц. Он не навязывает тип сайта — нет «постов» и «страниц» в понимании WP, есть только страницы с полями, которые вы определяете сами.
Типичные проекты:
- корпоративные сайты с нетривиальной структурой разделов
- каталоги продукции с фасетной фильтрацией
- многоязычные сайты (до 30+ языков через LanguageSupport)
- порталы с кастомными правами доступа к контенту
Архитектура проекта
Структура шаблонов ProcessWire следует простому принципу: один шаблон — один PHP-файл в /site/templates/. Разметка, логика и данные могут быть разделены через директорию controllers/ или через встроенные _init.php/_main.php.
/site/
templates/
_init.php # глобальные переменные, подключение хелперов
_main.php # обёртка layout (header/footer)
home.php # шаблон главной
services.php # шаблон списка услуг
service-item.php # шаблон одной услуги
partials/
nav.php
hero.php
modules/ # кастомные модули
config.php
Доступ к данным через $pages API:
// Получить все дочерние страницы с фильтрацией
$services = $pages->find("template=service-item, status=published, sort=sort, limit=12");
// Полнотекстовый поиск
$results = $pages->find("template=service-item, title|body*=$q, limit=20");
// Вложенные селекторы
$recent = $pages->find("template=news, date>=" . strtotime("-30 days") . ", sort=-date");
Поля и типы данных
ProcessWire поддерживает более 30 типов полей «из коробки»: FieldtypeText, FieldtypeTextarea, FieldtypeImage, FieldtypeFile, FieldtypePage (связи), FieldtypeRepeater (повторяемые группы), FieldtypeOptions, FieldtypeMapMarker.
Реляции между страницами — через FieldtypePage:
// Шаблон services.php — вывод связанных материалов
foreach ($page->related_cases as $case) {
echo "<a href='{$case->url}'>{$case->title}</a>";
}
FieldtypeRepeater используется для секций с переменным числом блоков — например, блоки «иконка + заголовок + текст» на лендинге:
foreach ($page->features as $feature) {
echo "<div class='feature'>";
echo "<img src='{$feature->icon->url}'>";
echo "<h3>{$feature->headline}</h3>";
echo "<p>{$feature->text}</p>";
echo "</div>";
}
Многоязычность
Модули LanguageSupport, LanguageSupportFields, LanguageSupportPageNames включаются через админку. После активации у каждого текстового поля появляются вкладки языков. В шаблоне переключение языка — одна строка:
$user->language = $languages->get("en");
echo $page->title; // вернёт английский заголовок
URL-адреса страниц тоже переводятся: /ru/uslugi/razrabotka/ и /en/services/development/ — одна и та же страница.
Права доступа и роли
ProcessWire имеет гранулярные права: можно ограничить редактирование конкретного шаблона конкретной ролью, запретить публикацию без подтверждения, скрыть поля от определённых пользователей. Настройка через $config->pagefileSecure и модуль PageEditPerRole.
Производительность
Кэширование на уровне шаблона через $cache API:
$nav = $cache->get("main-nav");
if (!$nav) {
$nav = buildNav($pages);
$cache->save("main-nav", $nav, 3600); // TTL 1 час
}
ProCache (платный модуль) генерирует статические HTML-файлы и отдаёт их напрямую через .htaccess, обходя PHP полностью — скорость приближается к статическим сайтам.
Типовые сроки разработки
| Тип сайта | Страниц/шаблонов | Срок |
|---|---|---|
| Корпоративный сайт | 6–10 шаблонов | 3–5 недель |
| Каталог с фильтрацией | 8–14 шаблонов | 5–8 недель |
| Многоязычный портал | 10–20 шаблонов | 7–12 недель |
| API-бэкенд (headless) | 4–8 шаблонов | 2–4 недели |
Headless-режим
ProcessWire работает как headless CMS через модуль ProcessWireAPI или вручную — шаблон возвращает JSON:
// api.php — шаблон для API-эндпоинта
header("Content-Type: application/json");
$data = [];
foreach ($pages->find("template=product, limit=50") as $p) {
$data[] = [
"id" => $p->id,
"title" => $p->title,
"slug" => $p->name,
"price" => $p->price,
"image" => $p->image->httpUrl ?? null,
];
}
echo json_encode($data);
Фронтенд на React или Next.js забирает данные через этот эндпоинт. ProcessWire при этом отвечает только за хранение и выдачу контента.







