Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/suetin/wp-irbis/archive/refs/heads/main.zipПлагин для интеграции WordPress с библиотечным каталогом ИРБИС.
Плагин не рендерит интерфейс и не зависит от темы. Он только:
- подключается к серверу ИРБИС
- нормализует входные параметры поиска
- отдаёт данные через
REST API - предоставляет PHP helpers для поиска
REST API
Публичный endpoint:
/wp-json/wp-irbis/v1/search
Простой запрос:
/wp-json/wp-irbis/v1/search?search_by=title&search_string=Война%20и%20мир
Запрос с дополнительными фильтрами:
/wp-json/wp-irbis/v1/search?search_by=title&search_string=Война%20и%20мир&filters[year]=2020&filters[language]=ru
Параметры:
search_by:title,author,keywordssearch_stringsearch_categoryfilters— объект или query-параметры видаfilters[field]=valuelimitbase_url
Ответ:
items— массив найденных книгerror— ошибка поиска илиnullrequest— нормализованныйSearchRequesthas_query— был ли передан поисковый запросdebug— отладочные данные, если debug включен
Запросы из темы
Пример с fetch:
const url = new URL('/wp-json/wp-irbis/v1/search', window.location.origin);
url.searchParams.set('search_by', 'title');
url.searchParams.set('search_string', 'Война и мир');
url.searchParams.set('limit', '10');
url.searchParams.set('filters[language]', 'ru');
url.searchParams.set('filters[year]', '2020');
const response = await fetch(url.toString(), {
headers: {
Accept: 'application/json',
},
});
const payload = await response.json();
Пример с base_url, если тема синхронизирует фильтры с адресной строкой:
const url = new URL('/wp-json/wp-irbis/v1/search', window.location.origin);
url.searchParams.set('search_by', 'author');
url.searchParams.set('search_string', 'Пушкин');
url.searchParams.set('base_url', window.location.pathname);
const response = await fetch(url.toString(), {
headers: {
Accept: 'application/json',
},
});
const payload = await response.json();
Пример POST/axios не нужен: endpoint публичный и работает по GET.
PHP helpers
Поиск с массивом результата:
$result = irbis_catalog_search([
'search_by' => 'title',
'search_string' => 'Война и мир',
'filters' => [
'language' => 'ru',
],
]);
Поиск с DTO:
$result = irbis_catalog_search_result([
'search_by' => 'author',
'search_string' => 'Пушкин',
'filters' => [
'year' => '2020',
],
]);
Стабильный DTO запроса:
\WpIrbis\Domain\SearchRequest
Расширение фильтров
Новые фильтры лучше добавлять в filters, а не в top-level параметры.
Пример:
$result = irbis_catalog_search([
'search_by' => 'title',
'search_string' => 'Физика',
'filters' => [
'year' => '2024',
'language' => 'ru',
'publisher' => 'Наука',
],
]);
Чтобы превратить дополнительные фильтры в expression для IRBIS, используйте hook:
add_filter('wp_irbis/search_expression_parts', function (array $parts, \WpIrbis\Domain\SearchRequest $request) {
if (! empty($request->filters['year'])) {
$parts[] = 'G=' . $request->filters['year'] . '$';
}
if (! empty($request->filters['language'])) {
$parts[] = 'J=' . $request->filters['language'] . '$';
}
if (! empty($request->filters['publisher'])) {
$parts[] = 'O=' . $request->filters['publisher'] . '$';
}
return $parts;
}, 10, 2);
Хуки
Изменить request:
add_filter('wp_irbis/request', function ($request) {
if (! $request instanceof \WpIrbis\Domain\SearchRequest) {
return $request;
}
return new \WpIrbis\Domain\SearchRequest(
$request->searchBy,
$request->searchString,
$request->searchCategory,
array_merge($request->filters, ['year' => '2020']),
20,
$request->baseUrl
);
});
Изменить параметры поиска:
add_filter('wp_irbis/search_parameters', function ($parameters, $request) {
$parameters->numberOfRecords = 20;
return $parameters;
}, 10, 2);
Изменить книгу после маппинга:
add_filter('wp_irbis/book_data', function ($book) {
return $book;
});