Настройка 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 день. Свяжитесь с нами в чате или по почте.







