J'ai un site Web qui permet aux utilisateurs d'entrer leur code postal et de voir les restaurants à proximité. Je stocke les restaurants dans une table MySQL et chaque ligne contient le nom du restaurant, l'adresse, les heures d'ouverture, ainsi que la longitude et la latitude.

Lorsqu'un utilisateur entre son code postal, j'utilise une API Google pour convertir le code postal en longitude et latitude, puis j'utilise cette requête SQL ...

select 
    locations.*, 
    SQRT(
        69.1*69.1*(latitude - $latitude)*(latitude - $latitude) + 
        53*53*(longitude - $longitude)*(longitude - $longitude)
    ) as distance 
from locations 
having distance <= 100 
order by distance 
limit 100

Je suis en train de migrer le site vers Wordpress. J'ai créé un type de publication personnalisé appelé restaurants et j'ai utilisé des champs personnalisés avancés pour enregistrer les mêmes champs - nom, adresse, heures d'ouverture et longitude et latitude. Je stocke la longitude et la latitude dans des champs séparés.

Je peux utiliser WP_Query pour interroger tous les restaurants:

$query = new WP_Query( array( 'post_type' => 'restaurants' ) );

Mais comment puis-je modifier mon appel WP_Query pour me permettre de rechercher et de trier les restaurants par proximité de la longitude et de la latitude fournies?


0
Chris 10 juil. 2017 à 00:06

2 réponses

Meilleure réponse

VA79 a raison et ce serait assez complexe, faire les jointures SQL et tout.

J'ai trouvé une solution très simple et facile à mettre en œuvre.

1. Vous devez d'abord installer ce plugin: https://mg.wordpress.org/plugins/acf-google -maps-rayon-recherche /

2. Dans le functions.php de ce plugin (!) À la ligne 40, vous devez définir le nom de votre champ personnalisé avancé dans la variable $ address.

3. Dans le acf_gms.class.php de ce plugin à la ligne 163, vous devez redéfinir le nom de votre champ dans la variable $ address.

4. Maintenant, vous devez enregistrer les messages, qui ont les champs personnalisés avancés du formulaire Google Maps Field et qui ont donc une valeur de longitute et de latitude. Ceci est important, sinon la nouvelle table de base de données créée (grâce au plugin) n'aura pas les valeurs dedans.

5. Après l'enregistrement, vous avez une nouvelle table dans votre base de données avec Post ID, Long et Lat Value. Merci au plugin, super.

Je suppose maintenant que vous voulez avoir des champs de formulaire sur une page d'archive de publication, où vous pouvez entrer l'adresse et afficher les messages dans un ordre, dans lequel le poste le plus proche est affiché en premier, le poste le plus proche suivant ensuite et ainsi de suite. Vous voulez trouver le plus proche, donc je suppose que c'est ce que vous recherchez.

Le code suivant doit être entré dans votre fichier archive.php. Veuillez remplacer la clé API par la vôtre.

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOURAPIKEY&libraries=places"></script>
<script>
    function initialize() {
      var input = document.getElementById('location');
      var options = {
        types: ['(regions)'],
    };
      var autocomplete = new google.maps.places.Autocomplete(input, options);
        google.maps.event.addListener(autocomplete, 'place_changed', function () {
            var place = autocomplete.getPlace();
            document.getElementById('lng').value = place.geometry.location.lng();
            document.getElementById('lat').value = place.geometry.location.lat();
        });
    }
    google.maps.event.addDomListener(window, 'load', initialize);
</script>

Comme vous le voyez, nous obtenons l'emplacement, les valeurs long et lat à partir des champs de formulaire. Le formulaire ressemble donc à ceci et peut être placé dans le fichier php d'archive.

<form id="yourform">
    <div>
        <input id="location" type="text" name="location" placeholder="Postcode and place of residence" autocomplete="on" runat="server" />  
        <input type="hidden" id="lng" name="lng" />
        <input type="hidden" id="lat" name="lat" />
    </div> <!-- field -->
    <input type="submit" value="Search nearest" />
</form>

Si vous entrez un emplacement dans le champ de saisie avec l'identifiant «emplacement», google maps vous suggérera des lieux. Lorsque vous soumettez le formulaire, le script avec lequel nous avons commencé utilisera cet emplacement et obtiendra les valeurs long et lat. Avec les entrées masquées, ces valeurs seront publiées sur l'URL en tant que paramètres (? Lng = ... & lat = ...).

Avec notre plugin en cours d'exécution et la nouvelle table de base de données, vous obtiendrez les messages classés en fonction de la distance à votre emplacement entré.

C'est tout. Si vous avez des questions, n'hésitez pas à les poser.

1
rank 20 févr. 2020 à 17:54

Tout d'abord, wordpress stocke vos messages personnalisés dans la table wp_posts et les champs acf sont stockés dans la table wp_post_meta, vous devrez donc les joindre avec sql d'une manière ou d'une autre. Si je comprends bien, vous pouvez utiliser la classe wpdb qui vous permet de faire vos propres requêtes SQL. https://codex.wordpress.org/Class_Reference/wpdb

1
VA79 9 juil. 2017 à 22:02