Last active
December 14, 2015 01:29
-
-
Save jmdodd/5006995 to your computer and use it in GitHub Desktop.
Calendar for multiple post types; needs cleanup (circa 2010).
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 | |
function ucc_get_calendar( $post_types = '', $initial = true, $echo = true ) { | |
global $wpdb, $m, $monthnum, $year, $wp_locale, $posts; | |
// Set and verify post types to fetch | |
if ( empty( $post_types ) || !is_array( $post_types ) ) { | |
$args = array( | |
'public' => true, | |
'_builtin' => false, | |
); | |
$output = 'names'; | |
$operator = 'and'; | |
$post_types = get_post_types( $args, $output, $operator ); | |
$post_types = array_merge( $post_types, array( 'post' ) ); | |
} else { | |
// Trust but verify | |
$my_post_types = array(); | |
foreach ( $post_types as $post_type ) { | |
if ( post_type_exists( $post_type ) ) | |
$my_post_types[] = $post_type; | |
} | |
$post_types = $my_post_types; | |
} | |
// Set up for cache request | |
$post_types_key = implode( '', $post_types ); | |
$cache = array(); | |
$key = md5( $m . $monthnum . $year . $post_types_key ); | |
// Check cache for existing calendar | |
if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) { | |
if ( is_array( $cache ) && isset( $cache[$key] ) ) { | |
remove_filter( 'get_calendar', 'ucc_get_calendar_filter' ); | |
$output = apply_filters( 'get_calendar', $cache[$key] ); | |
add_filter( 'get_calendar', 'ucc_get_calendar_filter' ); | |
if ( $echo ) { | |
echo $output; | |
return; | |
} else { | |
return $output; | |
} | |
} | |
} | |
if ( !is_array( $cache ) ) | |
$cache = array(); | |
// Set up for SQL IN() | |
$post_types_in = array(); | |
foreach ( $post_types as $post_type ) { | |
$post_types_in[] = "'" . esc_sql( $post_type ) . "'"; | |
} | |
$post_types_in = implode( ', ', $post_types_in ); | |
// Quick check. If we have no posts at all, abort! | |
if ( !$posts ) { | |
$sql = "SELECT 1 as test FROM $wpdb->posts WHERE post_type IN ( $post_types_in ) AND post_status = 'publish' LIMIT 1"; | |
$gotsome = $wpdb->get_var( $sql ); | |
if ( !$gotsome ) { | |
$cache[$key] = ''; | |
wp_cache_set( 'get_calendar', $cache, 'calendar' ); | |
return; | |
} | |
} | |
if ( isset( $_GET['w'] ) ) | |
$w = '' . intval( $_GET['w'] ); | |
// week_begins = 0 stands for Sunday | |
$week_begins = intval( get_option( '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 IN ( $post_types_in ) 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 IN ( $post_types_in ) 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 = '<table id="wp-calendar" summary="' . esc_attr__( 'Calendar' ) . '"> | |
<caption>' . sprintf( $calendar_caption, $wp_locale->get_month( $thismonth ), date( 'Y', $unixmonth ) ) . '</caption> | |
<thead> | |
<tr>'; | |
$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<th scope=\"col\" title=\"$wd\">$day_name</th>"; | |
} | |
$calendar_output .= ' | |
</tr> | |
</thead> | |
<tfoot> | |
<tr>'; | |
if ( $previous ) { | |
$calendar_output .= "\n\t\t" . '<td colspan="3" id="prev"><a href="' . get_month_link( $previous->year, $previous->month ) . '" title="' . sprintf( __( '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 ) ) . '</a></td>'; | |
} else { | |
$calendar_output .= "\n\t\t" . '<td colspan="3" id="prev" class="pad"> </td>'; | |
} | |
$calendar_output .= "\n\t\t" . '<td class="pad"> </td>'; | |
if ( $next ) { | |
$calendar_output .= "\n\t\t" . '<td colspan="3" id="next"><a href="' . get_month_link( $next->year, $next->month ) . '" title="' . esc_attr( sprintf( __( '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 ) ) . ' »</a></td>'; | |
} else { | |
$calendar_output .= "\n\t\t" . '<td colspan="3" id="next" class="pad"> </td>'; | |
} | |
$calendar_output .= ' | |
</tr> | |
</tfoot> | |
<tbody> | |
<tr>'; | |
// 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 IN ( $post_types_in ) 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 IN ( $post_types_in ) 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; | |
} | |
} | |
// See how much we should pad in the beginning | |
$pad = calendar_week_mod( date( 'w', $unixmonth ) - $week_begins ); | |
if ( 0 != $pad ) | |
$calendar_output .= "\n\t\t" . '<td colspan="' . esc_attr( $pad ) . '" class="pad"> </td>'; | |
$daysinmonth = intval( date( 't', $unixmonth ) ); | |
for ( $day = 1 ; $day <= $daysinmonth ; ++$day ) { | |
if ( isset( $newrow ) && $newrow ) | |
$calendar_output .= "\n\t</tr>\n\t<tr>\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 .= '<td id="today">'; | |
else | |
$calendar_output .= '<td>'; | |
if ( in_array( $day, $daywithpost ) ) // any posts today? | |
$calendar_output .= '<a href="' . get_day_link( $thisyear, $thismonth, $day ) . "\" title=\"" . esc_attr( $ak_titles_for_day[$day] ) . "\">$day</a>"; | |
else | |
$calendar_output .= $day; | |
$calendar_output .= '</td>'; | |
if ( 6 == calendar_week_mod( date( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) | |
$newrow = true; | |
} | |
$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" . '<td class="pad" colspan="' . esc_attr( $pad ) . '"> </td>'; | |
$calendar_output .= "\n\t</tr>\n\t</tbody>\n\t</table>"; | |
$cache[$key] = $calendar_output; | |
wp_cache_set( 'get_calendar', $cache, 'calendar' ); | |
remove_filter( 'get_calendar', 'ucc_get_calendar_filter' ); | |
$output = apply_filters( 'get_calendar', $calendar_output ); | |
add_filter( 'get_calendar', 'ucc_get_calendar_filter' ); | |
if ( $echo ) | |
echo $output; | |
else | |
return $output; | |
} | |
function ucc_get_calendar_filter( $content ) { | |
$output = ucc_get_calendar( '', '', false ); | |
return $output; | |
} | |
add_filter( 'get_calendar', 'ucc_get_calendar_filter', 10, 2 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment