問題描述

我們編寫和維護的一個 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。