我想补充一点,我现在有一个可行的解决方案,效果很好,但我正在寻找能够做得更好或更干净的想法,如果可能的话。
我们在一个自定义的post类型中有数百个属性,其中metakey/metavalue包含属性经度和纬度坐标。
我们允许访问者键入一个位置和半径,以搜索该区域中的那些属性。有点像商店定位器。以下是我目前的做法:
// Work out square radius
if(!empty($_SESSION[\'s_property_radius\'])) {$dist = $_SESSION[\'s_property_radius\'];}else{$dist = 50;}
$orig_lat = $_SESSION[\'s_property_address_lat\'];
$orig_lon = $_SESSION[\'s_property_address_lng\'];
$lon1 = $orig_lon - $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );
$lon2 = $orig_lon + $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );
$lat1 = $orig_lat - ( $dist / 69 );
$lat2 = $orig_lat + ( $dist / 69 );
// Compile a map search query to get all property ID\'s.
$mapsearchquery = "
SELECT `t`.`ID`
, 3956 * 2 * ASIN( SQRT( POWER( SIN( ( ".$orig_lat." - CAST(`t`.`property_address_lat` AS DECIMAL(9,6)) ) * pi() / 180 / 2), 2 ) + COS( ".$orig_lat." * pi() / 180) * COS( CAST(`t`.`property_address_lat` AS DECIMAL(9,6)) * pi() / 180 ) * POWER( SIN( ( ".$orig_lon." - CAST(`t`.`property_address_lng` AS DECIMAL(9,6)) ) * pi() / 180 / 2 ), 2 ) ) ) AS `distance`
FROM (
SELECT `$wpdb->posts`.`ID`
, MAX(CASE WHEN `$wpdb->postmeta`.`meta_key` = \'chb_homes_for_sale_address_longitude\' THEN `$wpdb->postmeta`.`meta_value` END ) AS `property_address_lng`
, MAX(CASE WHEN `$wpdb->postmeta`.`meta_key` = \'chb_homes_for_sale_address_latitude\' THEN `$wpdb->postmeta`.`meta_value` END ) AS `property_address_lat`
FROM `$wpdb->posts`
LEFT JOIN `$wpdb->postmeta` ON ( `$wpdb->posts`.`ID` = `$wpdb->postmeta`.`post_id` )
WHERE `$wpdb->posts`.`post_status` = \'publish\'
AND `$wpdb->posts`.`post_type` = \'homes-for-sale\'
GROUP BY `$wpdb->posts`.`ID`
HAVING CAST(`property_address_lng` AS DECIMAL(9,6)) BETWEEN \'".$lon1."\' AND \'".$lon2."\' AND CAST(`property_address_lat` AS DECIMAL(9,6)) BETWEEN \'".$lat1."\' AND \'".$lat2."\'
) AS `t`
HAVING `distance` < ".$dist."
";
// Just get the ID\'s
$mapsearchresults = $wpdb->get_col($mapsearchquery);
这将返回用户搜索参数中所有帖子id的数组。然后我通过该数组进行WP\\u查询,只显示具有上述ID的帖子使用
post__in
. 之后,我还可以对WP\\u查询执行其他搜索条件。
在上面的查询中,我做了一个方形半径检查,我知道这可以在WP\\u查询中使用meta_query
. 但我被卡住的地方是运行圆半径检查。有没有一种方法可以将其包装到WP\\U查询中?
基本上,我要做的是尝试一次完成这一切,而不是做两次大量的查询。