2017-05-29 2 views
0

Ich versuche, eine Wordpress-SQL-Abfrage, die Ergebnisse für den Standort des Benutzers relevant zurückgibt.Wordpress SQL-Abfrage ermitteln Geolocation und gibt relevante Ergebnisse zurück

Ein Geolocation-Längen- und Breitengrad-Cookie wird gesetzt, wenn der Benutzer die Site zum ersten Mal besucht. Die 2-Cookies werden dann wieder in PHP-Variablen auf einer späteren Seite lesen:

$lat = $_COOKIE["lat"]; $long = $_COOKIE["long"]; 

Der folgende SQL-Code wird dann ausgeführt:

$locations = " 
SELECT P.ID, P.post_title, P.post_content, 
    MAX(IF(PM.meta_key = 'lat', PM.meta_value, NULL)) AS lat, 
    MAX(IF(PM.meta_key = 'long', PM.meta_value, NULL)) AS long, 
    MAX(IF(PM.meta_key = 'contact_email', PM.meta_value, NULL)) AS contact_email 
FROM wp_posts AS P 
LEFT JOIN wp_postmeta AS PM on PM.post_id = P.ID 
WHERE P.post_type = 'pickup_location' and P.post_status = 'publish' 
GROUP BY P.ID 
ORDER BY P.post_title ASC;"; 
$result_locations = $wpdb->get_results($locations); 

Alles funktioniert wie es sollte, so weit ... die Cookies werden gesetzt und gelesen. Die Abfrage gibt genau das zurück, was sie sein sollte. Ich möchte jedoch Folgendes zu meiner Abfrage hinzufügen, um die Ergebnisse der Abfrage weiter einzugrenzen.

AND WHERE acos(sin('.$lat.') * sin('lat') + cos('.$lat.') * cos('lat') * cos('long' - ('.$long.'))) * 6371 <= 200; 

Antwort

0

Haben das Problem gelöst. Hier ist es für jeden anderen, der mit Geolocation und SQL und WordPress und mehreren Meta_Knöpfen kämpft.

$lat = $_COOKIE["lat"]; 
$long = $_COOKIE["long"]; 
$dist = 200; // This is the maximum distance (in km) away from $lat, $long in which to search 
$query = "SELECT 
    rl.ID, 
    rl.post_title, 
    ROUND(6367*2*ASIN(SQRT(POWER(SIN(($lat-lat)*pi()/180/2),2)+ 
    COS($lat*pi()/180)*COS(lat*pi()/180)* 
    POWER(SIN(($long-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') 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='long') lng ON lng.post_id = rl.ID 
WHERE 
    rl.post_type='pickup_location' AND rl.post_status='publish' 
    HAVING distance <$dist 
ORDER BY 
    distance ASC LIMIT 2; "; 

$result_locations = $wpdb->get_results($query); 
Verwandte Themen