WP_Query中拆分逗号分隔经纬度meta字段实现距离查询的问题
你之前的写法存在基础语法错误:将变量定义、字符串拆分的PHP逻辑直接写在了WP_Query的参数数组内部,破坏了数组结构,自然无法正常获取数据。
推荐方案:拆分存储为两个独立自定义字段(性能最优)
这是最兼容原生geo_query、查询效率最高的方案,操作分为两步:
- 先批量将现有所有商品的经纬度字段拆分存储
你可以将下方代码临时放入主题functions.php文件,登录后台访问任意页面执行一次,拆分完成后删除代码即可:
// 批量拆分已有的经纬度自定义字段,执行完成后请立即删除 add_action('admin_init', 'batch_split_latlng_fields'); function batch_split_latlng_fields() { // 仅管理员可执行 if (!current_user_can('manage_options')) return; $posts = get_posts([ 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => ['publish', 'private'], 'meta_key' => 'martygeocoderlatlng' ]); foreach ($posts as $post) { $latlng = get_post_meta($post->ID, 'martygeocoderlatlng', true); if (empty($latlng)) continue; $latlng_arr = array_map('trim', explode(',', $latlng)); if (count($latlng_arr) === 2) { update_post_meta($post->ID, '_latitude', $latlng_arr[0]); update_post_meta($post->ID, '_longitude', $latlng_arr[1]); } } wp_die('经纬度字段拆分完成,请删除本段代码'); }
- 后续新增/编辑商品时,在保存
martygeocoderlatlng字段的同时,同步拆分保存_latitude、_longitude两个字段,之后就可以直接使用你原本正常运行的geo_query查询代码即可。
替代方案:不改存储结构,自定义SQL查询
如果你不想调整现有存储逻辑,保留单个逗号分隔的经纬度字段,可以直接用自定义SQL实现距离查询,无需两次查询:
global $wpdb; // 替换为你的当前页面经纬度值 $page_latitude = 'xxx'; $page_longitude = 'xxx'; $distance = 200; $units = 'miles'; // 若单位为公里可改为 'kilometers' // 地球半径,英里单位为3959,公里为6371 $earth_radius = $units === 'miles' ? 3959 : 6371; // 执行距离查询 $products = $wpdb->get_results($wpdb->prepare( "SELECT p.*, ( %d * acos( cos( radians(%f) ) * cos( radians( SUBSTRING_INDEX(m.meta_value, ',', 1) ) ) * cos( radians( SUBSTRING_INDEX(m.meta_value, ',', -1) ) - radians(%f) ) + sin( radians(%f) ) * sin( radians( SUBSTRING_INDEX(m.meta_value, ',', 1) ) ) ) ) AS distance FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} m ON p.ID = m.post_id WHERE p.post_type = 'product' AND p.post_status IN ('publish', 'private') AND m.meta_key = 'martygeocoderlatlng' HAVING distance < %d ORDER BY distance ASC LIMIT 0,5", $earth_radius, $page_latitude, $page_longitude, $page_latitude, $distance ));
这段代码直接利用MySQL的SUBSTRING_INDEX函数在查询时拆分逗号分隔的经纬度值,一次查询即可获取符合距离要求的商品。
内容的提问来源于stack exchange,提问作者user2059376
相关产品推荐
相关产品推荐

