WP_User_Query и уникальные данные об использовании usermeta

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

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

В плагине мы экспортируем данные usermeta, выбранные пользователем, - используя 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] => [email protected]
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

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

В момент, когда мы экспортируем эти строки метаданных пользователя, мы сначала перебираем этот массив объектов WP_User и затем эхо из отдельных данных поля usermeta (поле $ исходит из массива из $ полей, которые петли за пределами цикла $ 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 , используя метод проверки не-уникальных ключей usermeta и возврата массива в случае, если имеется несколько совпадающих ключей

8 голосов | спросил Q Studio 31 +03002014-10-31T20:58:05+03:00312014bEurope/MoscowFri, 31 Oct 2014 20:58:05 +0300 2014, 20:58:05

1 ответ


3

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

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

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

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

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

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

ответил Q Studio 18 ThuEurope/Moscow2014-12-18T14:30:02+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 14:30:02 +0300 2014, 14:30:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132