__construct(); } /** * Only for localization * * available values: * * - clear sky * - few clouds * - scattered clouds * - broken clouds * - shower rain * - rain * - thunderstorm * - snow * - mist */ function localize(){ __('clear sky', 'event-post'); __('few clouds', 'event-post'); __('scattered clouds', 'event-post'); __('broken clouds', 'event-post'); __('shower rain', 'event-post'); __('rain', 'event-post'); __('thunderstorm', 'event-post'); __('snow', 'event-post'); __('mist', 'event-post'); } /** * * @param array reference &$ep_settings * @param boolean reference &$reg_settings */ function get_settings(&$ep_settings, &$reg_settings) { if (!isset($ep_settings['weather_enabled'])) { $ep_settings['weather_enabled'] = false; $reg_settings = true; } if (!isset($ep_settings['weather_api_key'])) { $ep_settings['weather_api_key'] = ''; $reg_settings = true; } if (!isset($ep_settings['weather_units'])) { $ep_settings['weather_units'] = 'standard'; $reg_settings = true; } } /** * * @param type $ep_settings */ function settings_form($ep_settings) { ?>

openweathermap.org'); ?>

openweathermap.org/appid#get'); ?>

settings['weather_enabled'] || !$EP->settings['weather_api_key']) { return; } $this->META_WEATHER = 'event_weather'; $this->api_key = $EP->settings['weather_api_key']; $this->units = $EP->settings['weather_units']; $this->theme = 'default'; $this->unit_names = array('standard'=>'F', 'metric'=>'C', 'imperial'=>'K'); // Alter objects add_filter('eventpost_params', array(&$this, 'params')); add_filter('eventpost_retreive', array(&$this, 'retreive')); // Alter schema add_filter('eventpost_item_scheme_entities', array(&$this, 'scheme_entities')); add_filter('eventpost_item_scheme_values', array(&$this, 'scheme_values'), 1, 2); add_filter('eventpost_default_list_shema', array(&$this, 'default_shema')); add_filter('eventpost_get_single', array(&$this, 'get_single'), 1, 2); add_action('eventpost_custom_box_date', array(&$this, 'get_weather')); } /** * * @param array $params * @return array */ function params($params = array()) { $params['weather'] = true; return $params; } /** * * @param WP_Post $event * @return WP_Post */ function retreive($event) { $event->weather = get_post_meta($event->ID, $this->META_WEATHER, true); return $event; } /** * * @param array $attr * @return array */ function scheme_entities($attr = array()) { array_push($attr, '%event_weather%'); return $attr; } /** * * @param array $values * @return array */ function scheme_values($values = array(), $post = null) { array_push($values, $this->get_weather($post)); return $values; } /** * * @param array $schema * @return array */ function default_shema($schema) { $schema['item'] = str_replace('', "%event_weather%\n", $schema['item']); return $schema; } function get_single($event_datas, $post = null) { return $event_datas . $this->get_weather($post); } /** * From here, methods intends to get datas */ function get_weather_icons($weather){ $string = ''; foreach((array) $weather as $item){ $text = ucfirst(__(strtolower($item->description), 'event-post')); $string.='' . ''.sprintf('%s icon', $text).'' . ''.$text.'' . ''; } return $string; } /** * * @param object $item * @return string */ function get_weather_item($item){ $string = ''; $string.= '
' .''.date_i18n(get_option('date_format').' '.get_option('time_format'), $item->dt).' ' .''.round($item->main->temp).' °'.$this->unit_names[$this->units].' ' .''.$this->get_weather_icons($item->weather).'' .'
'; return $string; } /** * * @param type $post * @return string */ function get_weather($post = null, $echo=false) { global $EventPost; $event = $EventPost->retreive($post); if(false === $weather = $this->get_weather_datas($event)){ return ''; } if(false == $weather['data']){ return ''; } $string=''; switch ($weather['type']){ case 'current': $string.=$this->get_weather_item($weather['data']); break; case 'history': if(!isset($weather['data']->list) || !is_array($weather['data']->list)){ break; } foreach($weather['data']->list as $day){ if($day->dt >= $event->time_start && $day->dt <= $event->time_end){ $string.=$this->get_weather_item($day); } } break; case 'forecast': if(!is_array($weather['data']->list)){ break; } foreach($weather['data']->list as $day){ if($day->dt >= $event->time_start && $day->dt <= $event->time_end){ $string.=$this->get_weather_item($day); } } break; } if($echo){ echo $string; } return $string; } /** * * @param type $event * @return type */ function get_weather_datas($event){ if (!$event->lat || !$event->long || !is_numeric($event->time_start) || !is_numeric($event->time_end)) { return false; } $now = current_time('timestamp'); $local_weather = $event->weather; // Datas are allready stored, we probably won't get better ones. if(is_array($local_weather) && $local_weather['data'] && ($local_weather['type']=='current' || $local_weather['type']=='history')){ return $local_weather; } // Finally, we have to fetch datas... $weather = array('type'=>false, 'data'=>false); // For Current and history results, we definitly store datas if ( $event->time_start<= $now && $event->time_end>=$now) { $weather = array('type'=>'current', 'data'=>$this->get_current($event), 'fetched'=>time()); update_post_meta($event->ID, $this->META_WEATHER, $weather); } elseif ( $event->time_end<$now) {// History $weather = array('type'=>'history', 'data'=>$this->get_history($event), 'fetched'=>time()); update_post_meta($event->ID, $this->META_WEATHER, $weather); } else { // Forecast datas are only stored in cache for 24 hours $transient_name = 'eventpost_weather_' . $event->ID; $weather = get_transient($transient_name); if (false === $weather || empty($weather)) { $weather = array('type'=>'forecast', 'data'=>$this->get_forecast($event), 'fetched'=>time()); set_transient($transient_name, $weather, 1 * DAY_IN_SECONDS); } } return $weather; } /** * Generates the URL to call the API * @param type $method * @param type $params * @return type */ function get_url($method = 'weather', $params = array()) { $params['APPID']= $this->api_key; $params['units']= $this->units; return 'http://api.openweathermap.org/data/2.5/' . $method . '?' . http_build_query($params); } /** * ### current * http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&APPID=XXXX * * return: * {"coord":{"lon":139,"lat":35}, "sys":{"country":"JP","sunrise":1369769524,"sunset":1369821049}, "weather":[{"id":804,"main":"clouds","description":"overcast clouds","icon":"04n"}], "main":{"temp":289.5,"humidity":89,"pressure":1013,"temp_min":287.04,"temp_max":292.04}, "wind":{"speed":7.31,"deg":187.002}, "rain":{"3h":0}, "clouds":{"all":92}, "dt":1369824698, "id":1851632, "name":"Shuzenji", "cod":200} * * @param type $event * @return object */ function get_current($event){ if (!$event->lat || !$event->long) { return; } return json_decode(wp_remote_retrieve_body( wp_remote_get( $this-> get_url('weather', array( 'lat' => $event->lat, 'lon' => $event->long, )) ) )); } /** * ### forecast * api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&APPID=XXXX * * return: * {"city":{"id":1851632,"name":"Shuzenji", "coord":{"lon":138.933334,"lat":34.966671}, "country":"JP", "cod":"200", "message":0.0045, "cnt":38, "list":[{ "dt":1406106000, "main":{ "temp":298.77, "temp_min":298.77, "temp_max":298.774, "pressure":1005.93, "sea_level":1018.18, "grnd_level":1005.93, "humidity":87 "temp_kf":0.26}, "weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}], "clouds":{"all":88}, "wind":{"speed":5.71,"deg":229.501}, "sys":{"pod":"d"}, "dt_txt":"2014-07-23 09:00:00"} ]} * * @param type $event * @return type */ function get_forecast($event){ if (!$event->lat || !$event->long) { return; } return json_decode(wp_remote_retrieve_body( wp_remote_get( $this-> get_url('forecast', array( 'lat' => $event->lat, 'lon' => $event->long, )) ) )); } /** * ### history * http://api.openweathermap.org/data/2.5/history/city?lat={lat}&lon={lon}&type=hour&start={start}&end={end}&APPID=XXXX * * Parameters: * lat, lon coordinates of the location of your interest * type type of the call, keep this parameter in the API call as 'hour' * start start date (unix time, UTC time zone), e.g. start=1369728000 * end end date (unix time, UTC time zone), e.g. end=1369789200 * cnt amount of returned data (one per hour, can be used instead of 'end') * * * return: {"message":"","cod":"200","type":"tick","station_id":39419,"cnt":30, "list":[ {"dt":1345291920, "main":{"temp":291.55,"humidity":95,"pressure":1009.3}, "wind":{"speed":0,"gust":0.3}, "rain":{"1h":0.6,"today":2.7}, "calc":{"dewpoint":17.6} } ]} * * * @param type $event * @return type */ function get_history($event) { if (!$event->start || !$event->end || !$event->lat || !$event->long) { return; } $history = json_decode(wp_remote_retrieve_body( wp_remote_get( $this-> get_url('history/city', array( 'lat' => $event->lat, 'lon' => $event->long, 'start' => $event->time_start, 'end' => $event->time_end, 'type' => 'hour', )) ) )); return $history ? $history : (object) array('result'=>false); } }