Tribe__Events__Pro__Geo_Loc::setup_geoloc_in_query( WP_Query $query )
Filter the main query and: 1) If the user made a Location search, get the events close to that location (inside the geo fence) 2) If the user is in the map view and didn’t make a location search, only get events in venues with geo data, so we can map them.
Contents
Parameters
- $query
-
(WP_Query) (Required)
Return
(void)
Source
File: src/Tribe/Geo_Loc.php
public function setup_geoloc_in_query( $query ) {
// The basic gMaps API doesn't let us get lat/long from Google, so we can't be sure there's any valid
// GeoLoc data for venues. So don't limit the query by that possibly-nonexistent data.
if ( tribe_is_using_basic_gmaps_api() ) {
return;
}
if (
empty( $query->query_vars['tribe_geoloc'] )
&& (
( ! $query->is_main_query() && ! defined( 'DOING_AJAX' ) )
|| ! $query->get( 'post_type' ) == Tribe__Events__Main::POSTTYPE
)
) {
return;
}
$lat = null;
$lng = null;
if ( ! empty( $query->query_vars['tribe_geoloc_lat'] ) ) {
$lat = (float) $query->query_vars['tribe_geoloc_lat'];
} elseif ( ! empty( $_REQUEST['tribe-bar-geoloc-lat'] ) ) {
$lat = filter_var( $_REQUEST['tribe-bar-geoloc-lat'], FILTER_VALIDATE_FLOAT );
}
if ( ! empty( $query->query_vars['tribe_geoloc_lng'] ) ) {
$lng = (float) $query->query_vars['tribe_geoloc_lng'];
} elseif ( ! empty( $_REQUEST['tribe-bar-geoloc-lng'] ) ) {
$lng = filter_var( $_REQUEST['tribe-bar-geoloc-lng'], FILTER_VALIDATE_FLOAT );
}
if ( empty( $lat ) && empty( $lng ) ) {
// If there's no latitude and longitude information provided then show all events.
return;
}
$force = false;
if ( ! empty( $lat ) && ! empty( $lng ) ) {
// Show only venues that have geolocation information.
$force = true;
// Get venues closest to the specified location
$venues = $this->get_venues_in_geofence( $lat, $lng );
} elseif (
'map' === Tribe__Events__Main::instance()->displaying
|| ( ! empty( $query->query_vars['eventDisplay'] ) && 'map' === $query->query_vars['eventDisplay'] )
|| ! empty( $query->query_vars['tribe_geoloc'] )
) {
// Show only venues that have geolocation information.
$force = true;
// Set a geofence the size of the planet
$geofence_radio = self::EARTH_RADIO * M_PI;
// Get all geoloc'ed venues
$venues = $this->get_venues_in_geofence( 1, 1, $geofence_radio );
}
if ( $force ) {
if ( empty( $venues ) ) {
// there aren't any venues in the geofence, so let's kill the meta query so we don't get any results
$venues = -1;
} elseif ( is_array( $venues ) ) {
// we have venues...let's make sure they are unique
$venues = array_unique( $venues );
}
$meta_query = array(
'key' => '_EventVenueID',
'value' => $venues,
'type' => 'NUMERIC',
'compare' => 'IN',
);
if ( empty( $query->query_vars['meta_query'] ) ) {
$query->set( 'meta_query', array( $meta_query ) );
} else {
$query->query_vars['meta_query'][] = $meta_query;
}
}
}