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