在wp_Query中的$ args中执行错误的关系vlaue?

时间:2016-08-26 12:38:44

标签: php mysql wordpress

我正在尝试从我的自定义插件和帖子类型获取数据表单数据库。我的查询参数应该像

$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 ”。我在哪里做错了?

1 个答案:

答案 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'