<?php
/*
Weather Widget developed By : Fouad Badawy | TieLabs
Based On : Awesome Weather Widget http://halgatewood.com/awesome-weather
*/
// THE LOGIC
function tie_weather_logic( $atts ){
$rtn = "";
$weather_data = array();
$location = isset($atts['location']) ? $atts['location'] : false;
$api_key = isset($atts['api_key']) ? $atts['api_key'] : false;
$units = (isset($atts['units']) AND strtoupper($atts['units']) == "C") ? "metric" : "imperial";
$units_display = $units == "metric" ? __('C', 'tie') : __('F', 'tie');
$days_to_show = isset($atts['forecast_days']) ? $atts['forecast_days'] : 5;
$locale = 'en';
$sytem_locale = get_locale();
$available_locales = array( 'en', 'sp', 'fr', 'it', 'de', 'pt', 'ro', 'pl', 'ru', 'ua', 'fi', 'nl', 'bg', 'se', 'tr', 'zh_tw', 'zh_cn' );
// CHECK FOR LOCALE
if( in_array( $sytem_locale , $available_locales ) ){
$locale = $sytem_locale;
}
// CHECK FOR LOCALE BY FIRST TWO DIGITS
if( in_array(substr($sytem_locale, 0, 2), $available_locales ) ){
$locale = substr($sytem_locale, 0, 2);
}
// NO LOCATION, ABORT ABORT!!!1!
if( !$location ) { return tie_weather_error(); }
//FIND AND CACHE CITY ID
if( is_numeric($location) ){
$city_name_slug = $location;
$api_query = "id=" . $location;
}else{
$city_name_slug = sanitize_title( $location );
$api_query = "q=" . $location;
}
// TRANSIENT NAME
$weather_transient_name = 'tie_' . $city_name_slug . "_" . strtolower($units_display) . '_' . $locale;
// GET WEATHER DATA
if( get_transient( $weather_transient_name ) ){
$weather_data = get_transient( $weather_transient_name );
}
else{
$weather_data['now'] = array();
$weather_data['forecast'] = array();
// NOW
$now_ping = "http://api.openweathermap.org/data/2.5/weather?" . $api_query . "&lang=" . $locale . "&units=" . $units."&APPID=".$api_key;
$now_ping = str_replace(" ", "", $now_ping);
$now_ping_get = wp_remote_get( $now_ping, array( 'timeout' => 120 ) );
if( is_wp_error( $now_ping_get ) ){
return tie_weather_error( $now_ping_get->get_error_message() );
}
$city_data = json_decode( $now_ping_get['body'] );
if( isset($city_data->cod) AND $city_data->cod == 404 ){
return tie_weather_error( $city_data->message );
}else
{
$weather_data['now'] = $city_data;
}
// FORECAST
if( $days_to_show != "hide" )
{
$forecast_ping = "http://api.openweathermap.org/data/2.5/forecast/daily?" . $api_query . "&lang=" . $locale . "&units=" . $units ."&cnt=7&APPID=".$api_key;
$forecast_ping = str_replace(" ", "", $forecast_ping);
$forecast_ping_get = wp_remote_get( $forecast_ping, array( 'timeout' => 120 ) );
if( is_wp_error( $forecast_ping_get ) ){
return tie_weather_error( $forecast_ping_get->get_error_message() );
}
$forecast_data = json_decode( $forecast_ping_get['body'] );
if( isset($forecast_data->cod) AND $forecast_data->cod == 404 ){
return tie_weather_error( $forecast_data->message );
}else{
$weather_data['forecast'] = $forecast_data;
}
}
if($weather_data['now'] OR $weather_data['forecast']){
// SET THE TRANSIENT, CACHE FOR A LITTLE OVER THREE HOURS
set_transient( $weather_transient_name, $weather_data, apply_filters( 'awesome_weather_cache', 11000 ) );
}
}
// NO WEATHER
if( !$weather_data OR !isset($weather_data['now'])) { return tie_weather_error(); }
// TODAYS TEMPS & ICONS
$today = $weather_data['now'];
$today_temp = round($today->main->temp);
$today_high = round($today->main->temp_max);
$today_low = round($today->main->temp_min);
// DATA
$today->main->humidity = round($today->main->humidity);
$today->wind->speed = round($today->wind->speed);
$wind_label = array (
__('N', 'tie'),
__('NNE', 'tie'),
__('NE', 'tie'),
__('ENE', 'tie'),
__('E', 'tie'),
__('ESE', 'tie'),
__('SE', 'tie'),
__('SSE', 'tie'),
__('S', 'tie'),
__('SSW', 'tie'),
__('SW', 'tie'),
__('WSW', 'tie'),
__('W', 'tie'),
__('WNW', 'tie'),
__('NW', 'tie'),
__('NNW', 'tie')
);
$wind_direction = $wind_label[ fmod((($today->wind->deg + 11) / 22.5),16) ];
// ICONS
$today_icon = $today->weather[0]->icon;
$icon_class = 'cloud';
if( $today_icon == '01d' ) $icon_class ='sun';
elseif( $today_icon == '01n' ) $icon_class ='moon';
elseif( $today_icon == '02d' ) $icon_class ='cloud-sun';
elseif( $today_icon == '02n' ) $icon_class ='cloud-moon';
elseif( $today_icon == '04d' || $today_icon == '04n' ) $icon_class ='clouds';
elseif( $today_icon == '09d' || $today_icon == '09n' || $today_icon == '10d' || $today_icon == '10n' ) $icon_class ='rain';
elseif( $today_icon == '11d' || $today_icon == '11n' ) $icon_class ='clouds-flash-alt';
elseif( $today_icon == '13d' || $today_icon == '13n' ) $icon_class ='hail';
elseif( $today_icon == '50d' || $today_icon == '50n' ) $icon_class ='fog';
// DISPLAY WIDGET
$rtn .= "
<div id=\"tie-weather-{$city_name_slug}\" class=\"tie-weather-wrap\">
";
$rtn .= "
<div class=\"tie-weather-current-temp\">
<div class=\"weather-icon\"><i class=\"tieicon-{$icon_class}\"></i></div>
$today_temp<sup>{$units_display}</sup>
</div> <!-- /.tie-weather-current-temp -->
";
$speed_text = ($units == "metric") ? __('km/h', 'tie') : __('mph', 'tie');
$rtn .= "
<div class=\"tie-weather-todays-stats\">
<div class=\"weather_name\">{$today->name}</div>
<div class=\"weather_desc\">{$today->weather[0]->description}</div>
<div class=\"weather_humidty\">" . __('humidity:', 'tie') . " {$today->main->humidity}% </div>
<div class=\"weather_wind\">" . __('wind:', 'tie') . " {$today->wind->speed}" . $speed_text . " {$wind_direction}</div>
<div class=\"weather_highlow\"> " .__('H', 'tie') . " {$today_high} • " . __('L', 'tie') . " {$today_low} </div>
</div> <!-- /.tie-weather-todays-stats -->
";
if($days_to_show != "hide")
{
$rtn .= "<div class=\"tie-weather-forecast weather_days_{$days_to_show}\">";
$c = 1;
$dt_today = date( 'Ymd', current_time( 'timestamp', 0 ) );
$forecast = $weather_data['forecast'];
$days_to_show = (int) $days_to_show;
foreach( (array) $forecast->list as $forecast )
{
if( $dt_today >= date('Ymd', $forecast->dt)) continue;
$days_of_week = array( __('Sun' ,'tie'), __('Mon' ,'tie'), __('Tue' ,'tie'), __('Wed' ,'tie'), __('Thu' ,'tie'), __('Fri' ,'tie'), __('Sat' ,'tie') );
$forecast->temp = (int) $forecast->temp->day;
$day_of_week = $days_of_week[ date('w', $forecast->dt) ];
$rtn .= "
<div class=\"tie-weather-forecast-day\">
<div class=\"tie-weather-forecast-day-temp\">{$forecast->temp}<sup>{$units_display}</sup></div>
<div class=\"tie-weather-forecast-day-abbr\">$day_of_week</div>
</div>
";
if($c == $days_to_show) break;
$c++;
}
$rtn .= " </div> <!-- /.tie-weather-forecast -->";
}
$rtn .= "</div> <!-- /.tie-weather-wrap -->";
return $rtn;
}
// RETURN ERROR
function tie_weather_error( $msg = false )
{
if(!$msg) $msg = __('No weather information available', 'tie');
return apply_filters( 'tie_weather_error', "<!-- TIE WEATHER ERROR: " . $msg . " -->" );
}
// AWESOME WEATHER WIDGET, WIDGET CLASS, SO MANY WIDGETS
class TIE_WeatherWidget extends WP_Widget
{
public function __construct(){
parent::__construct(false, $name = THEME_NAME .' - '.__( 'Weather' , 'tie' ) );
}
public function widget($args, $instance)
{
extract( $args );
$location = isset($instance['location']) ? $instance['location'] : false;
$api_key = isset($instance['api_key']) ? $instance['api_key'] : false;
$widget_title = isset($instance['widget_title']) ? $instance['widget_title'] : false;
$units = isset($instance['units']) ? $instance['units'] : false;
$forecast_days = isset($instance['forecast_days']) ? $instance['forecast_days'] : false;
echo $before_widget;
echo $before_title . $widget_title . $after_title;
echo tie_weather_logic( array( 'location' => $location, 'api_key' => $api_key, 'units' => $units, 'forecast_days' => $forecast_days ));
echo $after_widget;
}
public function update($new_instance, $old_instance)
{
$instance = $old_instance;
$instance['location'] = strip_tags($new_instance['location']);
$instance['api_key'] = strip_tags($new_instance['api_key']);
$instance['widget_title'] = strip_tags($new_instance['widget_title']);
$instance['units'] = strip_tags($new_instance['units']);
$instance['forecast_days'] = strip_tags($new_instance['forecast_days']);
return $instance;
}
public function form($instance)
{
$defaults = array( 'widget_title' =>__('Weather', 'tie') );
$instance = wp_parse_args( (array) $instance, $defaults );
$location = isset($instance['location']) ? esc_attr($instance['location']) : "";
$api_key = isset($instance['api_key']) ? esc_attr($instance['api_key']) : "";
$widget_title = isset($instance['widget_title']) ? esc_attr($instance['widget_title']) : "";
$units = (isset($instance['units']) AND strtoupper($instance['units']) == "C") ? "C" : "F";
$forecast_days = isset($instance['forecast_days']) ? esc_attr($instance['forecast_days']) : 5;
?>
<p>
<label for="<?php echo $this->get_field_id('widget_title'); ?>"><?php _e('Title:', 'tie'); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id('widget_title'); ?>" name="<?php echo $this->get_field_name('widget_title'); ?>" type="text" value="<?php echo $widget_title; ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('location'); ?>">
<?php _e('Location:', 'tie'); ?> - <a href="http://openweathermap.org/find" target="_blank"><?php _e('Find Your Location', 'tie'); ?></a><br />
<small><?php _e('(i.e: London,UK or New York City,NY)', 'tie'); ?></small>
</label>
<input class="widefat" style="margin-top: 4px;" id="<?php echo $this->get_field_id('location'); ?>" name="<?php echo $this->get_field_name('location'); ?>" type="text" value="<?php echo $location; ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('api_key'); ?>">
<?php _e('API key:', 'tie'); ?> - <a href="http://openweathermap.org/appid#get" target="_blank"><?php _e('How to get API key', 'tie'); ?></a><br />
</label>
<input class="widefat" style="margin-top: 4px;" id="<?php echo $this->get_field_id('api_key'); ?>" name="<?php echo $this->get_field_name('api_key'); ?>" type="text" value="<?php echo $api_key; ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('units'); ?>"><?php _e('Units:', 'tie'); ?></label>
<input id="<?php echo $this->get_field_id('units'); ?>" name="<?php echo $this->get_field_name('units'); ?>" type="radio" value="F" <?php if($units == "F") echo ' checked="checked"'; ?> /> <?php _e('F', 'tie'); ?>
<input id="<?php echo $this->get_field_id('units'); ?>" name="<?php echo $this->get_field_name('units'); ?>" type="radio" value="C" <?php if($units == "C") echo ' checked="checked"'; ?> /> <?php _e('C', 'tie'); ?>
</p>
<p>
<label for="<?php echo $this->get_field_id('forecast_days'); ?>"><?php _e('Forecast:', 'tie'); ?></label>
<select class="widefat" id="<?php echo $this->get_field_id('forecast_days'); ?>" name="<?php echo $this->get_field_name('forecast_days'); ?>">
<option value="5"<?php if($forecast_days == 5) echo " selected=\"selected\""; ?>><?php _e('5 Days', 'tie'); ?></option>
<option value="4"<?php if($forecast_days == 4) echo " selected=\"selected\""; ?>><?php _e('4 Days', 'tie'); ?></option>
<option value="3"<?php if($forecast_days == 3) echo " selected=\"selected\""; ?>><?php _e('3 Days', 'tie'); ?></option>
<option value="2"<?php if($forecast_days == 2) echo " selected=\"selected\""; ?>><?php _e('2 Days', 'tie'); ?></option>
<option value="1"<?php if($forecast_days == 1) echo " selected=\"selected\""; ?>><?php _e('1 Day', 'tie'); ?></option>
<option value="hide"<?php if($forecast_days == 'hide') echo " selected=\"selected\""; ?>><?php _e("Don't Show", 'tie'); ?></option>
</select>
</p>
<?php
}
}
add_action( 'widgets_init', 'tie_weather_widget' );
function tie_weather_widget() {
register_widget( 'TIE_WeatherWidget' );
}