Навіщо потрібен кастомний плагін для Pico CMS
Ми — команда з 7-річним досвідом розробки на PHP, спеціалізуємося на Pico CMS з 2018 року. Реалізували понад 50 проєктів, включаючи професійну розробку плагінів для Pico CMS. Вартість простих плагінів стартує від 3000 грн, складних — від 15000 грн.
Уявіть: вам потрібно додати на всі сторінки Pico CMS кастомну форму зворотного зв'язку, яка надсилає дані в зовнішню CRM. Штатними засобами — тільки Twig-парціали та ручна обробка. Без плагіна доведеться правити ядро, що загрожує конфліктами при оновленні. Правильне рішення — написати ізольований PHP-плагін, який підключається через Composer. Плагін — це єдиний спосіб розширення Pico CMS без зміни ядра. Встановлення через Composer плагін робить оновлення простим. Ми займаємося цим більш ніж у 50 проєктах — від простих редиректів до повноцінних корпоративних порталів.
Редагування ядра Pico безпосередньо — шлях до технічного боргу. При наступному оновленні CMS ваші зміни перезапишуться, а якщо ви забудете, що правили, — сайт зламається. Плагін же живе в окремій директорії, підключається через Composer і не чіпає ядро. Це стандартна практика в сучасній PHP-розробці.
Згідно з офіційною документацією Pico, "плагіни є основним способом розширення функціональності" (https://github.com/picocms/Pico).
Як працює система подій Pico
Кожен плагін Pico — це клас, що наслідує AbstractPicoPlugin. Він підписується на події, які CMS генерує в строгому порядку: від завантаження конфігу до рендерингу Twig-шаблону. Методи-обробники отримують аргументи за посиланням (&$variable), що дозволяє модифікувати дані на льоту.
<?php
class MyPlugin extends AbstractPicoPlugin
{
const API_VERSION = 3;
protected $enabled = true;
public function onConfigLoaded(array &$config): void
{
if (!isset($config['my_plugin'])) {
$config['my_plugin'] = ['option' => 'default'];
}
}
public function onMetaHeaders(array &$headers): void
{
$headers['redirect'] = 'Redirect';
$headers['auth_required'] = 'AuthRequired';
}
public function onPageRendering(string &$templateName, array &$twigVariables): void
{
$meta = $twigVariables['meta'];
if (!empty($meta['redirect'])) {
header('Location: ' . $meta['redirect'], true, 302);
exit;
}
}
}
Файл кладеться в plugins/MyPlugin/MyPlugin.php. Стандартна структура директорії:
plugins/
└── MyPlugin/
├── MyPlugin.php
├── config.yml.template
└── README.md
Які події використовуються найчастіше?
Ось ключові точки входу для Pico 3.x. Ми використовуємо їх у 90% проєктів.
| Подія |
Опис |
Типове застосування |
| onPluginsLoaded |
Усі плагіни завантажені |
Доступ до інших плагінів |
| onConfigLoaded |
Конфіг розібрано |
Зміна параметрів |
| onRequestUrl |
URL запиту відомий |
Редиректи, обмеження |
| onMetaHeaders |
Список YAML-заголовків |
Додавання метаполів |
| onContentParsed |
Markdown → HTML |
Вставка шорткодів |
| onPageRendering |
Перед Twig-рендерингом |
Додавання змінних |
Приклад із практики: плагін авторизації за IP
public function onConfigLoaded(array &$config): void
{
$this->allowedIps = $config['ip_restrict']['allowed'] ?? [];
$this->restrictedPaths = $config['ip_restrict']['paths'] ?? [];
}
public function onRequestUrl(string &$url): void
{
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '';
foreach ($this->restrictedPaths as $path) {
if (str_starts_with($url, $path)) {
if (!in_array($clientIp, $this->allowedIps, true)) {
header('HTTP/1.1 403 Forbidden');
echo 'Access denied';
exit;
}
}
}
}
Такий плагін корисний для закриття адмін-панелі або staging-оточення. Він працює на ранньому етапі — onRequestUrl — і блокує доступ до початку обробки контенту, що економить ресурси.
Шорткоди в Pico: як додати?
Pico не підтримує шорткоди з коробки — їх реалізують через onContentParsed. Ми створюємо кастомні Twig фільтри для форматування даних, а також використовуємо Pico API для інтеграцій.
public function onContentParsed(string &$content): void
{
$content = preg_replace_callback(
'/\[youtube\s+id="([a-zA-Z0-9_-]+)"\]/',
static function (array $matches): string {
$id = htmlspecialchars($matches[1], ENT_QUOTES);
return sprintf(
'<div class="video-embed"><iframe src="https://www.youtube.com/embed/%s" '
. 'allowfullscreen loading="lazy" title="YouTube video"></iframe></div>',
$id
);
},
$content
);
}
Типи плагінів: що ми вміємо?
| Тип плагіна |
Складність |
Приклади |
| Обробник однієї події |
1-2 дні |
Редирект за мета-полями, додавання Google Analytics |
| Кастомні Twig-функції |
2-3 дні |
Форма зворотного зв'язку, слайдер на основі YAML |
| Інтеграція із зовнішнім API |
3-5 днів |
Імпорт із CRM, WebHook на оновлення контенту |
| Комплексна бізнес-логіка |
від 5 днів |
Каталог з фільтрацією, управління доступом |
Плагін на Pico розробляється в 3 рази швидше, ніж аналогічне розширення для WordPress, завдяки простій архітектурі подій та мінімалістичному ядру.
Які помилки допускають при розробці плагінів Pico?
- Неправильний порядок подій: наприклад, спроба використати onContentParsed до onPageRendering — контент ще не оброблено.
- Відсутність перевірки на існування масиву:
$config['my_plugin'] може не бути — використовуйте ??.
- Використання глобальних змінних замість переданих за посиланням: це ламає ізоляцію.
- Забутий exit після редиректу: скрипт продовжує виконання, і ви отримаєте помилку заголовків.
- Відсутність тестів: плагін може зламатися при оновленні Pico.
Процес розробки
Ми дотримуємося чіткого регламенту, щоб ви отримали передбачуваний результат:
-
Аналіз — ви описуєте завдання, ми уточнюємо деталі та оцінюємо терміни.
-
Проєктування — визначаємо список подій, структуру конфігу та Twig-змінні.
- Розробка — пишемо код на PHP 8.1+ з урахуванням PSR-12, покриваємо тестами PHPUnit.
- Інтеграційне тестування — перевіряємо плагін на вашому хостингу або в середовищі, наближеному до продакшену.
- Здача — передаємо вихідний код з ліцензією MIT, документацію, конфіг-шаблон та звіт про тестування.
Що входить у роботу
- Вихідний код плагіна з підтримкою Composer-встановлення
- README з описом встановлення та налаштування
- Приклад конфігу в YAML
- Юніт-тести (PHPUnit) з покриттям не менше 80%
- 30 днів безкоштовної підтримки: виправлення багів, консультації
Гарантії та підтримка
Ми гарантуємо сумісність з останніми версіями Pico та PHP, відсутність конфліктів з іншими плагінами завдяки ізольованій архітектурі. Кожен плагін проходить код-рев'ю та статичний аналіз. Уся Pico CMS розробка ведеться з урахуванням PSR-12. Якщо у вас є нестандартна задача — напишіть нам, обговоримо рішення. Щоб замовити плагін Pico, заповніть форму зворотного зв'язку. Отримайте консультацію по вашому проєкту — визначимо необхідні події та терміни за 1 годину.
Замовте розробку плагіна — ми проаналізуємо ваше завдання та запропонуємо оптимальне рішення протягом дня. Зв'яжіться з нами, щоб обговорити деталі.
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 з гарантією результату.