WP REST API — мощный инструмент для взаимодействия с данными WordPress через HTTP-запросы. Создание подробных фильтров с помощью REST API позволяет организовать удобный поиск и выборку контента на сайте, что особенно актуально для больших проектов с большим количеством записей, товаров или пользователей.
Преимущества использования WP REST API для фильтрации
Основное преимущество — возможность отделить фронтенд от бэкенда, делая интерфейс более динамичным и отзывчивым. Фильтрация через REST API позволяет загружать только нужные данные без полной перезагрузки страницы, что улучшает UX и снижает нагрузку на сервер.
Кроме того, REST API поддерживается из коробки в WordPress, и его можно расширять под свои задачи, добавляя новые параметры фильтрации и правила выборки.
Наконец, REST API легко интегрируется с современными JavaScript-фреймворками, такими как React или Vue, позволяя создавать интерактивные интерфейсы.
Как расширить стандартные эндпоинты для создания собственных фильтров
По умолчанию WP REST API позволяет фильтровать записи по таким параметрам, как категория, метки, автор и т.д. Однако для более сложных фильтров, например, по произвольным полям или нескольким параметрам одновременно, нужна расширенная кастомизация.
Для этого создадим функцию wpfind_register_custom_filters, которая добавит новые параметры в запросы к эндпоинту записей.
function wpfind_register_custom_filters() {
add_filter('rest_post_query', function($args, $request) {
$meta_key = $request->get_param('meta_key');
$meta_value = $request->get_param('meta_value');
if ($meta_key && $meta_value) {
$args['meta_query'] = [
[
'key' => sanitize_text_field($meta_key),
'value' => sanitize_text_field($meta_value),
'compare' => '='
]
];
}
$custom_tax = $request->get_param('custom_taxonomy');
$custom_term = $request->get_param('custom_term');
if ($custom_tax && $custom_term) {
$args['tax_query'] = [
[
'taxonomy' => sanitize_text_field($custom_tax),
'field' => 'slug',
'terms' => sanitize_text_field($custom_term),
]
];
}
return $args;
}, 10, 2);
}
add_action('rest_api_init', 'wpfind_register_custom_filters');В этом примере мы добавляем поддержку параметров meta_key, meta_value для фильтрации по произвольному полю, и custom_taxonomy, custom_term для фильтрации по произвольной таксономии.
Пример запроса с новыми параметрами фильтрации
Теперь можно делать запрос вида:
GET /wp-json/wp/v2/posts?meta_key=price&meta_value=1000&custom_taxonomy=genre&custom_term=thrillerЭтот запрос вернет все записи, у которых метаполе price равно 1000 и которые принадлежат термину thriller таксономии genre.
Реализация фронтенда для динамической фильтрации
На стороне клиента можно использовать JavaScript для сбора параметров фильтра и динамического запроса к REST API. Ниже пример на чистом JavaScript:
document.getElementById('filter-form').addEventListener('submit', function(e) {
e.preventDefault();
const price = document.getElementById('price').value;
const genre = document.getElementById('genre').value;
let url = '/wp-json/wp/v2/posts?';
if (price) {
url += 'meta_key=price&meta_value=' + encodeURIComponent(price) + '&';
}
if (genre) {
url += 'custom_taxonomy=genre&custom_term=' + encodeURIComponent(genre);
}
fetch(url)
.then(response => response.json())
.then(data => {
const container = document.getElementById('results');
container.innerHTML = '';
data.forEach(post => {
const div = document.createElement('div');
div.innerHTML = `<h3>${post.title.rendered}</h3><p>${post.excerpt.rendered}</p>`;
container.appendChild(div);
});
});
});Этот код слушает отправку формы, собирает данные фильтра, формирует URL с параметрами и подгружает результаты без перезагрузки страницы.
Использование плагинов для расширения возможностей фильтрации
Если хочется упростить процесс, можно использовать плагины, которые расширяют WP REST API. Например:
- WP REST Filter — добавляет удобные фильтры по метаполям и таксономиям.
- WPGraphQL — альтернативный API с мощными возможностями выборки и фильтрации.
- Clearfy Pro — содержит функции оптимизации и расширения API, упрощая создание кастомных эндпоинтов.
Однако иногда удобнее и надежнее написать собственное решение, особенно для уникальных бизнес-задач.
Советы по безопасности и производительности
При добавлении пользовательских параметров фильтрации важно тщательно проверять и санитизировать входящие данные, чтобы предотвратить SQL-инъекции и другие атаки.
Также нужно контролировать нагрузку на сервер, например, ограничивать количество возвращаемых записей с помощью параметров per_page и page.
Для кеширования можно использовать встроенные механизмы WordPress или сторонние плагины, чтобы ускорить повторные запросы с одинаковыми параметрами.