問題描述

我們編寫和維護的一個 WP 外掛有一個問題 – Export User Data

使用者報告了 non-unique 使用者後設資料記錄未正確返回的問題 – here

在外掛中,我們匯出由使用者選擇的 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_with_meta」,但是這似乎並沒有改變原來返回的資料。

在我們匯出這些使用者後設資料行的時候,我們首先迴圈該 WP_User 物件陣列,然後回顯出個別的 usermeta 欄位資料 ($欄位來自 $ $迴圈外的 $欄位的陣列):

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

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

}

即使在原始返回的物件資料中未顯示該欄位資料,magically 被新增到 $ user 物件,但是我們無法控制是否為每個 usermeta 欄位返回單個或陣列的值。

當資料自動返回時,我們不會控制所選擇的方法,如果我們直接使用 get_user_meta(但是我們仍然會遇到不知道儲存的資料是否唯一的問題,而不需要額外執行) 查詢 – 大量出口成本高昂) 。

我正在全力以赴嘗試向他人解釋這個問題,同時也幫助我們尋找答案並解決這個問題。

更新

我們已經使用一種檢查 non-unique usermeta 鍵的方法將測試修復程式推送到 github,並返回一個陣列,以防止有多個匹配的鍵

最佳解決方案

我們結束的解決方案最終使用單個呼叫 get_user_meta 傳遞 $ user_id – 這樣一來,所有使用者資料都將在單個查詢中返回,從而減少在大量使用者資料匯出期間 DB 上的重負載。

然後,我們對返回的資料進行一系列檢查,包括:

  • is_serialized($ value) – 檢查資料是否以序列化形式返回 (然後我們嘗試將其取消排序 – 在某些情況下,如果資料以不正確的形式儲存,則失敗) 。

  • is_array($ value) – 檢查返回的資料是否實際上是一個陣列

如果我們發現資料在陣列中返回,我們遞迴地展開陣列,直到我們有一個資料字串返回到匯出檔案。

我沒有在這個答案中包含特定的程式碼,而是連結到託管的 github 檔案 (我知道這不是未來的理想選擇,但是與這個答案有關的部分在程式碼中展開) 。

出口執行乾淨,不要 choke-up – 我們將在下週釋出更新的外掛。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。