問題描述
我正在開發一個專案,在該專案中,我建立一個自定義帖子型別,並透過與自定義帖子型別相關聯的元框輸入自定義資料。無論什麼原因,我決定以這樣一種方式對元框進行編碼,即每個元變數中的輸入都是陣列的一部分。例如,我正在儲存經度和緯度:
<p>
<label for="latitude">Latitude:</label><br />
<input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" />
</p>
<p>
<label for="longitude">Longitude:</label><br />
<input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" />
</p>
無論什麼原因,我喜歡為每個 metabox 進行一個單獨的後期記錄輸入的想法。在 save_post 鉤子上,我儲存資料如下:
update_post_meta($post_id, '_coordinates', $_POST['coordinates']);
我這樣做是因為我有三個 metaboxes,我喜歡每個帖子都有 3 個 postmeta 值; 然而,我現在已經意識到了一個潛在的問題。我可能希望使用 WP_Query 只能根據這些元值提取某些帖子。例如,我可能想要獲得緯度值大於 50 的所有帖子。如果我在資料庫中單獨擁有這些資料,也許使用 latitude 鍵,我會做一些類似於
$args = array(
'post_type' => 'my-post-type',
'meta_query' => array(
array(
'key' => 'latitude',
'value' => '50',
'compare' => '>'
)
)
);
$query = new WP_Query( $args );
由於我有緯度作為_coordinates postmeta 的一部分,所以這不行。
所以,我的問題是,有沒有辦法利用 meta_query 查詢序列化的陣列,就像我在這種情況下?
最佳解決方案
不,不可能。
我強烈建議您取消對您的資料進行排序,並修改儲存程式。與此類似的應將資料轉換為新格式:
$args = array(
'post_type' => 'my-post-type',
'meta_key' => '_coordinates',
'posts_per_page' => -1
);
$query = new WP_Query( $args );
if($query->have_posts()){
while($query->have_posts()){
$query->the_post();
$c = get_post_meta($post->id,'_coordinates',true);
add_post_meta($post->ID,'_longitude',$c['longitude']);
add_post_meta($post->ID,'_latitude',$c['latitude']);
delete_post_meta($post->ID,'_coordinates',$c);
}
}
然後,您可以根據需要使用單個鍵進行查詢
您可能可以查詢部分日期塊,但這將是超級不可靠,昂貴,緩慢,非常脆弱,有許多邊案例。序列化資料不適用於 SQL 查詢,並且不會以常規和常量的方式進行格式化。
MySQL 將其視為一個字串,不能將其分解成結構化資料。將其分解成結構化資料正是上面的程式碼
如果您需要儲存多個經度和多緯度,則可以儲存多個具有相同名稱的後期後設資料。只需使用 get_post_meta 的第三個引數,它將全部作為陣列返回
次佳解決方案
當將條目序列化到 WP 資料庫中時,您將無法以任何有效的方式查詢您的資料。
您認為透過序列化實現的整體效能節省和收益在任何主要程度上都不會顯著。您可能會獲得略小的資料庫大小,但是如果您查詢這些欄位並嘗試以任何有用的,有意義的方式進行比較,則 SQL 事務的成本將變得很大。
相反,儲存序列化您不想查詢的資料的性質,而只能透過直接的 WP API 呼叫 get_post_meta()以被動方式進行訪問 – 從該函式可以解壓縮序列化條目以訪問其陣列屬性。
實際上分配了 true 的值作為 in;
$meta = get_post_meta( $post->ID, 'key', true );
將資料作為陣列返回,可供您按照常規進行迭代。
您可以專注於其他資料庫/站點最佳化,如快取,CSS 和 JS 縮小,並且如果需要,可以使用像 CDN 這樣的服務。要命名幾個…. WordPress Codex 是一個很好的起點,以更多地發現這個主題:這裡
第三種解決方案
我也遇到這種情況。在這裡我做了什麼
$args = array(
'post_type' => 'my-post-type',
'meta_query' => array(
array(
'key' => 'latitude',
'value' => sprintf(':"%s";', $value),
'compare' => 'LIKE'
)
)
);
希望這個幫助
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。