-
-
Save reigelgallarde/fa9b1c7bdea618ecbc8aff31e7a2ca8a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
function reigel_rest_query_vars( $vars ) { | |
$vars[] = 'order_location'; | |
return $vars; | |
} | |
add_filter( 'rest_query_vars', 'reigel_rest_query_vars' ); | |
function reigel_rest_post_query( $args, $request ) { | |
$parameters = $request->get_query_params(); | |
if (isset($parameters['order_location'])) { | |
$args['order_location'] = $parameters['order_location']; | |
} | |
return $args; | |
} | |
add_filter('rest_post_query', 'reigel_rest_post_query', 10, 2 ); | |
add_filter( 'posts_fields', 'my_geo_fields', 10, 2 ); | |
add_filter( 'posts_join', 'my_geo_join', 10, 2 ); | |
add_filter( 'posts_orderby', 'my_geo_orderby', 10, 2 ); | |
// filter functions for our query | |
function my_geo_fields( $fields, $query ) { | |
if (isset($query->query_vars['order_location'])) { | |
$coords = explode(',', $query->query_vars['order_location']); | |
$lat = $coords[0]; | |
$lon = $coords[1]; | |
$fields .= ", pm1.meta_value as lat, pm2.meta_value as lon, ACOS(SIN(RADIANS($lat))*SIN(RADIANS(pm1.meta_value))+COS(RADIANS($lat))*COS(RADIANS(pm1.meta_value))*COS(RADIANS(pm2.meta_value)-RADIANS($lon))) * 3959 AS distance"; | |
} | |
return $fields; | |
} | |
function my_geo_join( $join, $query ) { | |
if (isset($query->query_vars['order_location'])) { | |
global $wpdb; | |
$join .= " INNER JOIN $wpdb->postmeta pm1 ON $wpdb->posts.id = pm1.post_id AND pm1.meta_key = 'lat' | |
INNER JOIN $wpdb->postmeta pm2 ON $wpdb->posts.id = pm2.post_id AND pm2.meta_key = 'lon' "; | |
} | |
return $join; | |
} | |
function my_geo_orderby( $orderby, $query ) { | |
if (isset($query->query_vars['order_location'])) { | |
$orderby = 'distance ASC'; | |
} | |
return $orderby; | |
} | |
function reigel_rest_prepare_post( $response, $post, $request ) { | |
$parameters = $request->get_query_params(); | |
if (isset($parameters['order_location'])) { | |
$response->data['geolocation'] = array( | |
'latitude' => isset($post->lat)?$post->lat:'', | |
'longitude' => isset($post->lon)?$post->lon:'', | |
'distance' => isset($post->distance)?$post->distance:'' | |
); | |
} | |
return $response; | |
} | |
add_filter( 'rest_prepare_post', 'reigel_rest_prepare_post', 10, 3 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment