1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523:
<?php
$EventPostWeather = new EventPostWeather();
class EventPostWeather {
var $META_WEATHER;
var $api_key;
var $units;
var $unit_names;
var $theme;
function __construct() {
add_action('eventpost_getsettings_action', array(&$this, 'get_settings'), 1, 2);
add_action('eventpost_settings_form', array(&$this, 'settings_form'));
add_action('evenpost_init', array(&$this, 'init'));
}
function EventPostWeather() {
$this->__construct();
}
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');
}
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;
}
}
function settings_form($ep_settings) {
?>
<h2><?php _e('Weather', 'event-post'); ?></h2>
<?php
<p class="description"><?php printf(__('Provided thanks to %s', 'event-post'), '<a href="http://openweathermap.org" target="_blank">openweathermap.org</a>'); ?></p>
<table class="form-table" id="eventpost-settings-table-weather">
<tbody>
<tr>
<th>
<?php _e('Enable weather', 'event-post') ?>
</th>
<td>
<label for="weather_enabled">
<input type="checkbox" name="ep_settings[weather_enabled]" id="weather_enabled" <?php if ($ep_settings['weather_enabled'] == '1') {
echo'checked';
} ?> value="1">
<?php _e('Enable weather feature', 'event-post') ?>
</label>
</td>
</tr>
<tr>
<th>
<label for="weather_api_key">
<?php _e('API key', 'event-post') ?>
</label>
</th>
<td>
<input type="text" name="ep_settings[weather_api_key]" id="weather_api_key" value="<?php echo $ep_settings['weather_api_key']; ?>" size="40">
<p class="description"><?php printf(__('Get a free API key at: %s', 'event-post'), '<a href="http://openweathermap.org/appid#get" target="_blank">openweathermap.org/appid#get</a>'); ?></p>
</td>
</tr>
<tr>
<th>
<label for="weather_units">
<?php _e('Units', 'event-post') ?>
</label>
</th>
<td>
<select name="ep_settings[weather_units]" id="weather_units">
<option value="standard" <?php selected($ep_settings['weather_units'], 'standard', true);?>>
<?php _e('Standard (Fahrenheit)', 'event-post') ?>
</option>
<option value="metric" <?php selected($ep_settings['weather_units'], 'metric', true);?>>
<?php _e('Metric (Celsius)', 'event-post') ?>
</option>
<option value="imperial" <?php selected($ep_settings['weather_units'], 'imperial', true);?>>
<?php _e('Imperial (Kelvin)', 'event-post') ?>
</option>
</select>
</td>
</tr>
</tbody>
</table><!--
<?php
}
function init($EP) {
if (!$EP->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');
add_filter('eventpost_params', array(&$this, 'params'));
add_filter('eventpost_retreive', array(&$this, 'retreive'));
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'));
}
function params($params = array()) {
$params['weather'] = true;
return $params;
}
function retreive($event) {
$event->weather = get_post_meta($event->ID, $this->META_WEATHER, true);
return $event;
}
function scheme_entities($attr = array()) {
array_push($attr, '%event_weather%');
return $attr;
}
function scheme_values($values = array(), $post = null) {
array_push($values, $this->get_weather($post));
return $values;
}
function default_shema($schema) {
$schema['item'] = str_replace('</%child%>', "%event_weather%\n</%child%>", $schema['item']);
return $schema;
}
function get_single($event_datas, $post = null) {
return $event_datas . $this->get_weather($post);
}
function get_weather_icons($weather){
$string = '';
foreach((array) $weather as $item){
$text = ucfirst(__(strtolower($item->description), 'event-post'));
$string.='<span class="eventpost-weather-'.str_replace('-', '', strtolower($item->description)).' eventpost-weather-'.$item->icon.'">'
. '<img src="'. plugins_url('../img/weather/'.$this->theme.'/'.$item->icon.'.png', __FILE__).'" alt="'.sprintf('%s icon', $text).'">'
. '<em class="eventpost-weather-text">'.$text.'</em>'
. '</span>';
}
return $string;
}
function get_weather_item($item){
$string = '';
$string.= '<div class="eventpost-weather-item">'
.'<span class="eventpost-weather-date">'.date_i18n(get_option('date_format').' '.get_option('time_format'), $item->dt).'</span> '
.'<span class="eventpost-weather-temp">'.round($item->main->temp).' °'.$this->unit_names[$this->units].'</span> '
.'<span class="eventpost-weather-list">'.$this->get_weather_icons($item->weather).'</span>'
.'</div>';
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;
}
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;
if(is_array($local_weather) && $local_weather['data'] && ($local_weather['type']=='current' || $local_weather['type']=='history')){
return $local_weather;
}
$weather = array('type'=>false, 'data'=>false);
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) {
$weather = array('type'=>'history', 'data'=>$this->get_history($event), 'fetched'=>time());
update_post_meta($event->ID, $this->META_WEATHER, $weather);
}
else {
$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;
}
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);
}
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,
))
)
));
}
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,
))
)
));
}
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);
}
}