web-dev-qa-db-ja.com

メタ投稿として緯度経度座標に基づいて投稿をクエリする方法?

私は、カスタム投稿タイプ(CPT)がメタ値として緯度と経度の座標を持つようにするカスタムWordPressテーマを計画しています。緯度と経度は、Googleマップのマーカーとして表示されます。

これまでのところ、Google MapとCPTをMarkerとして表示しても問題ありません。デフォルトの順序でCPTをクエリした場合です。

この問題は、現在のユーザーの位置でも地図上でクリックされた場所でも、座標に最も近いCPTがn個必要な場合に発生します。もう1つの状況は、座標の半径x kmにあるすべてのCPTを照会することです。

質問は次のとおりです。投稿メタに保存されている緯度経度の値に基づいて投稿をクエリするにはどうすればよいですか。

その方法がよくわかりませんが、緯度と経度の値は別のカスタムフィールドに保存する必要があると思います。

前もって感謝します。

5
ifdion

これは単純な数学的問題です。あなたは確かにあなたの経度と緯度の両方にアクセスする必要があるので、メタフィールドに保存してください。

あなたがSQLクエリとしてこのようにあなたの投稿をクエリする必要がありますよりも。テストする機会がありません。またはワードプレスにそれを注ぐ。今私のテスト環境にアクセスできない。しかし、私はあなたがあなた自身でそれをすることができると思います:)もしそうでないなら、私は後で私がそうするときそれをするでしょう。

set @latitude = xxx; — center latitude
set @longitude = xxx; — center longitude
set @distance = xx; — search distance

select p.ID, p.post_name, ((ACOS(SIN(@latitude * PI() / 180) * SIN(`latitude.meta_value` * PI() / 180) + COS(@latitude * PI() / 180) * COS(`latitude.meta_value` * PI() / 180) * COS((@longitude – `longitude.meta_value`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance
from wp_posts p
left join wp_postmeta latitude on latitude.post_id = p.ID and latitude.meta_key = ‘_latitude’
left join wp_postmeta longitude on longitude.post_id = p.ID and longitude.meta_key = ‘_longitude’
having distance < @distance;
5
woony

将来的にこの答えを探している人のために、私はwoonyのコードをもう1マイル得て、Wordpressのpost_metaテーブル構造の中ですべてをうまく動かしました。これは、緯度(city_latitude)と経度(city_longitude)の2つのカスタムフィールドがあると仮定しています。緯度、経度、距離のパラメータをWP関数に渡すだけで、設定する必要があります。

これがWP関数です。これをあなたのfunctions.phpファイルに入れてください:

function get_nearby_cities($lat, $long, $distance){
    global $wpdb;
    $nearbyCities = $wpdb->get_results( 
    "SELECT DISTINCT    
        city_latitude.post_id,
        city_latitude.meta_key,
        city_latitude.meta_value as cityLat,
        city_longitude.meta_value as cityLong,
        ((ACOS(SIN($lat * PI() / 180) * SIN(city_latitude.meta_value * PI() / 180) + COS($lat * PI() / 180) * COS(city_latitude.meta_value * PI() / 180) * COS(($long - city_longitude.meta_value) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance,
        wp_posts.post_title
    FROM 
        wp_postmeta AS city_latitude
        LEFT JOIN wp_postmeta as city_longitude ON city_latitude.post_id = city_longitude.post_id
        INNER JOIN wp_posts ON wp_posts.ID = city_latitude.post_id
    WHERE city_latitude.meta_key = 'city_latitude' AND city_longitude.meta_key = 'city_longitude'
    HAVING distance < $distance
    ORDER BY distance ASC;"
    );

    if($nearbyCities){
        return $nearbyCities;
    }
}

テンプレートファイルの値を返します。

$nearbyCities = get_nearby_cities(get_post_meta($post->ID, 'city_latitude', true), get_post_meta($post->ID, 'city_longitude', true), 25);
8
mread1208

Geo Data Storeプラグイン を見てください。緯度/経度座標用に最適化されたテーブルを作成し、使用する2つのテンプレートタグがあります。

この記事に より多くの情報とコード例

0
Mattvic