Ist es möglich, die Geolocation-Suche um WP_Query zu wickeln?

Ich möchte nur hinzufügen, dass ich eine aktuelle Arbeitslösung an Ort und Stelle habe und gut funktioniert, aber ich suche nach Ideen, es besser oder sauberer zu machen, wenn es möglich ist.

Wir haben Hunderte von Eigenschaften in einem benutzerdefinierten Post-Typ mit metakey / metavalue, der die Längen- und Breitenkoordinaten der Eigenschaften enthält.

Wir erlauben einem Besucher, einen Ort und einen Radius einzugeben, um nach den Eigenschaften in diesem Bereich zu suchen. So ähnlich wie ein Filialfinder. Hier ist, wie ich es gerade mache:

// 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` get_col($mapsearchquery); 

Dies gibt ein Array aller Post-IDs zurück, die sich innerhalb der Suchparameter des Benutzers befinden. Ich übergebe dann dieses Array zu WP_Query, um nur Posts anzuzeigen, die die obigen IDs haben, die post__in . Auch kann ich später andere Suchkriterien auf der WP_Query machen.

In der obigen Abfrage tue ich einen Quadratradiuscheck und ich weiß, dass dies leicht in WP_Query mit meta_query geschehen meta_query . Aber wo ich stecken bleibe, läuft der Kreisradius-Check. Gibt es eine Möglichkeit, dies in WP_Query zu verpacken?

Im Grunde versuche ich, alles in einem zu tun, statt zwei Fragen zu stellen.

Solutions Collecting From Web of "Ist es möglich, die Geolocation-Suche um WP_Query zu wickeln?"

Ich würde die Koordinaten der Beiträge in einer separaten Tabelle (post_id, lat, lon) mit einem Index auf (lat, lon) duplizieren. Bei allen Joins und den Umwandlungen bezweifle ich, dass die database einen effizienten Index für Ihre Abfrage verwenden kann.

Ich habe einmal eine Antwort auf eine ähnliche Frage mit diesem Ansatz geschrieben.