Hi,
I am pretty new to extending wordpress queries, but I do have some knowledge of the ins and outs and feel that I can follow along.
I am building an angular application that uses wordpress as the backend.
In wordpress I am using the WP REST API (http://wp-api.org/) v2 and the Advance custom fields plugin (ACF).
I would like to be able to call the rest API and order the posts by distance from the user, using the ACF location as well as the users location.
I would imaging the call to look something like this:
http://domain.com/wp-json/wp/v2/posts/?meta_key=order_location&meta_value=45.7269585,13.7562836
I found a similar question that also uses the law of cosin to work out the distance
<blockquote>
cos(d/R)=cos(lat1)cos(lat2)cos(long2-long1)+sin(lat1)sin(lat2)
http://wpquestions.com/question/showChrono/id/7926
</blockquote>
I am just not confident on how to apply this to the result of a WP REST query or how to use the ACF results meta field data.
Reigel Gallarde answers:
are you using custom post type? or just the post?
Klutz comments:
Hi Reigel,
This is just for normal posts.
(But in the future I might want to extend this for custom-post types, would this be quiet different?)
Klutz comments:
Hi Reigel,
This is just for normal posts.
(But in the future I might want to extend this for custom-post types, would this be quiet different?)
Reigel Gallarde comments:
The reason I asked is because "wp-json/wp/v2/posts/" is intended for post post type... we can filter it, but it will not be a good idea because this will also affect requests that are not rest api related...
so here's how I think a better way...
we will add endpoint.. [[LINK href="http://v2.wp-api.org/extending/adding/"]]sample here[[/LINK]]
and here's what I have so far... [[LINK href="https://gist.github.com/reigelgallarde/8c8890994dcb99874a1bc4f83b7224f7"]]https://gist.github.com/reigelgallarde/8c8890994dcb99874a1bc4f83b7224f7[[/LINK]]
on function wp_json_namespace_v2__posts, we use our own WP_Query... this way, we can change post_type in the future...
another thing to note in on the function my_geo_join... you need to change the meta_key according to what you have... mine has 'lat' and 'lon' meta keys.. you may need to change this to your ACF field lat/long...
you can then browse it with the url like this, http://domain.com/namespace/v2/posts/?order_location=lat,lon
where lat and lon are valid coordinates...
you could also change "namespace/v2/posts/" to something you like... just look at function wp_json_namespace_v2__rest_api_init...
Reigel Gallarde comments:
typo
http://domain.com/namespace/v2/posts/?order_location=lat,lon
to
http://domain.com/wp-json/namespace/v2/posts/?order_location=lat,lon
example call
http://domain.com/wp-json/namespace/v2/posts?order_location=10.2661820,123.9972950
Reigel Gallarde comments:
I have new version... this version uses filter so we can use the current functionality of rest api..
the code: [[LINK href="https://gist.github.com/reigelgallarde/fa9b1c7bdea618ecbc8aff31e7a2ca8a"]]https://gist.github.com/reigelgallarde/fa9b1c7bdea618ecbc8aff31e7a2ca8a[[/LINK]]
sample link: http://domain.com/wp-json/wp/v2/posts?order_location=10.2661820,123.9972950
you still have to change meta keys in function my_geo_join..
if nothing goes wrong, this would add a field to the result that looks like this:
geolocation: {
latitude: "10.3402620",
longitude: "123.9415520",
distance: "6.368880746600806"
},
Reigel Gallarde comments:
have you got the chance to try my solutions?
Klutz comments:
Hi Reigel,
Wow thanks so much!
I havent had a chance to have a look at the solution just yet, but it makes sense.
I will try this first thing in the morning and let you know.
Thanks again for the help.
Reigel Gallarde comments:
Okay... just let me know if you need anything...
Reigel Gallarde comments:
any progress on this?
Rempty answers:
Hello Klutz, do you have the distance as a meta_key or want calculate the distance and order with this new value?
Klutz comments:
Hi Rempy,
Much like the example, I have the users lat/long and the posts lat/long (through ACF field).
And using the Haversine function (cos(d/R)=cos(lat1)cos(lat2)cos(long2-long1)+sin(lat1)sin(lat2)), I want to order the posts by distance ASC.
The difference from the example is that I am trying to use this through WP REST API (http://v2.wp-api.org/).
I hope that makes sense?