Php 当要比较的元数据是序列化数组时,Wordpress meta_查询值数组?
我试图用一个值数组运行meta_查询,并让它搜索存储在序列化数组中的meta值中是否存在所有值。这可能吗 我的查询参数如下(请注意,这是嵌套在类中的): 存储在序列化数组中的元数据示例如下所示:Php 当要比较的元数据是序列化数组时,Wordpress meta_查询值数组?,php,wordpress,metadata,cmb2,Php,Wordpress,Metadata,Cmb2,我试图用一个值数组运行meta_查询,并让它搜索存储在序列化数组中的meta值中是否存在所有值。这可能吗 我的查询参数如下(请注意,这是嵌套在类中的): 存储在序列化数组中的元数据示例如下所示: a:4:{i:0;s:7:"pendant";i:1;s:15:"surface-ceiling";i:2;s:4:"wall";i:3;s:14:"aircraft-cable";} 无论我尝试什么,我的查询都不会返回适当的结果。我现在意识到,我可能应该将每个值存储在不同的元键中,而不是存储在数组中
a:4:{i:0;s:7:"pendant";i:1;s:15:"surface-ceiling";i:2;s:4:"wall";i:3;s:14:"aircraft-cable";}
无论我尝试什么,我的查询都不会返回适当的结果。我现在意识到,我可能应该将每个值存储在不同的元键中,而不是存储在数组中,然而,现在已经有很多条目需要更改元数据了
更新:
这是我的变通方法,类似于@Leander方法;由于数据库中已有大量的条目,我不想更改序列化的输入,有一件事我忘了提到,我是在本地使用which将复选框字段存储为序列化数据
// 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
);
在填充数据时,我没有注意到太多的性能问题。我想,如果有大量数据需要处理,这种方法将不得不重新设计。刚刚遇到了同样的问题 我有一些标签存储在一个数组/自定义字段中,我正在使用搜索表单查询我的帖子,在这里,应该允许用户搜索多个标签,因此本质上我需要将一个数组与另一个数组进行比较 我现在意识到,我可能应该将每个值存储在不同的元键中,而不是存储在数组中,然而,现在已经有很多条目需要更改元数据了 我想这会产生相当大的开销,我不建议 方法/解决方案 我以字符串的形式处理用户输入,用字符串创建一个数组来检查其大小,并根据大小创建类似于单个的比较,它可以很好地处理数组数据
$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' );
}
参数输出(演示)
注意:取决于数组的大小、要查询的帖子数量等。此解决方案可能不是最有效的
另一种方法可能是WordPress查询的FIND_IN_SET扩展
感谢任何关于性能或提高代码质量的意见
现在更改元数据的条目太多
然后运行一个脚本(PHP脚本或MySQL直接)并创建适当的meta_键=>meta_值对,然后删除序列化列。仅当序列化数据要按原样检索时,才应将其存储在数据库中。如果您很懒,仍然希望只有一列,那么将数据存储为JSON,然后以JSON的形式查询它们(MySQL的现代版本允许从JSON类型的列查询JSON数据)。祝你好运
但是,如果您坚持并保持数据序列化,我向您保证,您或维护您的项目的任何人都将继续为您需要实现的每个相关的小功能绞尽脑汁。由于元数据在数据库列中序列化,并且在技术上表示为字符串,因此您可以进行REGEXP比较 由您的示例引用 元值(数据库) 查询
$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' => '"(pendant|wall)"',
'compare' => 'REGEXP'
)
)
);
或者,如果您有一个值数组,则可以执行以下操作
array(
'key' => 'mount',
'value' => '"('. implode('|', array('pendant' , 'wall')) .')"',
'compare' => 'REGEXP'
)
注意
如果“value”值包含有效正则表达式需要转义的特殊字符,请使用preg_quote函数。否则这个解决方案应该100%有效。我有点晚了,但是,我在上面发布了我的解决方案。谢谢你的意见。
a:4:{i:0;s:7:"pendant";i:1;s:15:"surface-ceiling";i:2;s:4:"wall";i:3;s:14:"aircraft-cable";}
$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' => '"(pendant|wall)"',
'compare' => 'REGEXP'
)
)
);
array(
'key' => 'mount',
'value' => '"('. implode('|', array('pendant' , 'wall')) .')"',
'compare' => 'REGEXP'
)