Overview

Namespaces

  • EventPost
  • None

Classes

  • EventPost
  • EventPost\Children
  • EventPost\Icons
  • EventPost\Multisite
  • EventPost\Settings
  • EventPost\Shortcodes
  • EventPost\Taxonomies
  • EventPost_Cal
  • EventPost_List
  • EventPost_Map
  • EventPost_Search
  • EventPostWeather

Functions

  • event_post_format_color
  • event_post_get_all_terms
  • eventdetails_block_init
  • EventPost
  • EventPost\product_event_tab
  • EventPost\woocommerce_product_tabs
  • EventPost\woocommerce_rich_result
  • eventpost_list_block_init
  • eventpost_timeline_block_init
  • eventscalendar_block_init
  • eventsmap_block_init
  • get_the_date_end
  • get_the_date_start
  • get_the_dates
  • get_the_location
  • the_date_end
  • the_date_start
  • the_dates
  • the_location
  • Overview
  • Namespace
  • Class
  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
/**
 * Weather support
 * 
 * @package event-post
 * @version 5.9.11
 * @since   4.3.0
 */
$EventPostWeather = new EventPostWeather();

/**
 * Provides weather support thanks to OpenWeatherMap
 * http://openweathermap.org
 *
 * License: Creative Commons (cc-by-sa)
 * http://creativecommons.org/licenses/by-sa/2.0/.
 *
 *
 * Get an API key
 * http://openweathermap.org/appid#get
 */
class EventPostWeather {

    var $META_WEATHER;

    var $api_key;
    var $units;
    var $unit_names;
    var $theme;

    function __construct() {
        // Hook into the plugin

        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'));
    }

    /**
     * PHP4 constructor
     */
    function EventPostWeather() {
        $this->__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');

    }

    /**
     * Get settings
     * 
     * @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;
        }
    }

    /**
     * Settings form
     * 
     * @param type $ep_settings
     */
    function settings_form($ep_settings) {
        ?>
        <h2><?php _e('Weather', 'event-post'); ?></h2>
        <?php  // Translators: %s is a link to openweathermap.org ?>
        <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><!-- #eventpost-settings-table-weather -->
        <?php
    }

    /**
     * Initialization of weather support
     * 
     * @param object $EP
     * 
     * @return void
     */
    function init($EP) {
        // Ensure OpenWeatherMap is required and available.
        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');

        // 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'));


    }

    /**
     * Alters parameters
     * 
     * @param array $params
     * 
     * @return array
     */
    function params($params = array()) {
        $params['weather'] = true;
        return $params;
    }

    /**
     * Alters an event object
     * 
     * @param WP_Post $event
     * 
     * @return WP_Post
     */
    function retreive($event) {
        $event->weather = get_post_meta($event->ID, $this->META_WEATHER, true);
        return $event;
    }

    /**
     * Alters schema entities
     * 
     * @param array $attr
     * 
     * @return array
     */
    function scheme_entities($attr = array()) {
        array_push($attr, '%event_weather%');
        return $attr;
    }

    /**
     * Alters schema values
     * 
     * @param array $values
     * 
     * @return array
     */
    function scheme_values($values = array(), $post = null) {
        array_push($values, $this->get_weather($post));
        return $values;
    }

    /**
     * Alters default schema
     * 
     * @param array $schema
     * 
     * @return array
     */
    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);
    }

    //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.='<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;
    }
    /**
     * Get weather item
     * 
     * @param object $item
     * 
     * @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).' &deg'.$this->unit_names[$this->units].'</span> '
                            .'<span class="eventpost-weather-list">'.$this->get_weather_icons($item->weather).'</span>'
                            .'</div>';
        return $string;
    }

    /**
     * Get weather
     * 
     * @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;
    }

    /**
     * Get weather datas
     * 
     * @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 weather
     * 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);
    }

}
API documentation generated by ApiGen