数据库表中的字段不能包含文本字符串和数字以外的其他类型的数据,以及日期和时间等数据的变体。
现场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 );
}
}