WordPress предоставляет мощный REST API, который позволяет разработчикам получать и изменять данные сайта через HTTP-запросы. Однако, стандартный эндпоинт для пользователей не поддерживает фильтрацию по мета-полям из коробки. В этой статье мы разберём, как расширить REST API WordPress, чтобы можно было запрашивать пользователей с фильтрацией по произвольным мета-полям, что особенно полезно для проектов с кастомизацией профилей или сложной логикой доступа.
Почему фильтрация пользователей по мета-полям важна
В стандартном WordPress пользовательские мета-поля (user meta) широко используются для хранения дополнительной информации — например, роли, статуса, настроек или других данных. Часто возникает задача получить именно тех пользователей, у которых задано определённое мета-значение. Это может быть полезно для:
- Выборки пользователей по статусу (например, активные подписчики);
- Формирования списков с кастомными фильтрами;
- Интеграции с внешними сервисами, где нужны только определённые пользователи;
- Реализации сложных бизнес-логик в плагинах и темах.
Поэтому расширение REST API позволит сделать работу с пользователями более гибкой и удобной.
Как расширить REST API для фильтрации пользователей по мета-полям
По умолчанию в REST API WordPress можно получить список пользователей через эндпоинт /wp-json/wp/v2/users, но фильтрация по мета-полям не поддерживается. Чтобы добавить такую возможность, нам нужно:
- Зарегистрировать новый параметр запроса для эндпоинта пользователей;
- Добавить обработчик, который будет модифицировать WP_User_Query для фильтрации по мета-данным;
- Обеспечить безопасность и валидацию входных данных.
Пример кода: регистрация фильтра по мета-полю в REST API
add_action('rest_user_query', 'wpreboot_rest_filter_users_by_meta', 10, 2);
function wpreboot_rest_filter_users_by_meta($args, $request) {
if (!empty($request['meta_key']) && !empty($request['meta_value'])) {
$args['meta_query'] = array(
array(
'key' => sanitize_text_field($request['meta_key']),
'value' => sanitize_text_field($request['meta_value']),
'compare' => '=',
),
);
}
return $args;
}
add_action('rest_api_init', function () {
register_rest_route('wp/v2', '/users', array(
'methods' => 'GET',
'callback' => 'wpreboot_rest_get_users',
'permission_callback' => function () {
return current_user_can('list_users');
},
'args' => array(
'meta_key' => array(
'validate_callback' => 'rest_validate_request_arg',
),
'meta_value' => array(
'validate_callback' => 'rest_validate_request_arg',
),
),
));
});
function wpreboot_rest_get_users($request) {
$args = array('number' => 10);
$args = wpreboot_rest_filter_users_by_meta($args, $request);
$user_query = new WP_User_Query($args);
$users = array();
foreach ($user_query->get_results() as $user) {
$users[] = array(
'id' => $user->ID,
'login' => $user->user_login,
'email' => $user->user_email,
);
}
return rest_ensure_response($users);
}
Этот код добавляет возможность делать GET-запросы с параметрами meta_key и meta_value для фильтрации пользователей. Например, запрос:
GET /wp-json/wp/v2/users?meta_key=city&meta_value=Moscow
вернёт пользователей, у которых в мета-поле city указано значение Moscow.
Как использовать фильтрацию по мета-полям с плагинами из WPShop
Если вы используете плагины из WPShop, например, WPGPT или Expert Review, вы можете интегрировать расширенный REST API с их функционалом для выбора определённых пользователей в ваших кастомных сценариях. Это позволит, к примеру, автоматически формировать списки рецензентов или подписчиков с нужными параметрами и запускать на них нужные процессы с помощью API.
Дополнительные советы по безопасности и оптимизации
При расширении REST API важно не только добавить функциональность, но и позаботиться о безопасности и производительности:
- Права доступа: убедитесь, что только авторизованные пользователи с нужными правами могут выполнять запросы к новому фильтру. В примере выше используется проверка
current_user_can('list_users'). - Санитизация данных: все параметры запроса должны проходить фильтрацию и валидацию, чтобы избежать инъекций и ошибок.
- Кэширование: если запросы к REST API с фильтрацией по мета-полям выполняются часто, рассмотрите возможность кэширования результатов для снижения нагрузки на базу данных.
- Ограничение выдачи: используйте параметры пагинации и лимиты, чтобы не перегружать сервер и не возвращать слишком большой объём данных.
Выводы
Расширение стандартного REST API WordPress для фильтрации пользователей по мета-полям открывает новые возможности для разработки сложных и гибких решений. Это полезно для кастомных проектов и интеграций с внешними сервисами. В статье мы рассмотрели конкретный пример реализации с кодом, который можно адаптировать под свои задачи и расширять.
Для удобства вы можете использовать плагины из WPShop и совмещать их с таким REST API для автоматизации различных процессов на сайте.