Met de Pronamic Google Maps plugin kan een gebruiker gemakkelijk locatiegegevens toevoegen aan een pagina, bericht of custom post type. Via een eenvoudige interface is het mogelijk om een marker op de kaart te verslepen. Daarnaast kan de plugin adressen omzetten naar GEO coördinaten. Deze coördinaten kunnen voor verschillende doeleinden gebruikt worden. Zo is het met een extra plugin bijvoorbeeld mogelijk om de dichtstbijzijnde locaties te tonen.
Deze uitbreiding is mogelijk met de Geo Query plugin. De plugin breidt het WP_Query
object uit met extra GEO parameter. Na activatie van de plugin kan de geo_query
parameter voor alle WP_Query
queries gebruikt worden. Voor het berekenen van de dichtstbijzijnde locaties wordt de Haversine SQL implementatie van Ollie Jones gebruikt.
GEO query parameters
Met een eenvoudige WP_Query kunnen we de dichtstbijzijnde locaties tonen. Hiervoor halen we eerst de GEO coördinaten van de huidige post op en voegen die vervolgens toe aan de geo_query parameters. De radius
parameter wordt gebruikt voor het filteren op afstand. Met de order
kan bepaald worden of eerst de dichtstbijzijnde locaties getoond moeten worden of juist andersom.
$lat = get_post_meta( get_the_ID(), '_pronamic_google_maps_latitude', true ); $lng = get_post_meta( get_the_ID(), '_pronamic_google_maps_longitude', true ); $query = new WP_Query( array( 'post_type' => 'your_post_type', 'posts_per_page' => 5, 'no_found_rows' => true, 'post__not_in' => array( get_the_ID() ), 'geo_query' => array( 'lat' => $latitude, 'lng' => $longitude, 'lat_meta_key' => '_pronamic_google_maps_latitude', 'lng_meta_key' => '_pronamic_google_maps_longitude', 'radius' => 20, 'order' => 'ASC', ), ) );
Bovenstaande query bevat de dichtstbijzijnde locaties voor de huidige post. De $post
variabele bevat nu een extra veld met de afstand tot de huidige post.
if ( $query->have_posts() ) : ?> <ul> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li> <?php printf( esc_html__( 'Distance from %1$s: %2$s km', 'your_locale' ), esc_html( get_the_title() ), esc_html( round( $post->distance_value ) ) ); ?> </li> <?php endwhile; ?> </ul> <?php wp_reset_postdata(); endif;