某些元(数组)值的WP元查询

时间:2016-04-12 作者:jave.web

如果我通过“my\\u meta\\u key”使用meta\\u查询来获取帖子,我只会得到这样的结果

Array(
    [0] => Array(
       [nested_key1] => something_I_want1
       [nested_key2] => something_I_want2
       [dont_care_key] => something_I_dont_care_about
    )
    [1] => Array(
       [nested_key1] => something_I_want1
       [nested_key2] => something_I_DONT_want
       [dont_care_key] => something_I_dont_care_about
    )
)
现在我想做一个meta\\u查询,它只会获取带有“my\\u meta\\u key”的帖子,其中包含something_I_want1 AND something_I_want2 同时

问题是,我不能按完整数组进行查询,因为a)我真的不关心“something\\u dont\\u care\\u”meta和b)我不知道它们将是什么-所以我只需要按部分数组进行查询。。。

我尝试了这个但没有成功(WP\\u Query meta\\u Query arg)(没有获取帖子)

\'meta_query\' => [
  [
    \'key\' => \'my_meta_key\',
    \'value\' => [
      \'nested_key1\' => \'something_I_want1\',
      \'nested_key2\' => \'something_I_want2\',
    ],
    \'compare\' => \'IN\', //I\'ve tried with and without  
  ]
],
我做错了什么?甚至可以只通过元数组的一部分进行查询吗?

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

数据库表中的字段不能包含文本字符串和数字以外的其他类型的数据,以及日期和时间等数据的变体。

现场meta_value 属于wp_postmeta 是文本字段。因此,当您将数组存储为meta_value 您实际上是在存储一个字符串,其中包含表示原始数组的序列化数据。如果需要将该字符串再次解释为数组,则需要使用适当的语言将其转换回该格式。

例如,可以在PHP中获取包含数组数据的字符串,将其取消序列化,然后在该数组中搜索。如果知道字符串的结构,还可以analyze it and cast fragments directly on a SQL statement.

但是,这些方法中的任何一种都适合按数组的值进行筛选或搜索,因为SQL中的数组不存在,它是一个字符串,要获得所需的结果,您需要做一项复杂的工作并消耗大量资源。

这是一个SQL限制,因此也是WP\\U查询的限制。

这并不意味着序列化数据根本不适合存储在数据库中。它被认可并通常用于以下数据:NOT 旨在用于过滤、搜索、排序,或以任何其他方式进行排序,而不仅仅是显示信息。

如果需要执行其中一些操作,则应将每个数组键存储在其自己的元字段中。如果需要转换已存储的序列化数据,可以使用如下内容(source):

$args = array(
    \'post_type\' => \'my_post_type\',
    \'meta_key\' => \'my_meta_key\',
    \'posts_per_page\' => -1
 );
$query = new WP_Query( $args );
if($query->have_posts()){
    while($query->have_posts()){
        $query->the_post();
        $my_meta_key = get_post_meta( get_the_ID(), \'my_meta_key\', true );
        add_post_meta( get_the_ID(), \'nested_meta_key_1\', $my_meta_key[\'nested_meta_key_1\']);
        add_post_meta( get_the_ID(), \'nested_meta_key_2\', $my_meta_key[\'nested_meta_key_2\'] );
        delete_post_meta( get_the_ID(), \'my_meta_key\', $my_meta_key );
    }
}

相关推荐

ARRAY_MERGE内的Foreach循环

我需要在下拉菜单中获得用户显示名称的列表。我有查询权限,但我不确定如何准确地将我的用户foreach放入数组中。以下是我需要将用户注入的代码:$data[\'settings\'][\'advanced_options\'] = array_merge($data[\'settings\'][\'advanced_options\'], [ [ "label" => "Dynamic Option 1", //