問題描述
我正在開發一個項目,在該項目中,我創建一個自定義帖子類型,並通過與自定義帖子類型相關聯的元框輸入自定義數據。無論什麼原因,我決定以這樣一種方式對元框進行編碼,即每個元變量中的輸入都是數組的一部分。例如,我正在存儲經度和緯度:
<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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。