Настройка ProcessWire API для работы с контентом
ProcessWire — PHP CMS с собственным API для работы с контентом прямо в PHP-шаблонах. API основан на цепочке методов ($pages->find()) и позволяет делать сложные выборки без SQL. Для headless-режима используется модуль ProcessWire GraphQL или кастомный REST endpoint.
Встроенный 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 дня.







