是否可以将地理位置搜索包含在WP_QUERY中?

时间:2011-05-05 作者:Scott

我想补充一点,我现在有一个可行的解决方案,效果很好,但我正在寻找能够做得更好或更干净的想法,如果可能的话。

我们在一个自定义的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查询中?

基本上,我要做的是尝试一次完成这一切,而不是做两次大量的查询。

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

我会在一个单独的表格中复制立柱的坐标(post_id, lat, lon), 启用索引(lat, lon). 对于所有的连接和强制转换,我怀疑数据库能否在查询中使用有效的索引。

我曾经写道an answer to a similar question 使用此方法。

结束

相关推荐

调用未定义的函数get_user_meta()-尝试从自定义字段访问MySQL中的数据

我正在尝试访问MySQL数据库中一些自定义文件中的数据,以便将它们添加到将打印出来的网页中。数据保存在一个名为“paypal\\u user”的列中,我需要访问一条数据并将其与用户的用户id一起打印。我在代码方面得到了一些帮助,但我遇到了以下错误:调用未定义的函数get\\u user\\u meta()我的代码如下。提前感谢您的帮助。<?php include_once(\'wp-config.php\'); include_once(\'wp-load.php\'); i