Menu

Toon de dichtstbijzijnde locaties met Pronamic Google Maps

Karel-Jan 26 oktober 2017

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;

Altijd op de hoogte blijven?