WP REST API: создание фильтрации и сортировки данных в кастомных эндпоинтах
Работа с REST API в WordPress часто требует не только получения данных, но и их удобной фильтрации и сортировки. Особенно это актуально для кастомных эндпоинтов, когда нужно предоставить пользователям возможность гибко запрашивать нужную информацию. В этой статье мы подробно разберем, как реализовать фильтрацию и сортировку в собственных REST API эндпоинтах WordPress с реальными примерами кода.
Почему нужна фильтрация и сортировка в кастомных REST API
Данные, передаваемые через REST API, могут быть объемными и разнообразными. Без возможности фильтровать и сортировать их клиенту придется загружать все подряд, что негативно скажется на скорости и удобстве работы. Например, если вы создаете API для каталога товаров, клиент может захотеть получить товары определенной категории или отсортировать их по цене.
Добавляя такие возможности, вы делаете API более гибким и полезным, снижаете нагрузку на сервер и улучшаете пользовательский опыт.
Кроме того, правильная фильтрация и сортировка позволяют легко интегрировать ваш API с фронтенд-приложениями, мобильными приложениями и сторонними сервисами.
Регистрация кастомного REST API эндпоинта с параметрами фильтрации
Для примера создадим кастомный эндпоинт, который возвращает список постов типа product с возможностью фильтрации по категории и сортировки по дате публикации или цене.
add_action('rest_api_init', function () {
register_rest_route('wpapi/v1', '/products', [
'methods' => 'GET',
'callback' => 'wpapi_get_products',
'args' => [
'category' => [
'validate_callback' => function($param, $request, $key) {
return is_string($param);
}
],
'orderby' => [
'default' => 'date',
'validate_callback' => function($param, $request, $key) {
return in_array($param, ['date', 'price']);
}
],
'order' => [
'default' => 'desc',
'validate_callback' => function($param, $request, $key) {
return in_array(strtolower($param), ['asc', 'desc']);
}
],
],
'permission_callback' => '__return_true',
]);
});
function wpapi_get_products(WP_REST_Request $request) {
$category = $request->get_param('category');
$orderby = $request->get_param('orderby');
$order = $request->get_param('order');
$args = [
'post_type' => 'product',
'posts_per_page' => 20,
'orderby' => 'date',
'order' => 'DESC',
];
if ($category) {
$args['tax_query'] = [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => sanitize_text_field($category),
]
];
}
if ($orderby === 'price') {
// Предполагаем, что цена хранится в метаполе 'price'
$args['meta_key'] = 'price';
$args['orderby'] = 'meta_value_num';
$args['order'] = strtoupper($order);
} else {
$args['orderby'] = $orderby;
$args['order'] = strtoupper($order);
}
$query = new WP_Query($args);
$products = [];
foreach ($query->posts as $post) {
$products[] = [
'id' => $post->ID,
'title' => $post->post_title,
'date' => $post->post_date,
'price' => get_post_meta($post->ID, 'price', true),
'link' => get_permalink($post->ID),
];
}
return rest_ensure_response($products);
}
В этом коде мы добавляем параметры category, orderby и order с валидацией, чтобы клиент мог передать нужные фильтры. Внутри функции wpapi_get_products формируем WP_Query с учетом этих параметров.
Добавляем поддержку пагинации в API
Для удобства работы с большим количеством данных часто нужна пагинация. Добавим в наш эндпоинт параметры page и per_page.
register_rest_route('wpapi/v1', '/products', [
'methods' => 'GET',
'callback' => 'wpapi_get_products',
'args' => [
'category' => [/* ... */],
'orderby' => [/* ... */],
'order' => [/* ... */],
'page' => [
'default' => 1,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0;
}
],
'per_page' => [
'default' => 10,
'validate_callback' => function($param) {
return is_numeric($param) && $param > 0 && $param <= 100;
}
],
],
'permission_callback' => '__return_true',
]);
function wpapi_get_products(WP_REST_Request $request) {
$page = (int) $request->get_param('page');
$per_page = (int) $request->get_param('per_page');
// ... предыдущие параметры
$args = [
'post_type' => 'product',
'posts_per_page' => $per_page,
'paged' => $page,
// остальные параметры как выше
];
// ... остальной код
}
Теперь клиенты могут запрашивать страницы с товарами, указывая нужное количество элементов на странице.
Использование плагина Clearfy Pro для оптимизации REST API
Если хотите дополнительно оптимизировать безопасность и производительность REST API, обратите внимание на плагин Clearfy Pro. Он позволяет ограничить доступ к стандартным эндпоинтам, отключить ненужные методы и защитить сайт от излишних запросов.
Для разработчиков полезна возможность управлять кэшированием и логированием REST API запросов, что поможет выявлять узкие места и повышать скорость.
Советы по безопасности и производительности фильтрации в REST API
При реализации фильтрации важно:
- Валидировать все входящие параметры, чтобы избежать SQL-инъекций и неправильной работы.
- Ограничивать количество записей на страницу, чтобы не перегружать сервер.
- Использовать кэширование ответов при возможном повторном запросе одинаковых данных.
- Не раскрывать избыточные данные, отдавать только необходимое для клиента.
Такие меры помогут сделать ваш API надежным и быстрым.
Выводы и практические рекомендации
Создание кастомных REST API эндпоинтов с фильтрацией и сортировкой в WordPress — это несложная, но очень полезная задача. Она помогает адаптировать данные под нужды конкретного клиента и улучшить взаимодействие с сайтом.
Используйте встроенные возможности WP_Query с параметрами из REST запроса, обязательно валидируйте входящие данные и добавляйте пагинацию. Для повышения безопасности и производительности рассмотрите использование специализированных плагинов, например, Clearfy Pro.
Такой подход позволит вам создавать мощные и гибкие API для любых задач на WordPress.