我正在尝试添加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;)
答案 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' => '<='
);
}
}
这使我能够在比较范围时覆盖所有对象。