2017-05-29 8 views
0

私は、ユーザーの所在地に関連する結果を返すwordpress SQLクエリーをまとめようとしています。Wordpress SQLクエリーでジオロケーションを特定し、関連する結果を返す

ジオロケーションの緯度と経度のクッキーは、ユーザーが最初にサイトにアクセスしたときに設定されます。 2枚のクッキーは、後のページでPHPの変数にリードバックされます。

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

は、次のSQLコードが実行されます。

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

すべてはそれが必要として働いている、これまでに...クッキーが設定され、読み込まれています。クエリは、それが必要とするものを正確に返します。しかし、クエリの結果をさらに絞り込むために、クエリに以下を追加したいと思います。

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

答えて

0

問題を解決しました。ここでは、他の誰かがジオロケーションとSQLとwordpressと複数のmeta_keysで苦労しています。

$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); 
関連する問題