Make WordPress Core

Ticket #16173: calendar.2.diff

File calendar.2.diff, 18.7 KB (added by GautamGupta, 14 years ago)
  • wp-includes/default-widgets.php

     
    327327class WP_Widget_Calendar extends WP_Widget {
    328328
    329329        function WP_Widget_Calendar() {
    330                 $widget_ops = array('classname' => 'widget_calendar', 'description' => __( 'A calendar of your site’s posts') );
    331                 $this->WP_Widget('calendar', __('Calendar'), $widget_ops);
     330                $widget_ops = array( 'classname' => 'widget_calendar', 'description' => __( 'A calendar of your site’s posts' ) );
     331                $this->WP_Widget( 'calendar', __( 'Calendar' ), $widget_ops );
    332332        }
    333333
    334334        function widget( $args, $instance ) {
    335                 extract($args);
    336                 $title = apply_filters('widget_title', empty($instance['title']) ? ' ' : $instance['title'], $instance, $this->id_base);
     335                extract( $args );
     336
     337                $title              = apply_filters( 'widget_title', empty( $instance['title'] ) ? ' ' : $instance['title'], $instance, $this->id_base );
     338                $instance_post_type = $this->_get_instance_post_type( $instance );
     339
    337340                echo $before_widget;
     341
    338342                if ( $title )
    339                         echo $before_title . $title . $after_title;
    340                 echo '<div id="calendar_wrap">';
    341                 get_calendar();
    342                 echo '</div>';
     343                        echo $before_title . $title . $after_title; ?>
     344
     345                <div id="calendar_wrap">
     346
     347                        <?php get_calendar( true, true, $instance_post_type ); ?>
     348
     349                </div>
     350
     351                <?php
     352
    343353                echo $after_widget;
    344354        }
    345355
    346356        function update( $new_instance, $old_instance ) {
    347                 $instance = $old_instance;
    348                 $instance['title'] = strip_tags($new_instance['title']);
     357                $instance              = $old_instance;
     358                $instance['title']     = strip_tags( $new_instance['title'] );
     359                $instance['post_type'] = stripslashes( $new_instance['post_type'] );
    349360
    350361                return $instance;
    351362        }
    352363
    353364        function form( $instance ) {
    354                 $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
    355                 $title = strip_tags($instance['title']);
    356 ?>
    357                 <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
    358                 <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
    359 <?php
     365                $instance           = wp_parse_args( (array) $instance, array( 'title' => '' ) );
     366                $title              = strip_tags( $instance['title'] );
     367                $instance_post_type = $this->_get_instance_post_type( $instance );
     368                ?>
     369
     370                <p>
     371                        <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
     372                        <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
     373                </p>
     374
     375                <p>
     376                        <label for="<?php echo $this->get_field_id( 'post_type' ); ?>"><?php _e( 'Post Type:' ); ?></label>
     377                        <select class="widefat" id="<?php echo $this->get_field_id( 'post_type' ); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
     378
     379                                <?php foreach ( get_post_types( array(), 'objects' ) as $post_type ) :
     380                                        if ( !post_type_supports( $post_type->name, 'calendar' ) )
     381                                                continue;
     382                                        ?>
     383
     384                                        <option value="<?php echo esc_attr( $post_type->name ); ?>"<?php selected( $post_type->name, $instance_post_type ); ?>><?php echo $post_type->label; ?></option>
     385
     386                                <?php endforeach; ?>
     387
     388                        </select>
     389                </p>
     390
     391                <?php
    360392        }
     393
     394        function _get_instance_post_type( $instance ) {
     395                if ( !empty( $instance['post_type'] ) && post_type_exists( $instance['post_type'] ) && post_type_supports( $instance['post_type'], 'calendar' ) )
     396                        return $instance['post_type'];
     397
     398                return 'post';
     399        }
    361400}
    362401
    363402/**
  • wp-includes/general-template.php

     
    10711071 *
    10721072 * @param bool $initial Optional, default is true. Use initial calendar names.
    10731073 * @param bool $echo Optional, default is true. Set to false for return.
     1074 * @param string $post_type Optional, default is 'post'. Use to get a calendar
     1075 *                           of a custom post type
    10741076 */
    1075 function get_calendar($initial = true, $echo = true) {
     1077function get_calendar( $initial = true, $echo = true, $post_type = 'post' ) {
    10761078        global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
    10771079
     1080        // Check if the post type exists
     1081        if ( empty( $post_type ) || !post_type_exists( $post_type ) || !post_type_supports( $post_type, 'calendar' ) )
     1082                return false;
     1083
    10781084        $cache = array();
    10791085        $key = md5( $m . $monthnum . $year );
    10801086        if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) {
     
    10881094                }
    10891095        }
    10901096
    1091         if ( !is_array($cache) )
     1097        if ( !is_array( $cache ) )
    10921098                $cache = array();
    10931099
    10941100        // Quick check. If we have no posts at all, abort!
    10951101        if ( !$posts ) {
    1096                 $gotsome = $wpdb->get_var("SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1");
     1102                $gotsome = $wpdb->get_var( $wpdb->prepare( "SELECT 1 as test FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' LIMIT 1", $post_type ) );
    10971103                if ( !$gotsome ) {
    1098                         $cache[ $key ] = '';
     1104                        $cache[$key] = '';
    10991105                        wp_cache_set( 'get_calendar', $cache, 'calendar' );
    11001106                        return;
    11011107                }
    11021108        }
    11031109
    1104         if ( isset($_GET['w']) )
    1105                 $w = ''.intval($_GET['w']);
     1110        if ( isset( $_GET['w'] ) )
     1111                $w = ''.intval( $_GET['w'] );
    11061112
    11071113        // week_begins = 0 stands for Sunday
    1108         $week_begins = intval(get_option('start_of_week'));
     1114        $week_begins = intval( get_option( 'start_of_week' ) );
    11091115
    11101116        // Let's figure out when we are
    1111         if ( !empty($monthnum) && !empty($year) ) {
    1112                 $thismonth = ''.zeroise(intval($monthnum), 2);
    1113                 $thisyear = ''.intval($year);
    1114         } elseif ( !empty($w) ) {
     1117        if ( !empty( $monthnum ) && !empty( $year ) ) {
     1118                $thismonth = (string) zeroise( intval( $monthnum ), 2 );
     1119                $thisyear  = (string) intval( $year );
     1120        } elseif ( !empty( $w ) ) {
    11151121                // We need to get the month from MySQL
    1116                 $thisyear = ''.intval(substr($m, 0, 4));
    1117                 $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
    1118                 $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')");
    1119         } elseif ( !empty($m) ) {
    1120                 $thisyear = ''.intval(substr($m, 0, 4));
    1121                 if ( strlen($m) < 6 )
    1122                                 $thismonth = '01';
     1122                $thisyear = (string) intval( substr( $m, 0, 4 ) );
     1123                $d = ( ( $w - 1 ) * 7 ) + 6; //it seems MySQL's weeks disagree with PHP's
     1124                $thismonth = $wpdb->get_var( $wpdb->prepare( "SELECT DATE_FORMAT((DATE_ADD(%s, INTERVAL $d DAY) ), '%m')", $thisyear . '0101' ) );
     1125        } elseif ( !empty( $m ) ) {
     1126                $thisyear = (string) intval( substr( $m, 0, 4 ) );
     1127                if ( strlen( $m ) < 6 )
     1128                        $thismonth = '01';
    11231129                else
    1124                                 $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2);
     1130                        $thismonth = (string) zeroise( intval( substr( $m, 4, 2 ) ), 2 );
    11251131        } else {
    1126                 $thisyear = gmdate('Y', current_time('timestamp'));
    1127                 $thismonth = gmdate('m', current_time('timestamp'));
     1132                $thisyear  = gmdate( 'Y', current_time( 'timestamp' ) );
     1133                $thismonth = gmdate( 'm', current_time( 'timestamp' ) );
    11281134        }
    11291135
    1130         $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear);
    1131         $last_day = date('t', $unixmonth);
     1136        $unixmonth = mktime( 0, 0 , 0, $thismonth, 1, $thisyear );
     1137        $last_day  = date( 't', $unixmonth );
    11321138
    11331139        // Get the next and previous month and year with at least one post
    1134         $previous = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
    1135                 FROM $wpdb->posts
    1136                 WHERE post_date < '$thisyear-$thismonth-01'
    1137                 AND post_type = 'post' AND post_status = 'publish'
    1138                         ORDER BY post_date DESC
    1139                         LIMIT 1");
    1140         $next = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
    1141                 FROM $wpdb->posts
    1142                 WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
    1143                 AND post_type = 'post' AND post_status = 'publish'
    1144                         ORDER BY post_date ASC
    1145                         LIMIT 1");
     1140        $previous = $wpdb->get_row(
     1141                $wpdb->prepare(
     1142                        "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
     1143                                FROM $wpdb->posts
     1144                                WHERE post_date < %s
     1145                                AND post_type = %s AND post_status = 'publish'
     1146                                ORDER BY post_date DESC
     1147                                LIMIT 1",
     1148                        $thisyear . '-' . $thismonth . '-01',
     1149                        $post_type
     1150                )
     1151        );
    11461152
     1153        $next = $wpdb->get_row(
     1154                $wpdb->prepare(
     1155                        "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
     1156                                FROM $wpdb->posts
     1157                                WHERE post_date > %s
     1158                                AND post_type = %s AND post_status = 'publish'
     1159                                ORDER BY post_date ASC
     1160                                LIMIT 1",
     1161                        $thisyear . '-' . $thismonth . '-' . $last_day . ' 23:59:59',
     1162                        $post_type
     1163                )
     1164        );
     1165
    11471166        /* translators: Calendar caption: 1: month name, 2: 4-digit year */
    1148         $calendar_caption = _x('%1$s %2$s', 'calendar caption');
    1149         $calendar_output = '<table id="wp-calendar" summary="' . esc_attr__('Calendar') . '">
    1150         <caption>' . sprintf($calendar_caption, $wp_locale->get_month($thismonth), date('Y', $unixmonth)) . '</caption>
     1167        $calendar_caption = _x( '%1$s %2$s', 'calendar caption' );
     1168        $calendar_output  = '<table id="wp-calendar" summary="' . esc_attr__( 'Calendar' ) . '">
     1169        <caption>' . sprintf( $calendar_caption, $wp_locale->get_month( $thismonth ), date( 'Y', $unixmonth ) ) . '</caption>
    11511170        <thead>
    11521171        <tr>';
    11531172
    11541173        $myweek = array();
    11551174
    1156         for ( $wdcount=0; $wdcount<=6; $wdcount++ ) {
    1157                 $myweek[] = $wp_locale->get_weekday(($wdcount+$week_begins)%7);
     1175        for ( $wdcount=0; $wdcount <= 6; $wdcount++ ) {
     1176                $myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 );
    11581177        }
    11591178
    11601179        foreach ( $myweek as $wd ) {
    1161                 $day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd);
    1162                 $wd = esc_attr($wd);
     1180                $day_name         = ( true == $initial ) ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd );
     1181                $wd               = esc_attr( $wd );
    11631182                $calendar_output .= "\n\t\t<th scope=\"col\" title=\"$wd\">$day_name</th>";
    11641183        }
    11651184
     
    11701189        <tfoot>
    11711190        <tr>';
    11721191
    1173         if ( $previous ) {
    1174                 $calendar_output .= "\n\t\t".'<td colspan="3" id="prev"><a href="' . get_month_link($previous->year, $previous->month) . '" title="' . esc_attr( 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)))) . '">&laquo; ' . $wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)) . '</a></td>';
    1175         } else {
    1176                 $calendar_output .= "\n\t\t".'<td colspan="3" id="prev" class="pad">&nbsp;</td>';
    1177         }
     1192        if ( $previous )
     1193                $calendar_output .= "\n\t\t" . '<td colspan="3" id="prev"><a href="' . get_month_link( $previous->year, $previous->month ) . '" title="' . esc_attr( 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 ) ) ) ) . '">&laquo; ' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) . '</a></td>';
     1194        else
     1195                $calendar_output .= "\n\t\t" . '<td colspan="3" id="prev" class="pad">&nbsp;</td>';
    11781196
    1179         $calendar_output .= "\n\t\t".'<td class="pad">&nbsp;</td>';
     1197        $calendar_output .= "\n\t\t" . '<td class="pad">&nbsp;</td>';
    11801198
    1181         if ( $next ) {
    1182                 $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)) . ' &raquo;</a></td>';
    1183         } else {
    1184                 $calendar_output .= "\n\t\t".'<td colspan="3" id="next" class="pad">&nbsp;</td>';
    1185         }
     1199        if ( $next )
     1200                $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 ) ) . ' &raquo;</a></td>';
     1201        else
     1202                $calendar_output .= "\n\t\t" . '<td colspan="3" id="next" class="pad">&nbsp;</td>';
    11861203
    11871204        $calendar_output .= '
    11881205        </tr>
     
    11921209        <tr>';
    11931210
    11941211        // Get days with posts
    1195         $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
    1196                 FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
    1197                 AND post_type = 'post' AND post_status = 'publish'
    1198                 AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N);
     1212        $dayswithposts = $wpdb->get_results(
     1213                $wpdb->prepare(
     1214                        "SELECT DISTINCT DAYOFMONTH(post_date)
     1215                                FROM $wpdb->posts WHERE post_date >= %s
     1216                                AND post_type = %s AND post_status = 'publish'
     1217                                AND post_date <= %s",
     1218                        $thisyear . '-' . $thismonth . '-01 00:00:00',
     1219                        $post_type,
     1220                        $thisyear . '-' . $thismonth . '-' . $last_day . ' 23:59:59'
     1221                ),
     1222                ARRAY_N
     1223        );
    11991224        if ( $dayswithposts ) {
    12001225                foreach ( (array) $dayswithposts as $daywith ) {
    12011226                        $daywithpost[] = $daywith[0];
     
    12041229                $daywithpost = array();
    12051230        }
    12061231
    1207         if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'camino') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false)
     1232        if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false || stripos( $_SERVER['HTTP_USER_AGENT'], 'camino' ) !== false || stripos( $_SERVER['HTTP_USER_AGENT'], 'safari' ) !== false )
    12081233                $ak_title_separator = "\n";
    12091234        else
    12101235                $ak_title_separator = ', ';
    12111236
    12121237        $ak_titles_for_day = array();
    1213         $ak_post_titles = $wpdb->get_results("SELECT ID, post_title, DAYOFMONTH(post_date) as dom "
    1214                 ."FROM $wpdb->posts "
    1215                 ."WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' "
    1216                 ."AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59' "
    1217                 ."AND post_type = 'post' AND post_status = 'publish'"
     1238        $ak_post_titles    = $wpdb->get_results(
     1239                $wpdb->prepare(
     1240                        "SELECT ID, post_title, DAYOFMONTH(post_date) as dom
     1241                                FROM $wpdb->posts
     1242                                WHERE post_date >= %s
     1243                                AND post_date <= %s
     1244                                AND post_type = %s AND post_status = 'publish'",
     1245                        $thisyear . '-' . $thismonth . '-01 00:00:00',
     1246                        $thisyear . '-' . $thismonth . '-' . $last_day . ' 23:59:59',
     1247                        $post_type
     1248                )
    12181249        );
    12191250        if ( $ak_post_titles ) {
    12201251                foreach ( (array) $ak_post_titles as $ak_post_title ) {
    12211252
    12221253                                $post_title = esc_attr( apply_filters( 'the_title', $ak_post_title->post_title, $ak_post_title->ID ) );
    12231254
    1224                                 if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) )
     1255                                if ( empty( $ak_titles_for_day['day_'.$ak_post_title->dom] ) )
    12251256                                        $ak_titles_for_day['day_'.$ak_post_title->dom] = '';
    1226                                 if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one
     1257                                if ( empty( $ak_titles_for_day["$ak_post_title->dom"] ) ) // first one
    12271258                                        $ak_titles_for_day["$ak_post_title->dom"] = $post_title;
    12281259                                else
    12291260                                        $ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . $post_title;
     
    12321263
    12331264
    12341265        // See how much we should pad in the beginning
    1235         $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
     1266        $pad = calendar_week_mod( date( 'w', $unixmonth ) - $week_begins );
    12361267        if ( 0 != $pad )
    1237                 $calendar_output .= "\n\t\t".'<td colspan="'. esc_attr($pad) .'" class="pad">&nbsp;</td>';
     1268                $calendar_output .= "\n\t\t".'<td colspan="'. esc_attr( $pad ) .'" class="pad">&nbsp;</td>';
    12381269
    1239         $daysinmonth = intval(date('t', $unixmonth));
     1270        $daysinmonth = intval( date( 't', $unixmonth ) );
    12401271        for ( $day = 1; $day <= $daysinmonth; ++$day ) {
    1241                 if ( isset($newrow) && $newrow )
     1272                if ( isset( $newrow ) && $newrow )
    12421273                        $calendar_output .= "\n\t</tr>\n\t<tr>\n\t\t";
    12431274                $newrow = false;
    12441275
    1245                 if ( $day == gmdate('j', current_time('timestamp')) && $thismonth == gmdate('m', current_time('timestamp')) && $thisyear == gmdate('Y', current_time('timestamp')) )
     1276                if ( $day == gmdate( 'j', current_time( 'timestamp' ) ) && $thismonth == gmdate( 'm', current_time( 'timestamp' ) ) && $thisyear == gmdate( 'Y', current_time( 'timestamp' ) ) )
    12461277                        $calendar_output .= '<td id="today">';
    12471278                else
    12481279                        $calendar_output .= '<td>';
    12491280
    1250                 if ( in_array($day, $daywithpost) ) // any posts today?
    1251                                 $calendar_output .= '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"" . esc_attr($ak_titles_for_day[$day]) . "\">$day</a>";
     1281                if ( in_array( $day, $daywithpost ) ) // any posts today?
     1282                                $calendar_output .= '<a href="' . get_day_link( $thisyear, $thismonth, $day ) . "\" title=\"" . esc_attr( $ak_titles_for_day[$day] ) . "\">$day</a>";
    12521283                else
    12531284                        $calendar_output .= $day;
    12541285                $calendar_output .= '</td>';
    12551286
    1256                 if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) )
     1287                if ( 6 == calendar_week_mod( date( 'w', mktime( 0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins ) )
    12571288                        $newrow = true;
    12581289        }
    12591290
    1260         $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins);
     1291        $pad = 7 - calendar_week_mod( date( 'w', mktime( 0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins );
    12611292        if ( $pad != 0 && $pad != 7 )
    1262                 $calendar_output .= "\n\t\t".'<td class="pad" colspan="'. esc_attr($pad) .'">&nbsp;</td>';
     1293                $calendar_output .= "\n\t\t".'<td class="pad" colspan="' . esc_attr( $pad ) . '">&nbsp;</td>';
    12631294
    12641295        $calendar_output .= "\n\t</tr>\n\t</tbody>\n\t</table>";
    12651296
    1266         $cache[ $key ] = $calendar_output;
     1297        $cache[$key] = $calendar_output;
    12671298        wp_cache_set( 'get_calendar', $cache, 'calendar' );
    12681299
    12691300        if ( $echo )
    1270                 echo apply_filters( 'get_calendar',  $calendar_output );
     1301                echo apply_filters( 'get_calendar', $calendar_output );
    12711302        else
    1272                 return apply_filters( 'get_calendar',  $calendar_output );
     1303                return apply_filters( 'get_calendar', $calendar_output );
    12731304
    12741305}
    12751306
  • wp-includes/post.php

     
    2626                'hierarchical' => false,
    2727                'rewrite' => false,
    2828                'query_var' => false,
    29                 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
     29                'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats', 'calendar' ),
    3030        ) );
    3131
    3232        register_post_type( 'page', array(
     
    12091209 *
    12101210 * All features are directly associated with a functional area of the edit screen, such as the
    12111211 * editor or a meta box: 'title', 'editor', 'comments', 'revisions', 'trackbacks', 'author',
    1212  * 'excerpt', 'page-attributes', 'thumbnail', and 'custom-fields'.
     1212 * 'excerpt', 'page-attributes', 'thumbnail', 'calendar' and 'custom-fields'.
    12131213 *
    12141214 * Additionally, the 'revisions' feature dictates whether the post type will store revisions,
     1215 * the 'calendar' feature will show the post type in the select box in the calendar widget,
    12151216 * and the 'comments' feature dicates whether the comments count will show on the edit screen.
    12161217 *
    12171218 * @since 3.0.0