Настройка ProcessWire API для Headless CMS: REST, GraphQL, PHP — под ключ за 2–4 дня.
Организация выдачи контента через ProcessWire API
Проект на ProcessWire живёт несколько лет, накопились десятки шаблонов, а тут приходит задача: сделать SPA на React или мобильное приложение. Стандартный PHP-рендеринг не подходит — клиенту нужен чистый JSON. Можно нагородить костылей через прямой доступ к БД, но это ломает всю логику прав доступа и кэширования. Правильное решение — поднять HTTP-API поверх существующих шаблонов. Мы делаем это за 2–4 дня, используя штатные средства: шаблон-роутер или модуль GraphQL. Ничего не переписываем — только добавляем новый endpoint.
На счету больше 30 таких проектов. Самая нагруженная конфигурация выдерживает до 100 000 запросов в сутки на бюджетном VPS. API работает без сбоев уже два года. Ниже разберём, какие есть варианты реализации.
Встроенный PHP API
ProcessWire использует $pages, $page, $user, $config как глобальные переменные в шаблонах:
// templates/blog.php // Выборка с фильтрами и пагинацией $limit = 12; $start = ($input->pageNum - 1) * $limit; $posts = $pages->find("template=blog-post, status=published, sort=-date, limit=$limit, start=$start"); $totalPosts = $pages->count("template=blog-post, status=published"); // Выборка с условиями по полям $featuredPosts = $pages->find(" template=blog-post, featured=1, date>=today, category.name%=Web Development, sort=-date, limit=3 "); // Один элемент $post = $pages->get("template=blog-post, slug=my-post-slug"); if (!$post->id) wire404(); Selector String — язык запросов
// Текстовый поиск $pages->find("template=product, title*=laptop, sort=title"); // Числовые условия $pages->find("template=product, price>=1000, price<=5000"); // Дата $pages->find("template=event, event_date>=today, sort=event_date"); // OR-условия $pages->find("template=post, (category=tech|category=science)"); // Связанные страницы $pages->find("template=product, categories.id={$category->id}"); // Полнотекстовый поиск $pages->find("title|body~=search query, template=post"); // Сортировка по кастомному полю $pages->find("template=product, sort=-rating, sort=title"); REST API через ProCache или кастомный модуль
ProcessWire не имеет встроенного REST API. Создаём через шаблон-роутер:
// site/templates/api.php // URL: /api/blog/?page=1&limit=10 header('Content-Type: application/json'); header('Access-Control-Allow-Origin: ' . $config->httpHost); // Простая авторизация по ключу $apiKey = $input->get->text('key'); if ($apiKey !== $config->apiKey) { http_response_code(401); echo json_encode(['error' => 'Unauthorized']); return; } $page_num = (int) $input->get->int('page') ?: 1; $limit = min((int) $input->get->int('limit') ?: 10, 100); $start = ($page_num - 1) * $limit; $posts = $pages->find(" template=blog-post, status=published, sort=-date, limit=$limit, start=$start "); $result = [ 'data' => array_map(fn($post) => [ 'id' => $post->id, 'title' => $post->title, 'slug' => $post->name, 'url' => $post->url, 'date' => $post->date->format('Y-m-d'), 'excerpt' => $post->excerpt, 'image' => $post->image ? [ 'url' => $post->image->width(800)->url, 'width' => 800, 'height' => (int) round(800 / $post->image->ratio), ] : null, ], $posts->getArray()), 'total' => $posts->getTotal(), 'page' => $page_num, 'limit' => $limit, ]; echo json_encode($result); Модуль ProcessWire GraphQL
Установка через модули ProcessWire. Скачать с processwire.com/modules/processwire-graphql/ и в config.php добавить настройки:
$config->graphql = [ 'templateFilters' => ['blog-post', 'product', 'category'], 'fieldFilters' => ['title', 'body', 'date', 'image', 'category'], 'maxLimit' => 100, ]; query { blogPost(s: "status=published, sort=-date, limit=10") { list { id title date body image { url(width: 800) } category { title url } } total } } Кэширование ответов
// Кэш через WireCache $cacheKey = "api_posts_page{$page_num}"; $cached = $cache->get($cacheKey); if ($cached) { echo $cached; return; } // ... формирование $result ... $json = json_encode($result); $cache->save($cacheKey, $json, 3600); // 1 час echo $json; Создание базового REST API на ProcessWire (5–7 endpoint-ов) — 2–4 дня. Стоимость базового REST API — от 20 000 ₽, GraphQL с кешем — от 35 000 ₽.
Сравнение REST и GraphQL для ProcessWire
| Критерий | Кастомный REST | ProcessWire GraphQL |
|---|---|---|
| Сложность реализации | Средняя (шаблон-роутер) | Низкая (модуль + конфиг) |
| Скорость разработки | 2–4 дня | 1–2 дня |
| Контроль над ответом | Полный | Ограничен настройками |
| Типизация | Нет | Есть (через GraphQL schema) |
| Кэширование на уровне | Endpoint | Запрос (через persisted queries) |
REST лучше, когда нужен минимальный ответ и полный контроль. GraphQL — если клиентам нужна гибкость выборки полей.
ProcessWire как Headless CMS: преимущества
В отличие от WordPress (где API — костыль) или Strapi (тяжёлый), ProcessWire даёт один источник данных для PHP-шаблонов и внешних клиентов. Вы пишете шаблоны один раз, а JSON-вывод — просто второй шаблон с заголовками. Это снижает стоимость поддержки на 30–40% по нашим оценкам.
ProcessWire API documentation подтверждает, что селекторы работают одинаково в шаблонах и API.
Что входит в настройку ProcessWire API
| Этап | Длительность | Описание |
|---|---|---|
| Проектирование | 0.5 дня | Схема эндпоинтов, типы данных |
| Реализация REST | 1–2 дня | Шаблон-роутер, авторизация, CORS |
| Или GraphQL | 0.5–1 день | Модуль, конфиг, тесты |
| Кэширование | 0.5 дня | WireCache + Redis |
| Документация | 0.5 дня | Postman или Swagger |
| Тестирование и деплой | 1 день | Нагрузочные тесты, мониторинг |
Типичные ошибки при самостоятельной реализации
- Неправильные заголовки CORS (не все методы разрешены)
- Отсутствие лимитов на запросы (уязвимость)
- Сериализация всего объекта $page (утечка лишних данных, медленный response)
- Нет кэша — каждый запрос грузит БД
Мы все это учитываем с первого дня.
Как мы это делаем: этапы
- Аналитика: изучаем структуру шаблонов и полей, определяем нужные эндпоинты.
- Проектирование: рисуем схему данных и решаем, что отдаём клиенту.
- Реализация: пишем шаблон-роутер или подключаем GraphQL, настраиваем кэш.
- Тестирование: проверяем все endpoint-ы, нагрузочное тестирование (100 concurrent requests).
- Деплой: заливаем на боевой сервер, настраиваем мониторинг.
Гарантируем результат: если через 4 дня API не работает — доводим до ума бесплатно. Опыт — 30+ проектов на ProcessWire.
REST API на ProcessWire разрабатывается в 2–3 раза быстрее, чем на WordPress с плагинами, благодаря единому синтаксису селекторов.
Наши преимущества: 30+ проектов ProcessWire API
За 7 лет работы с ProcessWire мы реализовали API для e-commerce-платформ, SaaS-сервисов и контентных порталов. Знаем неочевидные ограничения: поведение PermissionManager при headless-режиме, нюансы ProCache с Bearer-токенами, особенности fieldgroup при сериализации вложенных объектов. Самая нагруженная конфигурация из нашей практики обрабатывает 100 000 запросов в сутки на сервере с 4 GB RAM без деградации. Готовы взяться за проект любой сложности: от базового REST с пятью endpoint-ами до GraphQL с персистентными запросами и real-time подпиской. Пришлите описание вашей задачи — предложим оптимальный стек и оценим за 1 рабочий день.
Получите консультацию по вашему проекту — напишите нам, оценим за 1 день. Свяжитесь с нами в чате или по почте.







