Skip to content

Instantly share code, notes, and snippets.

@reigelgallarde
Created April 12, 2016 07:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reigelgallarde/fa9b1c7bdea618ecbc8aff31e7a2ca8a to your computer and use it in GitHub Desktop.
Save reigelgallarde/fa9b1c7bdea618ecbc8aff31e7a2ca8a to your computer and use it in GitHub Desktop.
<?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