wpseek.com
Eine auf WordPress spezialiserte Suchmaschine für Entwickler und Theme-Autoren
get_calendar › WordPress Function
Seit1.0.0
Veraltetn/v
› get_calendar ( $args = array() )
Parameter: |
|
Gibt zurück: |
|
Definiert in: |
|
Codex: | |
Changelog: |
|
Displays calendar with days that have posts as links.
The calendar is cached, which will be retrieved, if it exists. If there are no posts for the month, then it will not be displayed.Quellcode
function get_calendar( $args = array() ) { global $wpdb, $m, $monthnum, $year, $wp_locale, $posts; $defaults = array( 'initial' => true, 'display' => true, 'post_type' => 'post', ); $original_args = func_get_args(); $args = array(); if ( ! empty( $original_args ) ) { if ( ! is_array( $original_args[0] ) ) { if ( isset( $original_args[0] ) && is_bool( $original_args[0] ) ) { $defaults['initial'] = $original_args[0]; } if ( isset( $original_args[1] ) && is_bool( $original_args[1] ) ) { $defaults['display'] = $original_args[1]; } } else { $args = $original_args[0]; } } /** * Filter the `get_calendar` function arguments before they are used. * * @since 6.8.0 * * @param array $args { * Optional. Arguments for the `get_calendar` function. * * @type bool $initial Whether to use initial calendar names. Default true. * @type bool $display Whether to display the calendar output. Default true. * @type string $post_type Optional. Post type. Default 'post'. * } * @return array The arguments for the `get_calendar` function. */ $args = apply_filters( 'get_calendar_args', wp_parse_args( $args, $defaults ) ); $key = md5( $m . $monthnum . $year ); $cache = wp_cache_get( 'get_calendar', 'calendar' ); if ( $cache && is_array( $cache ) && isset( $cache[ $key ] ) ) { /** This filter is documented in wp-includes/general-template.php */ $output = apply_filters( 'get_calendar', $cache[ $key ], $args ); if ( $args['display'] ) { echo $output; return; } return $output; } if ( ! is_array( $cache ) ) { $cache = array(); } $post_type = $args['post_type']; if ( ! post_type_exists( $post_type ) ) { $post_type = 'post'; } // Quick check. If we have no posts at all, abort! if ( ! $posts ) { $prepared_query = $wpdb->prepare( "SELECT 1 as test FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' LIMIT 1", $post_type ); $gotsome = $wpdb->get_var( $prepared_query ); if ( ! $gotsome ) { $cache[ $key ] = ''; wp_cache_set( 'get_calendar', $cache, 'calendar' ); return; } } if ( isset( $_GET['w'] ) ) { $w = (int) $_GET['w']; } // week_begins = 0 stands for Sunday. $week_begins = (int) get_option( 'start_of_week' ); // Let's figure out when we are. if ( ! empty( $monthnum ) && ! empty( $year ) ) { $thismonth = zeroise( (int) $monthnum, 2 ); $thisyear = (int) $year; } elseif ( ! empty( $w ) ) { // We need to get the month from MySQL. $thisyear = (int) substr( $m, 0, 4 ); // It seems MySQL's weeks disagree with PHP's. $d = ( ( $w - 1 ) * 7 ) + 6; $thismonth = $wpdb->get_var( "SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')" ); } elseif ( ! empty( $m ) ) { $thisyear = (int) substr( $m, 0, 4 ); if ( strlen( $m ) < 6 ) { $thismonth = '01'; } else { $thismonth = zeroise( (int) substr( $m, 4, 2 ), 2 ); } } else { $thisyear = current_time( 'Y' ); $thismonth = current_time( 'm' ); } $unixmonth = mktime( 0, 0, 0, $thismonth, 1, $thisyear ); $last_day = gmdate( 't', $unixmonth ); // Get the next and previous month and year with at least one post. $previous_prepared_query = $wpdb->prepare( "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year FROM $wpdb->posts WHERE post_date < '$thisyear-$thismonth-01' AND post_type = %s AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1", $post_type ); $previous = $wpdb->get_row( $previous_prepared_query ); $next_prepared_query = $wpdb->prepare( "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year FROM $wpdb->posts WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59' AND post_type = %s AND post_status = 'publish' ORDER BY post_date ASC LIMIT 1", $post_type ); $next = $wpdb->get_row( $next_prepared_query ); /* 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" class="wp-calendar-table"> <caption>' . sprintf( $calendar_caption, $wp_locale->get_month( $thismonth ), gmdate( '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 = $args['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\" aria-label=\"$wd\">$day_name</th>"; } $calendar_output .= ' </tr> </thead> <tbody> <tr>'; $daywithpost = array(); // Get days with posts. $dayswithposts_prepared_query = $wpdb->prepare( "SELECT DISTINCT DAYOFMONTH(post_date) FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' AND post_type = %s AND post_status = 'publish' AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", $post_type ); $dayswithposts = $wpdb->get_results( $dayswithposts_prepared_query, ARRAY_N ); if ( $dayswithposts ) { foreach ( (array) $dayswithposts as $daywith ) { $daywithpost[] = (int) $daywith[0]; } } // See how much we should pad in the beginning. $pad = calendar_week_mod( (int) gmdate( 'w', $unixmonth ) - $week_begins ); if ( 0 != $pad ) { $calendar_output .= "\n\t\t" . '<td colspan="' . esc_attr( $pad ) . '" class="pad"> </td>'; } $newrow = false; $daysinmonth = (int) gmdate( '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 ( current_time( 'j' ) == $day && current_time( 'm' ) == $thismonth && current_time( 'Y' ) == $thisyear ) { $calendar_output .= '<td id="today">'; } else { $calendar_output .= '<td>'; } if ( in_array( $day, $daywithpost, true ) ) { // Any posts today? $date_format = gmdate( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) ); /* translators: Post calendar label. %s: Date. */ $label = sprintf( __( 'Posts published on %s' ), $date_format ); $calendar_output .= sprintf( '<a href="%s" aria-label="%s">%s</a>', get_day_link( $thisyear, $thismonth, $day ), esc_attr( $label ), $day ); } else { $calendar_output .= $day; } $calendar_output .= '</td>'; if ( 6 == calendar_week_mod( (int) gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) { $newrow = true; } } $pad = 7 - calendar_week_mod( (int) gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ); if ( 0 != $pad && 7 != $pad ) { $calendar_output .= "\n\t\t" . '<td class="pad" colspan="' . esc_attr( $pad ) . '"> </td>'; } $calendar_output .= "\n\t</tr>\n\t</tbody>"; $calendar_output .= "\n\t</table>"; $calendar_output .= '<nav aria-label="' . __( 'Previous and next months' ) . '" class="wp-calendar-nav">'; if ( $previous ) { $calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-prev"><a href="' . get_month_link( $previous->year, $previous->month ) . '">« ' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) . '</a></span>'; } else { $calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-prev"> </span>'; } $calendar_output .= "\n\t\t" . '<span class="pad"> </span>'; if ( $next ) { $calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-next"><a href="' . get_month_link( $next->year, $next->month ) . '">' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $next->month ) ) . ' »</a></span>'; } else { $calendar_output .= "\n\t\t" . '<span class="wp-calendar-nav-next"> </span>'; } $calendar_output .= ' </nav>'; $cache[ $key ] = $calendar_output; wp_cache_set( 'get_calendar', $cache, 'calendar' ); /** * Filters the HTML calendar output. * * @since 3.0.0 * @since 6.8.0 New argument $args added, with backward compatibility. * * @param string $calendar_output HTML output of the calendar. * @param array $args { * Optional. Array of display arguments. * * @type bool $initial Whether to use initial calendar names. Default true. * @type bool $display Whether to display the calendar output. Default true. * @type string $post_type Optional. Post type. Default 'post'. * } */ $calendar_output = apply_filters( 'get_calendar', $calendar_output, $args ); if ( $args['display'] ) { echo $calendar_output; return; } return $calendar_output; }