tested WordPress3.8
<div><?php /** * Template Name: Calendar test * * Event Calendar for WordPress3.8 * base code:http://wpxtreme.jp/event-calendar-with-wordpress */ $cache= false;// 実用にする場合は、trueがお勧め $result= get_transient( 'my_event_calendar_posts' ); if ( $result !== false && $cache== true ) { echo $result; }else{ global $wpdb; $link= ''; $category_ids= '174'; //conma separated ids $output= get_calendar(true, false); if ( preg_match_all( '@<td([^>]*)><a href="' . home_url() . '/([^0-9]*)?([0-9/]+)?([^"]*)" title="[^"]*?">([0-9]+?)</a></td>@i', $output, $matches ) ) { /* $maches に、カレンダー内のリンクをスクレイピングして溜め込む*/ foreach($matches[3] as $key=> $match){ /* URL中の 数字と/で構成される 部分を日付だとみなして、値を取得*/ $date = preg_replace('@/@', '', $match ); $year = substr($date, 0, 4); // 年 $month= substr($date, 4, 2); // 月 $day = substr($date, 6, 2); // 日 /* 日付として扱えそうでないなら、白旗を揚げる*/ if ( strlen( (string) $year) !== 4 or !is_numeric( $year ) ) { wp_die( $year.'投稿年が取得できませんでした' );} if ( strlen( (string) $month ) !== 2 or !is_numeric( $month ) ) { wp_die( '投稿月が取得できませんでした' );} if ( strlen( (string) $day ) !== 2 or !is_numeric( $day ) ) { wp_die( '投稿日が取得できませんでした' );} /* リンクをmd5に置換する 正規表現で拾っているのは、もともとカレンダーが持っているリンクで、カテゴリを指定したリンクだけとは限らない、 使わないリンクは、後で、一括して削除できるようにmd5にしておく */ $output= str_replace( $matches[0][ $key ], md5( $matches[0][ $key ] ), $output ); $posts= $wpdb->get_results(" SELECT ID, post_title FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID= $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id= $wpdb->term_taxonomy.term_taxonomy_id) WHERE YEAR(post_date)= '$year' AND MONTH(post_date)= '$month' AND DAY(post_date)= '$day' AND post_type= 'post' AND post_status= 'publish' AND $wpdb->term_taxonomy.taxonomy= 'category' AND $wpdb->term_taxonomy.term_id IN ($category_ids) ORDER BY post_date DESC"); foreach($posts as $post_key=>$post){ $link .= '<a class="post" href="'. get_permalink($post->ID) . '">' . $post->post_title . '</a>'; if( in_category( array($category_ids) ) and !empty( $link ) ) { /* リンクすべきものは、置換する */ $output= str_replace(md5($matches[0][ $key ]), '<td class="event" ' . $matches[1][ $key ] . '>' . $day . $link.'</td>' , $output) ; } } } } /* 無用なリンクは、一括して削除*/ $output= preg_replace( '![0-9A-f]{32}!', '' , $output ); echo $output; delete_transient( 'my_event_calendar_posts' ); set_transient( 'my_event_calendar_posts',$output, 3600 ); } ?> <style scoped> #wp-calendar caption, #wp-calendar{width:auto;background:#000;} #wp-calendar caption, #wp-calendar a{color:#fff;} #wp-calendar caption{ text-align:center; width:auto; } #wp-calendar th{ background-color:#333; border:1px solid #231F1D; font-style:normal; height:2.5em; text-align:center; width:85px; } #wp-calendar td{ color:#444; background-color:#1D1A18; border:1px solid #231F1D; height:auto; padding:3px; text-align:center; vertical-align:top; font-size:36px; font-family:Georgia, "Times New Roman", Times, serif; font-style:italic; } #wp-calendar td.event{color:#888;} #wp-calendar td a{ display:block; font-size:12px; font-style:normal; margin:.5em 0; text-align:left; } #wp-calendar td.pad{background-color:transparent;} // カレンダー上で日付がない箇所 #wp-calendar tfoot{display:none;} // 前後月へのリンク </style> </div>