WP_User_Query и неуникальные данные пользователя


8

У нас есть проблема с плагином WP, который мы написали и поддерживаем - Экспорт данных пользователя

Пользователь сообщил о проблеме, что неуникальные записи метаданных пользователя не возвращаются правильно - здесь

В плагине мы экспортируем данные мета пользователя, выбранные пользователем, используя get_users (), который, в свою очередь, использует WP_User_Query:

Мы передаем несколько простых аргументов get_users:

// build argument array ##
$args = array(
      'fields'    => 'all',
      'role'      => sanitize_text_field( $_POST['role'] )
);

Если мы проверяем возвращенный объект WP_User, поля usermeta не возвращаются - например (данные объекта сокращены для экономии места):

Array
(
[0] => WP_User Object
    (
        [data] => stdClass Object
            (
                [ID] => 1267
                [user_login] => user@email.com
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

Мы попытались изменить аргументы get_users для параметра «fields» со «all» на «all_with_meta», однако, похоже, это не меняет первоначально возвращенные данные.

В тот момент, когда мы экспортируем эти строки пользовательских метаданных, мы сначала зациклим этот массив объектов WP_User, а затем выведем на экран отдельные данные поля usermeta ($ field происходит из массива $ fields, который зацикливается вне цикла $ users):

// build row values for each user ##
foreach ( $users as $user ) {

    // grab value from $user object ##
    $value = $user->{$field};

}

Данные поля волшебным образом добавляются к объекту $ user, даже если это не показано в первоначально возвращенных данных объекта - однако мы не можем контролировать, возвращает ли оно одно или массив значений для каждого поля usermeta.

Так как данные возвращаются автоматически, мы не контролируем выбранный метод, что мы могли бы сделать, если бы использовали непосредственно get_user_meta (но у нас все еще была бы проблема не знать, являются ли сохраненные данные уникальными или нет, без выполнения дополнительных запросы - что будет дорого для большого экспорта).

Я пишу все это, чтобы попытаться объяснить другим проблему, а также помочь нам найти ответы и решить эту проблему.

Обновить

Мы отправили тестовое исправление на github, используя метод для проверки неуникальных ключей пользователя и возврата массива в случае, если имеется более одного совпадающего ключа

Ответы:


3

Решение, которое мы использовали в конце, использует один вызов get_user_meta, передающий только $ user_id - таким образом, все пользовательские данные возвращаются в одном запросе, уменьшая большую нагрузку на БД при большом экспорте пользовательских данных.

Затем мы запускаем серию проверок возвращенных данных, в том числе:

  • is_serialized ($ value) - чтобы проверить, были ли данные возвращены в сериализованной форме (затем мы пытаемся десериализовать их - в некоторых случаях происходит сбой, когда данные хранятся в неправильной форме).
  • is_array ($ value) - проверить, являются ли возвращаемые данные массивом

Если мы обнаружим, что данные возвращаются в массиве, мы рекурсивно взрываем массив, пока у нас не будет строки данных для возврата в файл экспорта.

Я не включил в этот ответ конкретный код, а скорее связал его с файлами, размещенными на github (я знаю, что это не идеально для будущего, но части, относящиеся к этому ответу, разбросаны по коду).

Экспорт работает без сбоев - мы выпустим обновленный плагин на следующей неделе.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.