В WordPress иногда возникает необходимость вывести список пользователей, отфильтрованных по определённым критериям, которые хранятся в пользовательских метаданных (user meta). Например, вы хотите показать только пользователей с определённым значением пользовательского поля, или с набором нескольких условий. В этом материале разберём, как использовать класс WP_User_Query для создания таких запросов и как оптимизировать их работу.
Что такое WP_User_Query и meta-запросы
Класс WP_User_Query — это стандартный инструмент WordPress для выборки пользователей с условиями. Он поддерживает фильтрацию по ролям, статусу, дате регистрации, а также по пользовательским метаданным через параметр meta_query.
Meta-запросы позволяют указывать сложные условия на пользовательские поля, например, искать пользователей с определённым значением, в диапазоне чисел, по части строки и т.д. Это особенно полезно, если вы храните дополнительные данные о пользователях в user meta (например, город, статус подписки, уровень доступа).
Пример базового meta-запроса:
$args = [
'meta_query' => [
[
'key' => 'city',
'value' => 'Moscow',
'compare' => '='
]
]
];
$query = new WP_User_Query($args);
$users = $query->get_results();Создание сложного фильтра с несколькими условиями
Для более сложных условий meta-запрос поддерживает операторы AND и OR — их можно определить в параметре relation. Например, необходимо вывести пользователей, которые живут в Москве или Санкт-Петербурге и при этом имеют подписку «premium».
Пример:
$args = [
'meta_query' => [
'relation' => 'AND',
[
'relation' => 'OR',
[
'key' => 'city',
'value' => 'Moscow',
'compare' => '='
],
[
'key' => 'city',
'value' => 'Saint Petersburg',
'compare' => '='
],
],
[
'key' => 'subscription',
'value' => 'premium',
'compare' => '='
]
]
];
$query = new WP_User_Query($args);
$users = $query->get_results();Данный запрос вернёт всех пользователей, которые живут в одном из указанных городов и имеют подписку «premium».
Фильтрация по числовым и датам параметрам
Meta-запросы поддерживают сравнения числовых значений и дат, если указать параметр type. Например, можно получить всех пользователей, у которых количество заказов больше 10:
$args = [
'meta_query' => [
[
'key' => 'orders_count',
'value' => 10,
'compare' => '>',
'type' => 'NUMERIC'
]
]
];
$query = new WP_User_Query($args);
$users = $query->get_results();Для дат можно использовать тип DATE и сравнения вида >=, <= и т.п.
Вывод результатов и оптимизация запросов
После выполнения запроса можно перебрать пользователей и вывести нужную информацию:
if (!empty($users)) {
foreach ($users as $user) {
echo '<p>ID: ' . esc_html($user->ID) . ' - ' . esc_html($user->display_name) . '</p>';
}
} else {
echo '<p>Пользователи не найдены.</p>';
}Стоит помнить, что сложные meta-запросы могут быть тяжёлыми для базы данных и влиять на производительность. Хорошей практикой будет:
- Создавать индексы в базе для часто используемых ключей meta (если есть доступ к базе).
- Использовать кэширование результатов через Transients API или сторонние кэширующие плагины.
- Минимизировать кол-во условий и проверять необходимость каждого.
Пример плагина для создания фильтрованного списка пользователей на фронтенде
Ниже пример простого плагина, который добавляет шорткод [wpall_filtered_users] для вывода списка пользователей с фильтрацией по городу и подписке.
/*
Plugin Name: WPAll Filtered Users
Description: Выводит список пользователей с фильтром по метаданным через шорткод
Version: 1.0
Author: WPAll
*/
add_shortcode('wpall_filtered_users', 'wpall_filtered_users_shortcode');
function wpall_filtered_users_shortcode($atts) {
$atts = shortcode_atts([
'city' => '',
'subscription' => ''
], $atts, 'wpall_filtered_users');
$meta_query = ['relation' => 'AND'];
if (!empty($atts['city'])) {
$meta_query[] = [
'key' => 'city',
'value' => sanitize_text_field($atts['city']),
'compare' => '='
];
}
if (!empty($atts['subscription'])) {
$meta_query[] = [
'key' => 'subscription',
'value' => sanitize_text_field($atts['subscription']),
'compare' => '='
];
}
$args = [
'meta_query' => $meta_query,
'number' => 20
];
$query = new WP_User_Query($args);
$users = $query->get_results();
if (empty($users)) {
return '<p>Пользователи не найдены.</p>';
}
$output = '<ul>';
foreach ($users as $user) {
$output .= '<li>' . esc_html($user->display_name) . ' (' . esc_html($user->user_email) . ')</li>';
}
$output .= '</ul>';
return $output;
}
Вы можете использовать шорткод на странице так:
[wpall_filtered_users city="Moscow" subscription="premium"]
Этот пример можно доработать, добавив пагинацию, сортировку и более сложные фильтры.
Использование плагинов из WPSHOP для расширения функционала
Для более удобного управления пользовательскими данными и расширенными фильтрами можно использовать плагин Clearfy Pro от WPSHOP. Он позволяет оптимизировать работу с метаданными и добавляет удобные инструменты для управления ролями и доступами.
Также для создания интерфейсов с фильтрами можно обратить внимание на WPRemark, который позволяет создавать отзывы и рейтинги с расширенными возможностями фильтрации и сортировки пользователей.