Клієнт запускав інтернет-магазин на Kirby CMS і зіткнувся з обмеженнями: вбудовані поля не підтримували прив'язку товарів до CRM, а зображення потрібно було конвертувати в WebP. Стандартні засоби не давали гнучкості — довелося писати плагін. Такі ситуації виникають регулярно, коли бізнес-логіка виходить за рамки коробкового функціоналу.
Плагін може реалізувати інтеграцію із зовнішніми сервісами, додати кастомні поля в панель керування на Vue 3, перевизначити маршрути для API або виконувати фонові завдання через хуки. Наприклад, при публікації статті автоматично генерувати WebP-зображення та надсилати сповіщення в Telegram. І все це без зміни вихідного коду Kirby, що спрощує оновлення та знижує ризик поломок. Ми розробляємо кастомні плагіни — PHP-пакети, які розширюють ядро CMS без правки його коду. Зв'яжіться з нами для попередньої оцінки вашого проєкту.
Як розробити кастомний плагін для Kirby?
Стек: PHP 8.3, Kirby 4, Vue 3 (для Panel), Composer, Docker. Використовуємо Kirby::plugin() для реєстрації розширень. Типова структура папок включає index.php, папки lib/, templates/, assets/.
<?php
// site/plugins/my-plugin/index.php
use Kirby\Cms\App;
use Kirby\Cms\Page;
App::plugin('vendor/my-plugin', [
'options' => [
'cache' => true,
'apiKey' => null,
],
'fields' => require __DIR__ . '/lib/fields.php',
'methods' => require __DIR__ . '/lib/methods.php',
'routes' => require __DIR__ . '/lib/routes.php',
'hooks' => require __DIR__ . '/lib/hooks.php',
'blueprints' => require __DIR__ . '/lib/blueprints.php',
'translations' => [
'uk' => require __DIR__ . '/lib/translations/uk.php',
'en' => require __DIR__ . '/lib/translations/en.php',
],
]);
Як уникнути N+1 запитів і не перевантажити сервер?
Без грамотних хуків кожен запит до сторінки породжує десятки зайвих SQL-запитів. Ми реалізуємо кешування на рівні плагіна: скидаємо кеш тільки при зміні конкретної сторінки, а не всього сайту. Це знижує навантаження на сервер у 3–5 разів. В одному проєкті інтеграція з Meilisearch скоротила час пошуку з 2 секунд до 50 мс. Отримайте безкоштовну консультацію щодо вашого проєкту.
<?php
// lib/hooks.php
return [
'page.create:after' => function (Page $page) {
if ($page->intendedTemplate()->name() !== 'article') return;
$url = urlencode(kirby()->site()->url() . '/sitemap.xml');
@file_get_contents("https://www.google.com/ping?sitemap={$url}");
},
'page.update:after' => function (Page $newPage, Page $oldPage) {
if (kirby()->cache('pages')->exists($newPage->id())) {
kirby()->cache('pages')->remove($newPage->id());
}
},
'file.create:after' => function (\Kirby\Cms\File $file) {
if (!$file->isImage()) return;
$file->thumb(['width' => 800, 'format' => 'webp']);
$file->thumb(['width' => 400, 'format' => 'webp']);
},
];
Як інтегрувати зовнішні API через кастомні маршрути?
Часто потрібно отримувати дані з CRM або білінгу. Через кастомні маршрути ми створюємо захищені ендпоінти, що повертають JSON або XML. В одному проєкті зробили пошук по товарах через Meilisearch — результат віддається за 50 мс замість 2 секунд. Це в 40 разів швидше стандартного пошуку.
Які користувацькі поля можна додати в панель керування?
Стандартний набір полів не завжди підходить. Ми розробляємо Vue-компоненти: colorpicker, tag-input, map-picker. Це прискорює роботу редакторів і виключає помилки введення.
<?php
// lib/fields.php
return [
'colorpicker' => [
'props' => [
'value' => function ($value = '#000000') { return $value; },
'presets' => function (array $presets = []) { return $presets; },
],
'save' => function ($value): string {
if (!preg_match('/^#[0-9A-Fa-f]{6}$/', $value)) {
throw new \Exception('Invalid color format');
}
return $value;
},
],
];
// assets/js/fields.js
panel.plugin('vendor/my-plugin', {
fields: {
colorpicker: {
template: `
<k-field v-bind="$props">
<input type="color" :value="value" @input="$emit('input', $event.target.value)">
<div class="presets">
<button v-for="color in presets" :key="color"
:style="{ background: color }"
@click="$emit('input', color)" />
</div>
</k-field>
`,
props: { value: String, presets: Array },
},
},
});
Реєстрація асету в index.php: 'assets' => ['js/fields.js' => __DIR__ . '/assets/js/fields.js'].
У Kirby доступні хуки для всіх основних подій: створення, оновлення, видалення сторінок і файлів, рендеринг шаблонів, надсилання email та інші. Хуки дозволяють впровадити бізнес-логіку без зміни коду сайту. Згідно з офіційною документацією, плагіни — найкращий спосіб розширення функціоналу.
Чому кастомні плагіни кращі за модифікацію ядра?
Пряма зміна ядра Kirby призводить до проблем при оновленнях: кожен новий реліз може перезаписати ваші правки. Плагіни ж живуть у своїй ізольованій папці й використовують тільки публічне API. При правильному семантичному версіонуванні ваш плагін залишиться сумісним з новими версіями без зайвих доопрацювань. Це економить час і гроші на підтримці.
Порівняння підходів до кешування
| Підхід |
Результат |
Час відповіді |
| Без плагіна, загальний кеш |
Скидається все при будь-якій зміні |
2 с |
| З плагіном, кеш по сторінках |
Скидається тільки змінена сторінка |
0.4 с |
Що входить у розробку плагіна під ключ
- Вихідний код плагіна з документацією
- Налаштування Composer-пакета (опціонально)
- Приклад використання кастомних методів і хуків
- Міграції (якщо потрібні)
- Інструкція з установки та налаштування
- Підтримка протягом місяця після деплою
Типові помилки при розробці плагінів
- Неправильна робота з кешем — скидати тільки ті записи, які змінилися.
- Ігнорування семантичного версіонування — ламає сумісність при оновленнях.
- Хардкод опцій замість використання
option() — ускладнює конфігурування.
Процес роботи
- Аналітика — вивчаємо поточну архітектуру та вимоги.
- Проектування — визначаємо хуки, методи, поля, маршрути. Узгоджуємо з вами.
- Реалізація — пишемо код на PHP 8.3 та Vue 3.
- Тестування — юніт-тести ключових сценаріїв, перевірка на staging.
- Деплой — налаштування на сервері, перевірка сумісності з кешуванням.
Терміни орієнтовно
| Тип плагіна |
Терміни |
| Простий (методи + хуки) |
1–3 дні |
| З кастомним полем панелі (Vue) |
3–6 днів |
| Складний (Panel-розділ + API + кеш) |
1–2 тижні |
Точну оцінку дамо після аналізу вимог. Замовте розробку плагіна — ми підготуємо технічне завдання та запропонуємо оптимальне рішення.
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 з гарантією результату.