WP_User_Query dan data usermeta non-unik

8

Kami memiliki masalah dengan plugin WP yang kami tulis dan kelola - Ekspor Data Pengguna

Seorang pengguna telah melaporkan masalah bahwa catatan data meta pengguna yang tidak unik tidak dikembalikan dengan benar - di sini

Di plugin, kami mengekspor data usermeta yang dipilih oleh pengguna - menggunakan get_users () yang pada gilirannya menggunakan WP_User_Query:

Kami memberikan beberapa argumen sederhana ke get_users:

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

Jika kami memeriksa objek WP_User dikembalikan, bidang usermeta tidak dikembalikan - misalnya (data objek dikurangi untuk menghemat ruang):

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

        [ID] => 1267
        ...
    )

[1]...

Kami telah mencoba mengubah argumen get_users untuk parameter "bidang" dari "semua" menjadi "all_with_meta", namun ini tampaknya tidak mengubah data yang dikembalikan semula.

Pada titik di mana kami mengekspor baris metadata pengguna ini, pertama-tama kami mengulangi array objek WP_User tersebut dan kemudian mengulang data individual usermeta field ($ field berasal dari array $ fields yang loop di luar $ users loop):

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

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

}

Data bidang sedang ditambahkan secara ajaib ke objek $ user, meskipun ini tidak ditampilkan dalam data objek yang awalnya dikembalikan - namun, kami tidak memiliki kontrol atas apakah mengembalikan satu atau array nilai untuk setiap bidang usermeta.

Karena data dikembalikan secara otomatis, kami tidak mengendalikan metode yang dipilih, yang dapat kami lakukan jika kami menggunakan get_user_meta secara langsung (tetapi kami masih memiliki masalah karena tidak mengetahui data yang disimpan unik atau tidak, tanpa menjalankan tambahan pertanyaan - yang akan mahal pada ekspor besar).

Saya menulis ini semua untuk mencoba dan menjelaskan kepada orang lain masalah ini, sementara juga untuk membantu kami mencari jawaban dan menyelesaikan masalah ini.

Memperbarui

Kami telah mendorong uji perbaikan ke github menggunakan metode untuk memeriksa kunci usermeta yang tidak unik dan mengembalikan array jika ada lebih dari satu kunci yang cocok.

Q Studio
sumber

Jawaban:

3

Solusi yang kami gunakan pada akhirnya menggunakan satu panggilan untuk mendapatkan_user_meta hanya dengan $ user_id - dengan cara ini semua data pengguna dikembalikan dalam satu permintaan, mengurangi beban yang berat pada DB selama ekspor data pengguna yang besar.

Kami kemudian menjalankan serangkaian pemeriksaan terhadap data yang dikembalikan - termasuk:

  • is_serialized ($ value) - untuk memeriksa apakah data telah dikembalikan dalam bentuk serial (kami kemudian mencoba untuk membatalkan registrasi - dalam beberapa kasus ini gagal ketika data telah disimpan dalam bentuk yang salah).
  • is_array ($ value) - untuk memeriksa apakah data yang dikembalikan sebenarnya sebuah array

Jika kami menemukan bahwa data dikembalikan dalam sebuah array, kami secara terus-menerus menanamkan array tersebut hingga kami memiliki serangkaian data untuk kembali ke file ekspor.

Saya belum memasukkan kode spesifik dalam jawaban ini, melainkan tertaut ke file github yang di-host (saya tahu ini tidak ideal untuk masa depan, tetapi bagian-bagian yang terkait dengan jawaban ini tersebar dalam kode).

Ekspor berjalan dengan bersih dan jangan tersumbat - kami akan merilis plugin yang diperbarui minggu depan.

Q Studio
sumber