Ho un progetto in cui ho bisogno di costruire un localizzatore di negozi per un cliente.
Sto usando un tipo di post personalizzato " restaurant-location
" e ho scritto il codice per geocodificare gli indirizzi memorizzati in postmeta utilizzando l' API di geocodifica di Google (ecco il link che geocodifica la Casa Bianca degli Stati Uniti in JSON e ho memorizzato la latitudine e la longitudine indietro ai campi personalizzati.
Ho scritto una get_posts_by_geo_distance()
funzione che restituisce un elenco di post in ordine di quelli più vicini geograficamente utilizzando la formula che ho trovato nella presentazione di questo post . Potresti chiamare la mia funzione in questo modo (sto iniziando con un "sorgente" fisso lat / long):
include "wp-load.php";
$source_lat = 30.3935337;
$source_long = -86.4957833;
$results = get_posts_by_geo_distance(
'restaurant-location',
'geo_latitude',
'geo_longitude',
$source_lat,
$source_long);
echo '<ul>';
foreach($results as $post) {
$edit_url = get_edit_url($post->ID);
echo "<li>{$post->distance}: <a href=\"{$edit_url}\" target=\"_blank\">{$post->location}</a></li>";
}
echo '</ul>';
return;
Ecco la funzione get_posts_by_geo_distance()
stessa:
function get_posts_by_geo_distance($post_type,$lat_key,$lng_key,$source_lat,$source_lng) {
global $wpdb;
$sql =<<<SQL
SELECT
rl.ID,
rl.post_title AS location,
ROUND(3956*2*ASIN(SQRT(POWER(SIN(({$source_lat}-abs(lat.lat))*pi()/180/2),2)+
COS({$source_lat}*pi()/180)*COS(abs(lat.lat)*pi()/180)*
POWER(SIN(({$source_lng}-lng.lng)*pi()/180/2),2))),3) AS distance
FROM
wp_posts rl
INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lat FROM wp_postmeta lat WHERE lat.meta_key='{$lat_key}') lat ON lat.post_id = rl.ID
INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lng FROM wp_postmeta lng WHERE lng.meta_key='{$lng_key}') lng ON lng.post_id = rl.ID
WHERE
rl.post_type='{$post_type}' AND rl.post_name<>'auto-draft'
ORDER BY
distance
SQL;
$sql = $wpdb->prepare($sql,$source_lat,$source_lat,$source_lng);
return $wpdb->get_results($sql);
}
La mia preoccupazione è che l'SQL non sia ottimizzato. MySQL non può ordinare in base a nessun indice disponibile poiché il geo di origine è modificabile e non esiste un set finito di geo di origine da memorizzare nella cache. Attualmente sono sconcertato sui modi per ottimizzarlo.
Prendendo in considerazione ciò che ho già fatto, la domanda è: come faresti a ottimizzare questo caso d'uso?
Non è importante che tenga tutto ciò che ho fatto se una soluzione migliore mi permettesse di buttarlo fuori. Sono aperto a prendere in considerazione quasi tutte le soluzioni tranne quella che richiede di fare qualcosa come l'installazione di un server Sphinx o qualsiasi cosa che richieda una configurazione MySQL personalizzata. Fondamentalmente la soluzione deve essere in grado di funzionare su qualsiasi installazione semplice di WordPress vaniglia. (Detto questo, sarebbe bello se qualcuno volesse elencare soluzioni alternative per gli altri che potrebbero essere in grado di diventare più avanzati e per i posteri.)
Risorse trovate
Cordiali saluti, ho fatto un po 'di ricerca su questo, quindi piuttosto che ripetere la ricerca o piuttosto che pubblicare uno di questi link come risposta, andrò avanti e li includerò.
- http://jebaird.com/blog/calculating-distance-miles-latitude-and-longitude
- http://wordpress.org/extend/plugins/geolocation/screenshots/
- http://code.google.com/apis/maps/articles/phpsqlsearch.html
- http://www.rooftopsolutions.nl/blog/229
- http://planet.mysql.com/entry/?id=18085
- http://blog.peoplesdns.com/archives/24
- http://www.petefreitag.com/item/622.cfm
- http://www.phpro.org/tutorials/Geo-Targetting-With-PHP-And-MySQL.html
- http://forum.geonames.org/gforum/posts/list/692.page
- http://forums.mysql.com/list.php?23
- http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
- http://developer.yahoo.com/maps/rest/V1/geocode.html
- http://geocoder.us/
Per quanto riguarda la ricerca Sfinge
- http://sphinxsearch.com/
- https://launchpad.net/wp-sphinx-plugin
- http://forums.site5.com/showthread.php?t=28981
- http://wordpress.org/extend/plugins/wordpress-sphinx-plugin/
- http://wordpress.org/extend/plugins/sphinx-search/
- http://www.mysqlperformanceblog.com/2008/02/15/mysql-performance-blog-now-uses-sphinx-for-site-search/