座標によるポストクエリの取得に苦労しています。ほぼすべての投稿タイプにメタフィールドmap_lat
およびmap_lng
があります。 1つのカスタム投稿タイプ(この例では「ビーチ」)から投稿を返そうとしています。
function get_nearby_locations($lat, $long, $distance){
global $wpdb;
$nearbyLocations = $wpdb->get_results(
"SELECT DISTINCT
map_lat.post_id,
map_lat.meta_key,
map_lat.meta_value as locLat,
map_lng.meta_value as locLong,
((ACOS(SIN($lat * PI() / 180) * SIN(map_lat.meta_value * PI() / 180) + COS($lat * PI() / 180) * COS(map_lat.meta_value * PI() / 180) * COS(($long - map_lng.meta_value) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance,
wp_posts.post_title
FROM
wp_postmeta AS map_lat
LEFT JOIN wp_postmeta as map_lng ON map_lat.post_id = map_lng.post_id
INNER JOIN wp_posts ON wp_posts.ID = map_lat.post_id
WHERE map_lat.meta_key = 'map_lat' AND map_lng.meta_key = 'map_lng'
AND post_type='beaches'
HAVING distance < $distance
ORDER BY distance ASC;"
);
if($nearbyLocations){
return $nearbyLocations;
}
}
そしてそれを次のように呼び出します。
$nearbyLocation = get_nearby_cities(get_post_meta($post->ID, 'map_lat', true), get_post_meta($post->ID, 'map_lng', true), 25);
しかし、それは私が欲しいものを返しません。
閉じる。別のINNER JOIN
が必要で、$wpdb->prepare
を使ってすべての変数をエスケープする必要があります。
半径を計算するためのより効率的なHaversine公式( source )も含めました。
キロメートルを使用する場合は、$earth_radius
を6371に変更してください。
また、デバッグするのに最適な方法は、SQLをエコーしてphpMyAdmin(または使用している任意のdbアプリ)に貼り付けて、そこで調整することです。
function get_nearby_locations( $lat, $lng, $distance ) {
global $wpdb;
// Radius of the earth 3959 miles or 6371 kilometers.
$earth_radius = 3959;
$sql = $wpdb->prepare( "
SELECT DISTINCT
p.ID,
p.post_title,
map_lat.meta_value as locLat,
map_lng.meta_value as locLong,
( %d * acos(
cos( radians( %s ) )
* cos( radians( map_lat.meta_value ) )
* cos( radians( map_lng.meta_value ) - radians( %s ) )
+ sin( radians( %s ) )
* sin( radians( map_lat.meta_value ) )
) )
AS distance
FROM $wpdb->posts p
INNER JOIN $wpdb->postmeta map_lat ON p.ID = map_lat.post_id
INNER JOIN $wpdb->postmeta map_lng ON p.ID = map_lng.post_id
WHERE 1 = 1
AND p.post_type = 'beaches'
AND p.post_status = 'publish'
AND map_lat.meta_key = 'map_lat'
AND map_lng.meta_key = 'map_lng'
HAVING distance < %s
ORDER BY distance ASC",
$earth_radius,
$lat,
$lng,
$lat,
$distance
);
// Uncomment and paste into phpMyAdmin to debug.
// echo $sql;
$nearbyLocations = $wpdb->get_results( $sql );
if ( $nearbyLocations ) {
return $nearbyLocations;
}
}