'calendar', 'description' => _a("A calendar of your site's posts")); $this->WP_Widget('atom-calendar', _a("Calendar"), $widget_ops); atom_add('ajax_requests', array(&$this, 'ajax')); // include in jQuery(document).ready() atom_add('jquery_init', array(&$this, 'js')); } function js(){ // we need to process all instances because this function gets to run only once $widget_settings = atom_get_options($this->option_name); foreach((array)$widget_settings as $instance => $options): // identify instance $id = "{$this->id_base}-{$instance}"; $block_id = "instance-{$id}"; if (isset($options['ajax']) && $options['ajax'] && is_active_widget(false, $id, $this->id_base)): ?> $("#").delegate("a.control", "click", function(){ var reqdate = $(this).attr('rel').split(/-/g); $.ajax({ type: "GET", url: "", context: this, data: { id: "", initial: , reqmonth: reqdate[0], reqyear: reqdate[1], _ajax_nonce: "", atom: "get_calendar" }, dataType: 'json', beforeSend: function() { $(this).addClass("loading"); }, complete: function() { $(this).removeClass("loading"); }, success: function(response){ if(response.output != '') $("# .calendar-block").html(response.output); } }); return false; }); get_calendar((bool)$_GET['initial'], intval($_GET['reqmonth']), intval($_GET['reqyear'])); echo json_encode(array('output' => $output)); exit(); endif; } /* same as the wp function, with small changes */ function get_calendar($initial = true, $req_m = NULL, $req_y = NULL) { global $wpdb, $m, $monthnum, $year, $wp_locale, $posts; $post_type = 'post'; // @todo: custom post types -- need get_day_link() // ajax? if($req_m) $monthnum = $req_m; if($req_y) $year = $req_y; $cache = array(); $key = md5($m.$monthnum.$year); if ($cache = wp_cache_get('atom_get_calendar', 'calendar')) if (is_array($cache) && isset($cache[$key])) return apply_filters('atom_get_calendar', $cache[$key]); if (!is_array($cache)) $cache = array(); // Quick check. If we have no posts at all, abort! if (!$posts): $gotsome = $wpdb->get_var("SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = '{$post_type}' AND post_status = 'publish' LIMIT 1"); if (!$gotsome): $cache[ $key ] = ''; wp_cache_set('atom_get_calendar', $cache, 'calendar'); return; endif; endif; if (isset($_GET['w'])) $w = ''.intval($_GET['w']); // week_begins = 0 stands for Sunday $week_begins = intval(atom_get_options('start_of_week')); // Let's figure out when we are if (!empty($monthnum) && !empty($year)){ $thismonth = ''.zeroise(intval($monthnum), 2); $thisyear = ''.intval($year); } elseif (!empty($w)) { // We need to get the month from MySQL $thisyear = ''.intval(substr($m, 0, 4)); $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL {$d} DAY)), '%m')"); } elseif (!empty($m)){ $thisyear = ''.intval(substr($m, 0, 4)); if (strlen($m) < 6) $thismonth = '01'; else $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2); } else { $thisyear = gmdate('Y', current_time('timestamp')); $thismonth = gmdate('m', current_time('timestamp')); } $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear); // Get the next and previous month and year with at least one post $previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year FROM {$wpdb->posts} WHERE post_date < '{$thisyear}-{$thismonth}-01' AND post_type = '{$post_type}' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1"); $next = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year FROM {$wpdb->posts} WHERE post_date > '{$thisyear}-{$thismonth}-01' AND MONTH(post_date) != MONTH('{$thisyear}-{$thismonth}-01') AND post_type = '{$post_type}' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 1"); /* translators: Calendar caption: 1: month name, 2: 4-digit year */ $calendar_caption = _x('%1$s %2$s', 'calendar caption'); $calendar_output = '
'; $calendar_output .= '

'.sprintf($calendar_caption, $wp_locale->get_month($thismonth), date('Y', $unixmonth)).'

'; if ($previous): $calendar_output .= "\n\t\tmonth}-{$previous->year}\" href=\"".get_month_link($previous->year, $previous->month)."\" title=\"".sprintf(_a('View posts for %1$s %2$s'), $wp_locale->get_month($previous->month), date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year)))."\">« ".$wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)).""; endif; if ($next): $calendar_output .= "\n\t\tmonth}-{$next->year}\" href=\"".get_month_link($next->year, $next->month)."\" title=\"".esc_attr(sprintf(_a('View posts for %1$s %2$s'), $wp_locale->get_month($next->month), date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))))."\">".$wp_locale->get_month_abbrev($wp_locale->get_month($next->month))." »"; endif; $calendar_output .= '
'; $calendar_output .= ''; $myweek = array(); for ($wdcount=0; $wdcount<=6; $wdcount++) $myweek[] = $wp_locale->get_weekday(($wdcount+$week_begins)%7); foreach ($myweek as $wd): $day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd); $wd = esc_attr($wd); $calendar_output .= "\n\t\t"; endforeach; $calendar_output .= ''; // Get days with posts $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date) FROM {$wpdb->posts} WHERE MONTH(post_date) = '{$thismonth}' AND YEAR(post_date) = '$thisyear' AND post_type = '{$post_type}' AND post_status = 'publish' AND post_date < '".current_time('mysql').'\'', ARRAY_N); if ($dayswithposts) foreach ((array) $dayswithposts as $daywith) $daywithpost[] = $daywith[0]; else $daywithpost = array(); if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'camino') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false) $ak_title_separator = "\n"; else $ak_title_separator = ', '; $ak_titles_for_day = array(); $ak_post_titles = $wpdb->get_results("SELECT ID, post_title, DAYOFMONTH(post_date) as dom FROM {$wpdb->posts} WHERE YEAR(post_date) = '{$thisyear}' AND MONTH(post_date) = '{$thismonth}' AND post_date < '".current_time('mysql')."' AND post_type = '{$post_type}' AND post_status = 'publish'"); if ($ak_post_titles) foreach ((array)$ak_post_titles as $ak_post_title): $post_title = esc_attr(apply_filters('the_title', $ak_post_title->post_title, $ak_post_title->ID)); if (empty($ak_titles_for_day["day_{$ak_post_title->dom}"])) $ak_titles_for_day["day_{$ak_post_title->dom}"] = ''; if (empty($ak_titles_for_day[$ak_post_title->dom])) // first one $ak_titles_for_day[$ak_post_title->dom] = $post_title; else $ak_titles_for_day[$ak_post_title->dom] .= $ak_title_separator.$post_title; endforeach; // See how much we should pad in the beginning $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins); if (0 != $pad) $calendar_output .= ''; $daysinmonth = intval(date('t', $unixmonth)); for ($day = 1; $day <= $daysinmonth; ++$day): if (isset($newrow) && $newrow) $calendar_output .= "\n\t\n\t\n\t\t"; $newrow = false; if ($day == gmdate('j', current_time('timestamp')) && $thismonth == gmdate('m', current_time('timestamp')) && $thisyear == gmdate('Y', current_time('timestamp'))) $calendar_output .= ''; if (6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins)) $newrow = true; endfor; $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins); if ($pad != 0 && $pad != 7) $calendar_output .= "\n\t\t".''; $calendar_output .= "\n\t\n\t\n\t
{$day_name}
 
'; else $calendar_output .= ''; if (in_array($day, $daywithpost)) // any posts today? $calendar_output .= '$day"; else $calendar_output .= "{$day}"; $calendar_output .= ' 
"; $cache[$key] = $calendar_output; wp_cache_set('atom_get_calendar', $cache, 'calendar'); return apply_filters('atom_get_calendar', $calendar_output); // no point using get_calendar(), output is different... } function widget($args, $instance){ extract($args); $instance = wp_parse_args($instance, $this->defaults()); $initial = isset($instance['initial']) ? $instance['initial'] : false; $ajax = isset($instance['ajax']) ? $instance['ajax'] : false; echo $before_widget; echo '
'.$this->get_calendar($initial).'
'; echo $after_widget; } function update($new_instance, $old_instance){ $instance = $old_instance; $instance['initial'] = (bool)$new_instance['initial']; $instance['ajax'] = (bool)$new_instance['ajax']; return wp_parse_args($instance, $this->defaults()); } function defaults(){ // default settings return apply_filters('atom_widget_calendar_defaults', array( 'title' => _a('Calendar'), 'initial' => false, 'ajax' => true, ), $this); } function form($instance){ $instance = wp_parse_args($instance, $this->defaults()); ?>
>