web-dev-qa-db-fra.com

Comment interroger les publications basées sur les coordonnées lat-lng en tant que méta de publication?

Je suis en train de planifier un thème WordPress personnalisé dans lequel le type de message personnalisé (CPT) aura les coordonnées de latitude et de longitude en tant que valeur méta. La latitude et la longitude seront affichées en tant que marqueur dans une carte Google.

Jusqu'à présent, je n'ai aucun problème à afficher Google Map et le CPT en tant que marqueur. C'est-à-dire si j'interroge le CPT en utilisant l'ordre par défaut.

Le problème se produit lorsque j'ai besoin de n CPT proches de la coordonnée, qu'il s'agisse de la position actuelle de l'utilisateur ou d'un emplacement cliqué sur la carte. Une autre situation consiste à interroger tous les CPT situés dans le rayon de x km d'une coordonnée.

La question qui se pose est la suivante: comment interroger les publications en fonction de la valeur de latitude-longitude enregistrée dans la méta de publication?

Je ne sais pas trop comment faire, mais je pense que les valeurs de latitude et de longitude doivent être enregistrées dans un champ personnalisé séparé.

Merci d'avance.

5
ifdion

C'est un problème mathématique simple. Vous aurez en effet besoin d’avoir accès à la fois à votre longitude et à votre latitude, alors sauvegardez-la dans un metafield.

que vous devrez interroger vos messages comme ceci comme une requête SQL. Je n'ai pas eu l'occasion de le tester. et ou le verser dans wordpress. Ne pas avoir accès à mon env env maintenant. Mais je suppose que vous pourriez le faire vous-même :) sinon, je le ferai plus tard quand je le pourrai.

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

Pour ceux qui recherchaient cette réponse à l'avenir, j'ai pris le code supplémentaire de woony et tout fonctionnait dans la structure de table post_meta de Wordpress. Cela suppose que vous avez deux champs personnalisés distincts, un pour Latitude (city_latitude) et un pour la longitude (city_longitude). Il suffit de passer les paramètres de latitude, de longitude et de distance dans une fonction WP et vous devriez être défini.

Voici la fonction WP. Déposez ceci dans votre fichier 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;
    }
}

Renvoie la valeur dans votre fichier de modèle:

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

Consultez le plugin Geo Data Store . Il crée une table optimisée pour vos coordonnées lat/long et dispose de deux balises de gabarit à utiliser.

Plus d'infos et exemple de code dans cet article

0
Mattvic