WP_User_Queryおよび一意でないusermetaデータ


8

私たちが作成して管理している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] => user@email.com
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

「fields」パラメーターのget_users引数を「all」から「all_with_meta」に変更しようとしましたが、これは最初に返されたデータを変更していないようです。

これらのユーザーメタデータ行をエクスポートする時点で、まずWP_Userオブジェクトの配列をループし、次に個々のユーザーメタフィールドデータをエコーし​​ます($ fieldは、$ usersループの外側でループする$ fieldsの配列から取得されます)。

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

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

}

最初に返されたオブジェクトデータには表示されていませんが、フィールドデータは$ userオブジェクトに魔法のように追加されています。ただし、usermetaフィールドごとに単一の値または配列の値を返すかどうかは制御できません。

データは自動的に返されるため、選択したメソッドを制御していません。get_user_metaを直接使用した場合は制御できます(ただし、保存されているデータが一意であるかどうかを知らないため、余分に実行する必要はありません)クエリ-大規模なエクスポートではコストがかかります)。

私はこれを書いて、問題を他の人に試して説明すると同時に、回答を探してこの問題を解決するのに役立てています。

更新

一意ではないusermetaキーをチェックし、一致するキーが複数ある場合は配列を返すメソッドを使用して、テストフィックスをgithubにプッシュしました

回答:


3

最後に行った解決策では、$ user_idだけを渡してget_user_metaへの単一の呼び出しを使用します。これにより、すべてのユーザーデータが単一のクエリで返され、大規模なユーザーデータのエクスポート中にDBにかかる負荷が軽減されます。

次に、返されたデータに対して一連のチェックを実行します。

  • is_serialized($ value)-データがシリアル化された形式で返されたかどうかを確認します(その後、シリアル化を解除しようとします-場合によっては、データが誤った形式で格納されている場合に失敗します)。
  • is_array($ value)-返されたデータが実際に配列かどうかを確認します

データが配列で返されることがわかった場合は、エクスポートファイルに返すデータの文字列が得られるまで、配列を再帰的に展開します。

私はこの回答に特定のコードを含めていませんが、ホストされているgithubファイルにリンクしています(これは将来的には理想的ではないことを知っていますが、この回答に関連する部分はコードに広がっています)。

エクスポートは問題なく実行され、問題はありません。更新されたプラグインは来週リリースされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.