Show weather based on users location Show weather based on users location wordpress wordpress

Show weather based on users location


You'll need an API for mapping visitors IP address to location ( ipapi.co ) and another one to get weather forecast for the location ( openweathermap.org ). The code below is for php (server side) :

# Part 1 (get latitude & longitude)$ip = '1.2.3.4';$api_1 = 'https://ipapi.co/' . $ip . '/latlong/';$location = file_get_contents($api_1);$point = explode(",", $location);# Part 2 (get weather forecast)$api_2 = 'http://api.openweathermap.org/data/2.5/weather?lat=' . $point[0] . '&lon=' . $point[1] . '&appid=API_KEY';$weather = file_get_contents($api_2);


This will get a user's zip code from their IP address using the open-source IP2Coordinates service from the Data Science Toolkit.

There are more accurate Geo-location APIs out there, but this one is absolutely free and dead simple to use. If I were developing this on a production site, I'd use HTML5 Geolocation as my primary method with a fallback to a better IP geolocator, like Max Mind.

Note that this will only work for US users of your site. You should probably pass more detailed data to one of the other Yahoo place APIs to get one of their WOEIDs to use (or pick a different weather API).

Here is the code for you. Put this right after the <?php tag in your sample code. Once you're sure it's working, comment out all the lines that begin with print.

//Get the user's IP address$user_ip = $_SERVER['REMOTE_ADDR'];//The Data Science Toolkit URL$url = 'http://www.datasciencetoolkit.org/ip2coordinates/';//Find the user's location from their IP. //*** You need the get_data function from the sample code$raw_geocode = json_decode( get_data( $url . $user_ip) );//Check if the user is in the USif ('US' === $raw_geocode->$user_ip->country_code) {  //If yes, store their zip code in a variable, and print it  $zip_code = $raw_geocode->$user_ip->postal_code;  printf('<p>Your zip code is: %s</p>', $raw_geocode->$user_ip->postal_code);} else {  //If the user isn't in the US, set a sip code that will work.  $zip_code = '97211';  //and print an error  printf('<p>Sorry, this app does not work in %s.</p>', $raw_geocode->$user_ip->country_name);}//Print the raw data for debugging.printf('<pre>%s</pre>', print_r($raw_geocode, true));

Now change the line in the sample code that begins with $data = to this:

$data = get_data("http://weather.yahooapis.com/forecastrss?p={$zip_code}&u=f");


Using ipinfo.io and OpenWeatherMap

Javascript:

<script type="text/javascript" src="jquery.simpleopenweather.js"></script><script type="text/javascript">    $(document).ready(function() {        $.get("http://ipinfo.io", function (response) {            $("#weather").attr('data-simpleopenweather-city', response.city).simpleopenweather({template: '<h2>'+'{{temperature}} '+'°'+'C'+'<h2>', units: 'metric'});        }, "jsonp");    });</script>

HTML:

<div id="weather" class="simpleopenweather" data-simpleopenweather-city=""></div>

It will show something like 6.3 ºC