web-dev-qa-db-ja.com

WP_User_Queryと一意ではないユーザーメタデータ

私たちが書いて維持している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]...

"fields"パラメータのget_users引数を "all"から "all_with_meta"に変更しようとしましたが、これは最初に返されたデータを変更するようには思われません。

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

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

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

}

最初に返されたオブジェクトデータには表示されていませんが、フィールドデータは magically が$ userオブジェクトに追加されています。 usermetaフィールド.

データが自動的に返されるので、 get_user_meta を直接使用すれば選択できるメソッドを制御できません(ただし、格納されているデータが一意であることがわからないという問題があります追加のクエリを実行しないと、大量のエクスポートにはコストがかかります)。

私は答えを探してこの問題を解決する手助けをしながら他の人に問題を説明しようとするためにこれをすべて書き出しています。

更新

一致しているキーが複数ある場合は、一意でないユーザーメタキーをチェックして配列を返すメソッドを使用して、 github にテスト修正を適用しました。

8
Q Studio

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

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

  • is_serialized ($ value) - データが直列化された形式で返されたかどうかを確認します(その後、直列化解除を試みます - データが保存されている場所で失敗する場合があります)間違った形式です。
  • is_array ($ value) - 返されたデータが実際には配列であるかどうかを調べる

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

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

エクスポートはきれいに実行され、動かなくなりません - 来週更新されたプラグインをリリースする予定です。

3
Q Studio