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.

Шаблоны для WP Плагины для WP