Tribe__Events__Pro__Geo_Loc::get_min_max_coords()
Get the minimum and maximum latitudes and longitudes for all published events.
Return
(array) ( Latitude / longitude values for geofencing. @type float $max_lat Maximum latitude constraint @type float $max_lng Maximum longitude constraint @type float $min_lat Minimum latitude constraint @type float $min_lng Minimum longitude constraint }
Source
File: src/Tribe/Geo_Loc.php
public function get_min_max_coords() {
global $wpdb;
$coords = get_transient( self::ESTIMATION_CACHE_KEY );
// We have a cached value!
if ( is_array( $coords ) ) {
return $coords;
}
/**
* Allow overriding of queries to get min/max coordinates by returning an array of coordinate values.
*
* @since 4.4.21
*
* @param null|array $latlng {
* Latitude / longitude values for geofencing
*
* @type float $max_lat Maximum latitude constraint
* @type float $max_lng Maximum longitude constraint
* @type float $min_lat Minimum latitude constraint
* @type float $min_lng Minimum longitude constraint
* }
*/
$coords = apply_filters( 'tribe_geoloc_pre_get_min_max_coords', null );
if ( null === $coords ) {
$venues_list = $this->get_active_venues();
$published_venues = array();
if ( ! empty( $venues_list ) ) {
$published_venues = $this->filter_published_venues( $venues_list );
}
// Only run query if there are events
if ( ! empty( $published_venues ) ) {
$venues_ids_prepared = implode( ', ', $published_venues );
$latitude_key = self::LAT;
$longitude_key = self::LNG;
$sql = "
SELECT
MAX( `coords`.`lat` ) AS `max_lat`,
MAX( `coords`.`lng` ) AS `max_lng`,
MIN( `coords`.`lat` ) AS `min_lat`,
MIN( `coords`.`lng` ) AS `min_lng`
FROM (
SELECT `post_id` AS `venue_id`,
CASE
WHEN `meta_key` = '{$latitude_key}'
THEN CAST( `meta_value` AS DECIMAL( 10, 6 ) )
END AS `lat`,
CASE
WHEN `meta_key` = '{$longitude_key}'
THEN CAST( `meta_value` AS DECIMAL( 10, 6 ) )
END AS `lng`
FROM `{$wpdb->postmeta}`
WHERE
(
`meta_key` = '{$latitude_key}'
OR `meta_key` = '{$longitude_key}'
)
AND `post_id` IN ( {$venues_ids_prepared} )
) AS `coords`
";
$coords = $wpdb->get_row( $sql, ARRAY_A );
}
}
if ( ! empty( $coords ) ) {
// If there is no geoloc data then each result will be null - we cannot pass null values
// to the Google Maps API however
$coords = array_map( 'floatval', $coords );
}
set_transient( self::ESTIMATION_CACHE_KEY, $coords, DAY_IN_SECONDS );
// If no coords found, always return an empty array with null args
if ( empty( $coords ) ) {
$coords = array(
'max_lat' => null,
'max_lng' => null,
'min_lat' => null,
'min_lng' => null,
);
}
return $coords;
}