WordPress中foreach调用经纬度距离计算函数返回错误数据问题
问题根源
你遇到的问题核心有两个:
- 部分存储的经纬度数据使用逗号(,)作为小数分隔符,而PHP做数值运算时仅识别点(.)作为小数分隔符,会直接截断逗号后的内容,导致传入计算的经纬度值完全错误。
- 距离计算函数没有做参数类型校验,异常的字符串参数直接参与运算,最终得到错误的固定距离值。
修复方案
第一步:修改经纬度读取逻辑,统一格式
读取经纬度后先把逗号替换为点,再强制转换为浮点数,再传入计算函数。
第二步:优化距离计算函数,增加参数类型处理
给参数增加强制类型声明,避免异常值影响运算结果。
修复后代码示例
优化后的距离计算函数
function get_distance(float $lat1, float $lon1, float $lat2, float $lon2) { $theta = $lon1 - $lon2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; return ($miles * 1.609344); }
修复后的查询计算逻辑
function listing_by_coordinates($city){ $cat = []; $ucat = [ 'post_type' => 'listar', 'posts_per_page' => 10, 'tax_query' => [ [ 'taxonomy' => 'listar_category', 'field' => 'slug', 'terms' => $city, ] ] ]; $features = get_posts($ucat); // 固定基准经纬度提前转成浮点数 $base_lat = (float)str_replace(',', '.', '-25.440766549426275'); $base_lon = (float)str_replace(',', '.', '-49.27733841639869'); foreach($features as $i => $feature) { $postID = $feature->ID; // 读取经纬度后先替换逗号再转浮点数 $lat2 = (float)str_replace(',', '.', get_field('latitude', $postID)); $lon2 = (float)str_replace(',', '.', get_field('longitude', $postID)); $dist = get_distance($base_lat, $base_lon, $lat2, $lon2); $cat[$i]['name'] = $feature->post_title; $cat[$i]['latitude'] = $lat2; $cat[$i]['longitude'] = $lon2; $cat[$i]['distance'] = $dist; } return $cat; }
额外说明
如果后续要彻底避免这类问题,建议在存入经纬度的时候就统一校验格式,强制使用点作为小数分隔符,从数据源层面解决格式不一致的问题。
内容的提问来源于stack exchange,提问作者fplopez
相关产品推荐
相关产品推荐

