2017-05-04 28 views
0

我試圖運行與值數組的meta_query並讓它搜索時,如果所有存在於存儲在一個序列化數組的元價值。這可能嗎?當要比較的元數據是序列化數組時,Wordpress meta_query是一個值數組嗎?

我的用於查詢的參數如下(注意,這是嵌套在一個類):

$args = array(
    'post_type' => $this->posttype, 
    'posts_per_page' => '9', 
    'paged' => $paged, 
    'orderby' => 'meta_value_num', 
    'order' => 'DESC', 
    'meta_key' => 'lumens', 
    'meta_query' => array(
     array(
      'key' => 'mount', 
      'value' => array('pendant' , 'wall'), 
      'compare' => 'IN' 
     ) 

    ) 
); 

存儲的元數據的一個例子,是在一個序列化的陣列類似於下面:

a:4:{i:0;s:7:"pendant";i:1;s:15:"surface-ceiling";i:2;s:4:"wall";i:3;s:14:"aircraft-cable";} 

我的查詢將不會返回相應的結果,無論我怎麼努力。我現在意識到我可能應該將每個值存儲在不同的元鍵中,而不是存儲在一個數組中,但是,現在已經有很多條目可以改變元數據了。

UPDATE:

這是我的解決方法,類似於@Leander方法;我不想改變串行輸入,由於條目已經在數據庫上的金額,有一件事我忘了提,我是利用存儲複選框領域原生串行數據CMB2 Developer Toolkit

// This is pulled from a user input 
$meta_queries = array('pendent' , 'wall'); 

// Metaqueries are passed through loop to create single entries with the like comparison operator 
foreach($meta_queries as $key => $value){ 

    $meta_query = array(
     'key' => '_tf_' . $key, 

     // Serialize the comparison value to be more exact 
     'value' => serialize(strval($value)), 
     'compare' => 'LIKE', 
    ); 

} 

// Generate $args array 
$args = array(

    'post_type' => $this->posttype, 
    'posts_per_page' => '9', 
    'paged' => $paged, 
    'orderby' => 'meta_value_num', 
    'order' => 'DESC', 
    'meta_key' => 'lumens', 
    'meta_query' => $meta_queries 

); 

我在填充數據時沒有注意到很多性能問題。我想如果有大量的數據需要處理,這種方法將不得不重新設計。

回答

1

在同樣的問題,剛跑...!

我有存儲在陣列/自定義字段的一些標籤和正在使用搜索表單查詢我的帖子,其中應允許用戶搜索多個標籤,以便基本上我需要比較反對另一個數組的數組。

我現在意識到我可能應該將每個值存儲在不同的元鍵中,而不是存儲在一個數組中,但是,現在已經有很多條目已經改變了元數據。

我想像會產生相當的開銷,也不會建議...

接近角/解決方法

我與用戶輸入的字符串合作,共創一個數組超出字符串來檢查其大小,並根據大小創建單個LIKE比較,這與我的數組數據一起工作就好了。

$tags_string = get_query_var('p_tags'); // form submitted data 
$tags_array = explode(',', $tags_string); // create array 

if (count($tags_array) > 1) { // check if more then one tag 
$meta_query['p_tags']['relation'] = 'AND'; 

foreach($tags_array as $tag) { // create a LIKE-comparison for every single tag 
    $meta_query['p_tags'][] = array('key' => 'YOUR_KEY', 'value' => $tag, 'compare' => 'LIKE'); 
} 
} else { // if only one tag then proceed with simple query 
    $meta_query['p_tags'] = array('key' => 'YOUR_KEY', 'value' => $tags_string, 'compare' => 'LIKE'); 
} 

參數數量輸出(演示)

[meta_query] => Array 
     (
      [p_tags] => Array 
       (
        [relation] => AND 
        [0] => Array 
         (
          [key] => basic_tags 
          [value] => adobe 
          [compare] => LIKE 
         ) 

        [1] => Array 
         (
          [key] => basic_tags 
          [value] => stone 
          [compare] => LIKE 
         ) 

       ) 

     ) 

注意:根據您的陣列(S)的大小,要查詢職位的數目等。這種解決方案可能不可用的最高性能。

另一種方法可能是FIND_IN_SET擴展WordPress的查詢,see this gist

欣賞有關性能或改進代碼質量的任何輸入。

+0

我有點晚,但是,我張貼我的決心上面。感謝您的輸入。 –

0

太多的條目修改元數據現在

然後運行一個腳本(PHP腳本或MySQL直接),並創建適當的meta_key => meta_value對,然後刪除您的序列化列。序列化的數據只有在被檢索時才應該存儲在數據庫中。如果你懶惰,仍想只有一列,將數據存儲爲JSON,然後將其作爲JSON查詢(現代版本的MySQL允許從JSON類型的列中查詢json數據)。祝你好運。但是,如果你堅持並保持數據的序列化,我向你保證,你或任何維護你的項目的人將繼續爲你需要實現的每個相關小功能敲響頭。