我正在尝试从我的自定义插件和帖子类型获取数据表单数据库。我的查询参数应该像
$args = array(
'post_type' => 'products',
'post_status'=> 'publish',
'meta_query' => array(
'relation' => 'OR',
array( 'key'=>'product_commercial',
'value'=>'on',
'compare'=>'='
),
array( 'key'=>'product_exterior',
'value'=>'on',
'compare'=>'='
)
)
);
$search_query = new WP_Query( $args );
但我正在尝试动态添加元键值,如:
$inner_arrays=array();
$count = 0;
foreach($values as $value){
if($value){
$inner_arrays[$count]['key'] .= $value;
$inner_arrays[$count]['value'] .= 'on';
$inner_arrays[$count]['compare'] .= '=';
$count++;
}
}
$args = array(
'post_type' => 'products',
'post_status'=> 'publish',
'meta_query' => array(
'relation' => 'OR',
$inner_arrays
)
);
//值是一些随机值(比如从db中获取)。
现在,当我使用echo "<pre>Last SQL-Query: {$search_query->request}".'<br/>';
显示
Last SQL-Query: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id ) WHERE 1=1 AND (
(
( wp_postmeta.meta_key = 'product_commercial' AND CAST(wp_postmeta.meta_value AS CHAR) = 'on' )
**AND**
( mt1.meta_key = 'product_framed' AND CAST(mt1.meta_value AS CHAR) = 'on' )
**AND**
( mt2.meta_key = 'product_horizontal' AND CAST(mt2.meta_value AS CHAR) = 'on' )
)
) AND wp_posts.post_type = 'products' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
问题:我使用“ relation =&gt; OR ”,但在sql查询中获得“ AND ”。我在哪里做错了?
答案 0 :(得分:0)
$args['meta_query']
分配了以下内容:
array(
'relation' => 'OR',
$inner_arrays
)
如果你要检查这个,例如通过print_r( $args['meta_query'] );
,您可以看到:
Array ( [relation] => OR [0] => Array ( [0] => Array ( key => product_commercial, value => on, compare => = ), [1] => Array ( key => product_exterior, value => on, compare => = ) ) )
换句话说,$inner_arrays
数组本身成为$args['meta_query']
的子数组。正如Custom Field Parameters所述:
重要说明:
meta_query
使用数组元查询参数数组(需要数组数组) - 您可以在下面的例子中看到这一点。此构造允许您使用第一个(外部)数组中的relation
参数来查询多个元数据,以描述元查询之间的布尔关系。接受的论点是&#39; AND&#39;,&#39; OR&#39;。默认值为&#39; AND&#39;。
因此,您使用默认关系$inner_arrays
合并AND
的元素,然后将 的结果与$args['meta_query']
的任何其他成员合并(没有任何)使用OR
的显式关系。
您必须将$inner_arrays
的每个元素附加到meta_query
,否则只需设置$inner_arrays['relation'] = 'OR'
。