Настройка Kirby как Headless CMS через API

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка Kirby как Headless CMS через API
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1252
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1170
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    873
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1092
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    830
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    849

Настройка Kirby как Headless CMS через API

Kirby CMS имеет встроенный Content Representations механизм и официальный headless-режим через KirbyQL или REST. Для production headless рекомендуется официальный плагин kirby-headless-starter или кастомные маршруты.

Встроенный Content Representations

Kirby позволяет отдавать контент в JSON через .json.php файлы в templates:

// site/templates/blog.json.php
$kirby->response()->json();

echo json_encode([
    'title' => $page->title()->value(),
    'pages' => $page->children()
        ->listed()
        ->filterBy('status', 'published')
        ->sortBy('date', 'desc')
        ->map(fn($post) => [
            'id'      => $post->id(),
            'title'   => $post->title()->value(),
            'slug'    => $post->slug(),
            'url'     => $post->url(),
            'date'    => $post->date()->toDate('Y-m-d'),
            'excerpt' => $post->excerpt()->value(),
            'cover'   => $post->cover()->toFile()?->url(),
        ])
        ->values(),
]);

Запрос: GET /blog.json

KirbyQL — GraphQL-подобный API

composer require getkirby/kql
// Запрос к /api/query
const response = await fetch(`${KIRBY_URL}/api/query`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Basic ${btoa(`${KIRBY_EMAIL}:${KIRBY_PASSWORD}`)}`,
  },
  body: JSON.stringify({
    query: {
      pages: {
        query: 'page("blog").children.listed.sortBy("date", "desc").paginate(12)',
        select: {
          id: true,
          title: true,
          slug: true,
          url: true,
          date: 'page.date.toDate("Y-m-d")',
          excerpt: true,
          cover: {
            query: 'page.cover.toFile',
            select: { url: true, width: true, height: true, alt: true },
          },
          categories: {
            query: 'page.categories.toPages',
            select: { title: true, slug: true, url: true },
          },
        },
        pagination: { page: 1, limit: 12 },
      },
    },
  }),
});

Аутентификация API

// site/config/config.php
return [
  'api' => [
    'allowInsecure' => false,
    'basicAuth' => true,
    'cors' => true,
  ],
  'api.cors' => [
    'allowMethods' => 'GET, POST, OPTIONS',
    'allowOrigin'  => env('FRONTEND_URL', '*'),
    'allowHeaders' => 'Authorization, Content-Type',
    'maxAge'       => '300',
  ],
];

Лучше использовать read-only API User:

// site/accounts/[email protected]
<?php return [
  'email'    => '[email protected]',
  'role'     => 'api',
  'password' => password_hash('readonly-password', PASSWORD_DEFAULT),
];

Кастомные API-маршруты

// site/config/config.php
'routes' => [
  [
    'pattern' => 'api/v1/blog',
    'action'  => function () {
      return Response::json([
        'posts' => page('blog')
          ->children()
          ->listed()
          ->sortBy('date', 'desc')
          ->toArray(fn($p) => [
            'title'   => $p->title()->value(),
            'slug'    => $p->slug(),
            'url'     => $p->url(),
            'date'    => $p->date()->toDate('Y-m-d'),
            'excerpt' => $p->excerpt()->value(),
          ]),
      ]);
    },
    'method' => 'GET',
  ],

  [
    'pattern' => 'api/v1/blog/(:any)',
    'action'  => function (string $slug) {
      $post = page('blog/' . $slug);
      if (!$post) return Response::json(['error' => 'Not found'], 404);

      return Response::json([
        'title'   => $post->title()->value(),
        'content' => $post->text()->kirbytext()->value(), // HTML
        'date'    => $post->date()->toDate('Y-m-d'),
      ]);
    },
    'method' => 'GET',
  ],
],

Next.js интеграция

// lib/kirby.ts
const KQL_ENDPOINT = `${process.env.KIRBY_URL}/api/query`;
const AUTH = Buffer.from(`${process.env.KIRBY_API_USER}:${process.env.KIRBY_API_PASSWORD}`).toString('base64');

export async function kqlQuery(query: object) {
  const res = await fetch(KQL_ENDPOINT, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Basic ${AUTH}`,
    },
    body: JSON.stringify({ query }),
    next: { revalidate: 3600 },
  });
  return res.json();
}

Настройка Kirby headless с KQL и Next.js фронтендом — 2–4 дня.