Возможно ли составить подобный WP_User_Query?

Ссылка скопирована
1 ответ

Необходимо выбрать из базы пользователей, которые удовлетворяют следующим условиям
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.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

В одном обычном 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',
    ]);
}

$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, но сначала проверьте реальный объём данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно