使用post_where和多个关系键的嵌套元查询

时间:2014-07-18 17:50:22

标签: mysql wordpress custom-post-type wp-query

我正在尝试添加WP_Query post_where过滤并WP_META_QUERY到wordpress主查询:

function example_range_m2( $where ) {

$min_price = doubleval($_GET['min-price']);
$max_price = doubleval($_GET['max-price']);

    $query_args = array( 'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'PREFIX_min_property_price_m2',
            'value' => array($min_price, $max_price),
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        ),
        array(
            'key' => 'PREFIX_max_property_price_m2',
            'value' => array($max_price, $min_price),
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        ),
    ) );

    $query_args2 = array('meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'PREFIX_min_property_price_m2',
            'value' => $min_price,
            'compare' => '<=',
            'type' => 'NUMERIC'
        ),
        array(
            'key' => 'PREFIX_max_property_price_m2',
            'value' => $max_price,
            'compare' => '>=',
            'type' => 'NUMERIC'
        ),
    ));

$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args );
$mq_sql = $meta_query->get_sql(
    'post',
    $wpdb->posts,
    'ID',
    null
);

$tmp_one = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';

echo $tmp_one;
$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args2 );
$mq_sql = $meta_query->get_sql(
    'post',
    $wpdb->posts,
    'ID',
    null
);
$tmp_two = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';
$where .=  $tmp_one . ' OR ' . $tmp_two;

return $where;
}

第一个query_arg必须确定其中一个custom_meta_field值是否在给定范围之间。 secound query_arg必须确定数据库中的值是否包含包含给定范围的范围。

我需要使用wordpress来查询数据库:

SELECT post_meta WHERE 
(meta_value1 BETWEEN min MAX max) OR (meta_value2 BETWEEN min AND max) 
OR (meta_value1 <= min AND meta_value2 >= max)
主wordpress查询的

var_dump给了我以下请求:

SELECT SQL_CALC_FOUND_ROWS example_posts.id
FROM   example_posts
INNER JOIN example_postmeta
ON ( example_posts.id = example_postmeta.post_id )
WHERE
   1 = 1
   AND example_posts.post_type = 'property'
   AND (
         example_posts.post_status = 'publish'
         OR
         example_posts.post_status = 'private'
       )
   AND ( example_postmeta.meta_key = 'PREFIX_min_property_price_m2' )
   AND (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '1000' AND '9000'
         )
         OR
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '9000' AND '1000'
         )
       )
   OR
   And (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) <= '1000'
         )
         AND
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND Cast(example_postmeta.meta_value AS signed) >= '9000'
         )
       )
GROUP  BY example_posts.id
ORDER  BY example_postmeta.meta_value + 0 ASC
LIMIT  0, 4 

我需要这个才能使用main WP_Query来维护WP和模板逻辑。 我有一个帖子可以处理请求,但它没有。 如果不明显,我就是SQL Noob;)

1 个答案:

答案 0 :(得分:0)

确定。在与我自己和一张纸和笔进行了强烈的头脑风暴会议后,我明白我可以用完全不同的条件重新解释我的查询/“问题”。 我正在尝试编写一个查询,该查询将返回具有满足范围的值范围的所有对象。我决定以不同的方式处理最大值和最小值,因此我想出了可以在标准WP_QUERY中使用的元查询:

 /* Logic for Min and Max Price Parameters */
    if( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') && isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
        $min_price = doubleval($_GET['min-price']);
        $max_price = doubleval($_GET['max-price']);
        if( $min_price >= 0 && $max_price > $min_price ){

            $meta_query[] = array(
                'key' => 'EXAMPLE_max_property_price_m2',
                'value' => $min_price,
                'type' => 'NUMERIC',
                'compare' => '>='
            );

            $meta_query[] = array(
                'key' => 'EXAMPLE_min_property_price_m2',
                'value' => $max_price,
                'type' => 'NUMERIC',
                'compare' => '<='
            );

        }
    }elseif( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') ){
        $min_price = doubleval($_GET['min-price']);
        if( $min_price > 0 ){
            $meta_query[] = array(
                'key' => 'EXAMPLE_max_property_price_m2',
                'value' => $min_price,
                'type' => 'NUMERIC',
                'compare' => '>='
            );
        }
    }elseif( isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
        $max_price = doubleval($_GET['max-price']);
        if( $max_price > 0 ){
            $meta_query[] = array(
                'key' => 'EXAMPLE_min_property_price_m2',
                'value' => $max_price,
                'type' => 'NUMERIC',
                'compare' => '<='
            );
        }
    }

这使我能够在比较范围时覆盖所有对象。