Возможно ли составить подобный WP_User_Query?
Необходимо выбрать из базы пользователей, которые удовлетворяют следующим условиям
1. являются администраторами
или
2. роль может быть любая, но у определенного мета-поля должно быть определенное значение.
Или подобное с помощью WP_User_Query не реализовать и нужен кастомный запрос к БД?
Дополнительно:
Привет. Можно
$args = array( 'role' => 'administrator', // Выбрать администраторов 'meta_query' => array( 'relation' => 'OR', // Логическое ИЛИ для следующих условий array( 'key' => 'your_meta_key', // Замените на ключ мета-поля 'value' => 'your_desired_value', // Значение мета-поля 'compare' => '=', // Сравнение: равно ), ), ); $user_query = new WP_Query( $args ); |
$args = array( 'role' => 'administrator', // Выбрать администраторов 'meta_query' => array( 'relation' => 'OR', // Логическое ИЛИ для следующих условий array( 'key' => 'your_meta_key', // Замените на ключ мета-поля 'value' => 'your_desired_value', // Значение мета-поля 'compare' => '=', // Сравнение: равно ), ), ); $user_query = new WP_Query( $args );
- так а разве
'relation' => 'OR',
будет работать для 'role'?
по-моему, в данном случае relation будет работать для нескольких условий в meta_query
а мне надо, либо администратор, либо любая роль, но определенное значение мета-поля. - denism300, хм, не уловил изначально.
Попробуйте:// Создаем WP_Query для выбора администраторов $args_admins = array( 'role' => 'administrator', ); $query_admins = new WP_Query( $args_admins ); // Создаем WP_Query для выбора пользователей с определенным мета-полем $args_meta = array( 'meta_query' => array( array( 'key' => 'your_meta_key', 'value' => 'your_desired_value', 'compare' => '=', ), ), ); $query_meta = new WP_Query( $args_meta ); // Комбинируем результаты запросов $users = array_merge( $query_admins->get_posts(), $query_meta->get_posts() );// Создаем WP_Query для выбора администраторов $args_admins = array( 'role' => 'administrator', ); $query_admins = new WP_Query( $args_admins ); // Создаем WP_Query для выбора пользователей с определенным мета-полем $args_meta = array( 'meta_query' => array( array( 'key' => 'your_meta_key', 'value' => 'your_desired_value', 'compare' => '=', ), ), ); $query_meta = new WP_Query( $args_meta ); // Комбинируем результаты запросов $users = array_merge( $query_admins->get_posts(), $query_meta->get_posts() );
- Smirator, да, спасибо. Такой вариант, думаю, подойдет
- denism300, буду благодарен, если отметите решением. Успехов!
Ответы:
/* @see https://wp-kama.ru/function/get_users @return [WP_User Object( ... )] */ $users = get_users( [ 'role' => 'administrator', 'meta_key' => 'MY_META_KEY', 'meta_value' => 'MY_META_KEY_VALUE' ] ); // foreach... |
/* @see https://wp-kama.ru/function/get_users @return [WP_User Object( ... )] */ $users = get_users( [ 'role' => 'administrator', 'meta_key' => 'MY_META_KEY', 'meta_value' => 'MY_META_KEY_VALUE' ] ); // foreach...
- мне надо, либо администратор, либо любая роль, но определенное значение мета-поля.
а тут будет выбор всех админов с определенным значением мета-поля - denism300, ну так удалите ключ 'role'. Либо используйте 'role__in' => [], 'role__not_in' => [] если какие-то определенные нужны/не нужны.
- paparazi, да без проблем, если подскажете, как это комбинировать с meta_query, так, чтобы получилось либо администратор, либо любая роль, но определенное значение мета-поля.
- denism300, хмм...
...либо администратор, либо любая роль
- подразумевает что "роль" в постановке этой задаче вообще лишнее слово. Тогда получается вот такое код:
$users = get_users( [ 'meta_key' => 'MY_META_KEY', 'meta_value' => 'MY_META_KEY_VALUE' ] ); foreach ( $users as $user ) { printf( '<pre>%s</pre>', print_r( $user, true ) ); }
$users = get_users( [ 'meta_key' => 'MY_META_KEY', 'meta_value' => 'MY_META_KEY_VALUE' ] ); foreach ( $users as $user ) { printf( '<pre>%s</pre>', print_r( $user, true ) ); }
Однако, исходя из того, что в Вашем вопросе оно все же есть, предполагаю что с администраторами еще что-то нужно сделать(отфильтровать/удалить/снять привилегии), тогда поросто проверьте его роль и делайте задуманное например так:
foreach ( $users as $user ) { if ( in_array( 'administrator', $user->roles ) ) { // some action... } }
foreach ( $users as $user ) { if ( in_array( 'administrator', $user->roles ) ) { // some action... } }
- UPD. Подсмотрев оратора выше кажется понял, что Вам нужны отдельно администраторы без выборки по метаполю, и отдельно пользователи, у которых значения поля = чему-то... Тогда ответ выше для вас. Либо так же использовать 2 вызова функции get_users.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В одном обычном
WP_User_Queryусловие вида “пользователь администратор ИЛИ у пользователя есть meta_key=meta_value” нормально не собирается черезrole+meta_query. Параметрrelationвнутриmeta_queryработает только между meta-условиями, а не между ролью и meta_query. Плюс роли WordPress технически тоже лежат в usermeta, но в сериализованном поле capabilities, поэтому смешивать это в аккуратный запрос через стандартный API неудобно.Практичный вариант: сделать два запроса через
get_users(), получить ID и объединить их без дублей:$admins = get_users([ 'role' => 'administrator', 'fields' => 'ID', ]); $by_meta = get_users([ 'meta_key' => 'your_meta_key', 'meta_value' => 'your_desired_value', 'fields' => 'ID', ]); $user_ids = array_values(array_unique(array_merge($admins, $by_meta))); $users = []; if ($user_ids) { $users = get_users([ 'include' => $user_ids, 'orderby' => 'include', ]); }
Для большинства задач это лучше кастомного SQL: код понятнее, меньше риска сломаться на мультисайте или из-за особенностей хранения ролей. Если пользователей десятки тысяч и важна производительность, тогда уже имеет смысл писать отдельный SQL по
$wpdb->usermeta, но сначала проверьте реальный объём данных.