Можно ли обернуть поиск геоданных вокруг WP_Query?

Я просто хочу добавить, что у меня есть действующее рабочее решение на месте и хорошо работает, но я ищу идеи, чтобы сделать это лучше или чище, если это возможно.

У нас есть сотни свойств в настраиваемом типе сообщений с метакали / метавалютом, в котором хранятся координаты долготы и широты свойств.

Мы разрешаем посетителю вводить местоположение и радиус для поиска тех свойств в этой области. Вид вроде локатора магазина. Вот как я это делаю сейчас:

// 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); 

Это возвращает массив всех почтовых идентификаторов, которые находятся в пределах параметров поиска пользователей. Затем я прошёл этот массив до WP_Query, чтобы показывать только сообщения, которые имеют указанные выше идентификаторы, используя post__in . Также после этого я могу выполнить другие критерии поиска в WP_Query.

В вышеприведенном запросе я делаю квадратную проверку радиуса, и я знаю, что это можно легко сделать в WP_Query с помощью meta_query . Но там, где я застреваю, выполняется проверка радиуса круга. Есть ли способ обернуть это в WP_Query?

В основном, то, что мне нужно, пытается сделать это все в одном, а не делать два запроса.

Solutions Collecting From Web of "Можно ли обернуть поиск геоданных вокруг WP_Query?"

Я бы дублировал координаты сообщений в отдельной таблице (post_id, lat, lon) с индексом (lat, lon) . Со всеми объединениями и исключениями я сомневаюсь, что база данных может использовать эффективный индекс с вашим запросом.

Я однажды написал ответ на аналогичный вопрос, используя этот подход.