Publicações futuras do arquivo de data

Estou usando cpt para events e preciso exibi-los em um calendar. A maioria dos events é futuro. Eu consegui consultar as corretas por post_status no arquivo, mas eu preciso fazer o mesmo no calendar. Estou usando o plugin chamado “Custom Post Type Calendar Widget” – plugin muito simples que cria calendar para cpt como widget por consulta diretamente do mysql. Eu invadi as minhas necessidades:

   

<label for="get_field_id('title'); ?>"> <input class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />

<input id="get_field_id('posttype_enabled'); ?>" name="get_field_name('posttype_enabled'); ?>" type="checkbox" value="1" /> <label for="get_field_id('posttype_enabled'); ?>">

<label for="get_field_id('posttype'); ?>"> <select name="get_field_name('posttype'); ?>" id="get_field_id('posttype'); ?>" class="widefat"> <?php foreach ($posttypes as $option) { echo 'name . '" id="' . $option->name . '"', $posttype == $option->name ? ' selected="selected"' : '', '>', $option->name, ''; } ?>

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; } $post_types_key = implode( '' , $post_types ); $post_types = "'" . implode( "' , '" , $post_types ) . "'"; $cache = array(); $key = md5( $m . $monthnum . $year . $post_types_key ); 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(); // 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 ) AND post_status IN ( 'publish','future' ) 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 ) get_row( "SELECT DISTINCT MONTH( post_date ) AS month , YEAR( post_date ) AS year FROM $wpdb->posts WHERE post_date 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 ) AND post_status IN ( 'publish','future' ) 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 = ''; $myweek = array(); for ( $wdcount = 0 ; $wdcount 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"; } $calendar_output .= ' '; // print_r(cptda_get_month_link( $previous->year , $previous->month , 'events')); // if ( $previous ) { $calendar_output .= "\n\t\t" . ''; if ( $previous ) { $calendar_output .= "\n\t\t" . ''; } else { $calendar_output .= "\n\t\t" . ''; } $calendar_output .= "\n\t\t" . ''; // if ( $next ) { $calendar_output .= "\n\t\t" . ''; if ( $next ) { $calendar_output .= "\n\t\t" . ''; } else { $calendar_output .= "\n\t\t" . ''; } $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 IN ( $post_types ) AND post_status IN ( 'publish','future' )"); if ( $dayswithposts ) { foreach ($dayswithposts as $key => $daywith) { if (is_object($daywith)) { foreach ($daywith as $key => $value) { $daywithpost[] = $value; } }else{ $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_type IN ( $post_types ) AND post_status IN ( 'publish','future' )" ); if ( $ak_post_titles ) { $links = array(); foreach ( $ak_post_titles as $ak_post_title ) { if (count($ak_post_titles) > 1) { $links[] = get_post_permalink($ak_post_title->ID); }else{ $link = array(get_post_permalink($ak_post_title->ID)); } $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" . ''; $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 .= ''; $calendar_output .= $model; }else{ $calendar_output .= ">$day"; $calendar_output .= ''; } }else{ $calendar_output .= $day; $calendar_output .= ''; } 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" . ''; $calendar_output .= "\n\t\n\t\n\t
' . sprintf( $calendar_caption , $wp_locale->get_month( $thismonth ) , date( 'Y' , $unixmonth ) ) . '
$day_name
year , $previous->month , 'events') . '" 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 ) ) . '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 ) ) . '  year , $next->month , 'events') . '" 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 ) ) . ' »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 ) ) . ' » 
 
'; else $calendar_output .= ''; if ( in_array( $day , $daywithpost ) ){ // any posts today? if(isset($link)){ $calendar_output .= ' $onelink) { $calendar_output .= $onelink; if ($key == count($link)) { $calendar_output .= ' , '; } } $calendar_output .= '\" '; }else{ $calendar_output .= '"; $model .= ""; $calendar_output .= ' 
"; $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 );
  • principalmente, mudei o status de publicação de ‘publicar’ para uma série de publicações e futuras.

Funciona bem – todas as postagens futuras deste mês são mostradas, mas enquanto eu tento carregar o arquivo de data do mês que vem eu recebo 404.

Eu tentei usar este plugin: https://github.com/keesiemeijer/custom-post-type-date-archives que funciona, mas suas regras de reescrita causaram muitos problemas em algumas outras reescritas que fiz.

então eu acho que o problema do próximo mês pode ser resolvido com algumas regras de reescrita. Alguma ideia ou experiência sobre o assunto?

Solutions Collecting From Web of "Publicações futuras do arquivo de data"