Mysql 具有post_where和多个关系键的嵌套元查询
我正在尝试使用添加aWP_查询 将过滤器和WP\u META\u查询发布到wordpress主查询:Mysql 具有post_where和多个关系键的嵌套元查询,mysql,custom-post-type,wordpress,Mysql,Custom Post Type,Wordpress,我正在尝试使用添加aWP_查询 将过滤器和WP\u META\u查询发布到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' =
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;
}
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
为了维护WP和模板逻辑,我需要这个来处理主WP_查询。
我有一个帖子应该和request一起工作,但它就是不能。
如果这不明显的话,我就是一个SQL Noob 好的。在与我自己以及一张纸和一支笔进行了激烈的头脑风暴之后,我明白我可以用完全不同的条件来重新表述我的问题。 我正在尝试编写一个查询,该查询将返回具有满足某个范围的值范围的所有对象。我决定以不同的方式处理最大值和最小值,因此我提出了可以在标准WP_查询中使用的元查询: 这使我能够在比较范围时覆盖所有对象
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
/* 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' => '<='
);
}
}