Розробка веб-сайту на 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 при цьому відповідає тільки за зберігання та видачу контенту.







