Last active
April 21, 2020 09:27
-
-
Save billerickson/2303827 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Events Calendar Widget | |
* | |
* @link http://codex.wordpress.org/Widgets_API#Developing_Widgets | |
* | |
* @package BE_Genesis_Child | |
* @author Bill Erickson <bill@billerickson.net> | |
* @copyright Copyright (c) 2011, Bill Erickson | |
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License | |
*/ | |
class BE_Events_Calendar_Widget extends WP_Widget { | |
/** | |
* Constructor | |
* | |
* @return void | |
**/ | |
function BE_Events_Calendar_Widget() { | |
$widget_ops = array( 'classname' => 'widget_events_calendar', 'description' => '' ); | |
$this->WP_Widget( 'events-calendar-widget', 'Events Calendar', $widget_ops ); | |
} | |
/** | |
* Outputs the HTML for this widget. | |
* | |
* @param array An array of standard parameters for widgets in this theme | |
* @param array An array of settings for this widget instance | |
* @return void Echoes it's output | |
**/ | |
function widget( $args, $instance ) { | |
extract( $args, EXTR_SKIP ); | |
echo $before_widget; | |
// If they've selected a date, then $current = that. | |
// If not, then $current = today | |
if( isset( $_GET['event-date'] ) ) | |
$current = esc_attr( $_GET['event-date'] ); | |
else | |
$current = date( 'M-d-Y' ); | |
// Build Calendar Here. | |
$date = isset( $_GET['event-date'] ) ? esc_attr( $_GET['event-date'] ) : ''; | |
if( empty( $date ) ) // if no date selected, use today | |
$date = date( 'M-d-Y' ); | |
global $post; | |
if( is_singular() ) $date = date( 'M-d-Y', get_post_meta( $post->ID, 'be_event_start_date_unix', true ) ); | |
$month = date( 'F', strtotime( $date ) ); | |
$month_numeric = date( 'm', strtotime( $date ) ); | |
$month_short = date( 'M', strtotime( $date ) ); | |
$year = date( 'Y', strtotime( $date ) ); | |
$prev_month_date = $this->build_prev_month_link( $date ); | |
$next_month_date = $this->build_next_month_link( $date ); | |
$first_day = mktime(0,0,0,$month_numeric, 1, $year); | |
$day_of_week = date('D', $first_day); | |
switch($day_of_week){ | |
case "Sun": $blank = 0; break; | |
case "Mon": $blank = 1; break; | |
case "Tue": $blank = 2; break; | |
case "Wed": $blank = 3; break; | |
case "Thu": $blank = 4; break; | |
case "Fri": $blank = 5; break; | |
case "Sat": $blank = 6; break; | |
} | |
$days_in_month = cal_days_in_month(0, $month_numeric, $year); | |
?> | |
<div class="calendar-month"> | |
<?php | |
echo '<a href="' . add_query_arg( 'event-date', $prev_month_date, get_post_type_archive_link( 'events' ) ) . '" class="prev">«</a>'; | |
echo '<a href="' . add_query_arg( 'event-date', $next_month_date, get_post_type_archive_link( 'events' ) ) . '" class="next">»</a>'; | |
echo '<strong>' . $month . '</strong>'; | |
?> | |
</div> | |
<div class="calendar-day-names"> | |
<span>S</span><span>M</span><span>T</span><span>W</span><span>T</span><span>F</span><span>S</span> | |
</div> | |
<div class="calendar-days"> | |
<?php | |
$day_count = 1; | |
while ( $blank>0 ) { | |
echo '<span> </span>'; | |
$blank--; | |
$day_count++; | |
} | |
$day_num = 1; | |
while ( $day_num <= $days_in_month ) { | |
$day_num_leading_zero = strlen((string)$day_num) == 1 ? ('0'.$day_num) : $day_num; | |
echo $this->build_event_link( $month_short . '-' . $day_num_leading_zero . '-' . $year ); | |
$day_num++; | |
$day_count++; | |
if ($day_count > 7) { | |
echo '<div class="cl"></div>'; | |
$day_count = 1; | |
} | |
} | |
while ( $day_count > 1 && $day_count <=7 ) { | |
$day_count++; | |
} | |
?> | |
</div><!-- /calendar-days --> | |
<?php | |
echo $after_widget; | |
} | |
function build_event_link( $date ) { | |
$current = isset( $_GET['event-date'] ) ? esc_attr( $_GET['event-date'] ) : date( 'M-d-Y' ); | |
global $post; | |
if( is_singular() ) $current = date( 'M-d-Y', get_post_meta( $post->ID, 'be_event_start_date_unix', true ) ); | |
$day = date( 'j', strtotime( $date ) ); | |
$classes = ( $date == $current && ( is_post_type_archive( 'events' ) || is_singular() ) ) ? ' class="active"' : ''; | |
$output = '<a href="' . add_query_arg( 'event-date', $date, get_post_type_archive_link( 'events' ) ) . '"' . $classes . '>' . $day . '</a> '; | |
return $output; | |
} | |
function build_prev_month_link( $date ) { | |
$prev_month = date( 'M', strtotime( '-1 Months', strtotime($date) ) ); | |
$prev_month_year = date( 'Y', strtotime( '-1 Months', strtotime($date) ) ); | |
return $prev_month . '-01-' . $prev_month_year; | |
} | |
function build_next_month_link( $date ) { | |
$next_month = date( 'M', strtotime( '+1 Months', strtotime($date) ) ); | |
$next_month_year = date( 'Y', strtotime( '+1 Months', strtotime($date) ) ); | |
return $next_month . '-01-' . $next_month_year; | |
} | |
} | |
add_action( 'widgets_init', 'be_register_calendar_widget' ); | |
/** | |
* Register Calendar Widget | |
* | |
*/ | |
function be_register_calendar_widget() { | |
register_widget('BE_Events_Calendar_Widget'); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is great! Thanks for the head-start. Any chance you're able to share what you've got going on in '/lib/js/event-calendar.js'?
Thanks again.