WordPress カテゴリーごとの月別アーカイブ サンプルコード
WordPressには便利な月別のアーカイブ機能がありますが、これって全部の投稿を出しちゃうんですよね。
月別、カテゴリー別で、たとえば投稿を表示するページのサイドバーにウィジェットを出す。というのをやってみます。
やっていることはまとめると
- アーカイブの出力のリストの後に、GETパラメーターでカテゴリーIDを付与
- 受け取ったアーカイブのテンプレートで、カテゴリーIDを受け取り、カテゴリーのpostのみをループさせる
です。
下記はサンプルコードで、荒削りな部分もありますが、ご容赦ください!
functions.phpに下記を追加。
ウィジェット追加画面で、下記で追加したウィジェットを追加する。
/* カテゴリごとの月別アーカイブのリンクリスト作成 * wp-includes\default-widgets.php * class WP_Widget_Archives extends WP_Widget をコピーして作成 * */ class MyWidgetItem extends WP_Widget { function __construct() { $widget_ops = array('classname' => 'widget_archive', 'description' => 'カテゴリーごとの月別アーカイブ', 'name' => 'カテゴリーごとの月別アーカイブ' ); parent::__construct('archives', __('Archives'), $widget_ops); } function widget( $args, $instance ) { extract($args); $c = ! empty( $instance['count'] ) ? '1' : '0'; $d = ! empty( $instance['dropdown'] ) ? '1' : '0'; $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title'], $instance, $this->id_base); echo $before_widget; if ( $title ) echo $before_title . $title . $after_title; if ( $d ) { ?> <select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo esc_attr(__('Select Month')); ?></option> <?php wp_get_archives(apply_filters('widget_archives_dropdown_args', array('type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))); ?> </select> <?php } else { ?> <ul> <?php //カテゴリーテンプレートの場合 if($_GET['cat']){ $cat_id = $_GET['cat']; $cat_id = intval($cat_id); }elseif(!$cat_id){ $cats = get_the_category(); $cat_id = $cats[0]->cat_ID; } wp_get_archives_bycat(apply_filters('widget_archives_args', array('type' => 'monthly', 'show_post_count' => $c)), $cat_id); ?> </ul> <?php } echo $after_widget; } function update( $new_instance, $old_instance ) { $instance = $old_instance; $new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') ); $instance['title'] = strip_tags($new_instance['title']); $instance['count'] = $new_instance['count'] ? 1 : 0; $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0; return $instance; } function form( $instance ) { $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') ); $title = strip_tags($instance['title']); $count = $instance['count'] ? 'checked="checked"' : ''; $dropdown = $instance['dropdown'] ? 'checked="checked"' : ''; ?> <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> <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> <p> <input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="<?php echo $this->get_field_id('dropdown'); ?>" name="<?php echo $this->get_field_name('dropdown'); ?>" /> <label for="<?php echo $this->get_field_id('dropdown'); ?>"><?php _e('Display as dropdown'); ?></label> <br/> <input class="checkbox" type="checkbox" <?php echo $count; ?> id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>" /> <label for="<?php echo $this->get_field_id('count'); ?>"><?php _e('Show post counts'); ?></label> </p> <?php } } add_action('widgets_init', create_function('', 'return register_widget("MyWidgetItem");')); //上記のウィジェットから呼ばれる、アーカイブリスト出力の関数 function wp_get_archives_bycat($args = '', $cat_id =null) { global $wpdb, $wp_locale; $defaults = array( 'type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => false, 'echo' => 1, 'order' => 'DESC', ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( '' == $type ) $type = 'monthly'; if ( '' != $limit ) { $limit = absint($limit); $limit = ' LIMIT '.$limit; } $order = strtoupper( $order ); if ( $order !== 'ASC' ) $order = 'DESC'; $output = ''; //SQLを改造、 cat_idのカテゴリーの月別のリストを作る if ( 'monthly' == $type ) { $query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts INNER JOIN wp_term_relationships ON wp_posts.id = wp_term_relationships.object_id INNER JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id WHERE wp_term_taxonomy.term_taxonomy_id = $cat_id AND wp_term_taxonomy.taxonomy = 'category' AND wp_posts.post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit"; $key = md5($query); $cache = wp_cache_get( 'wp_get_archives' , 'general'); if ( !isset( $cache[ $key ] ) ) { $arcresults = $wpdb->get_results($query); $cache[ $key ] = $arcresults; wp_cache_set( 'wp_get_archives', $cache, 'general' ); } else { $arcresults = $cache[ $key ]; } if ( $arcresults ) { $afterafter = $after; foreach ( (array) $arcresults as $arcresult ) { $url = get_month_link( $arcresult->year, $arcresult->month ); /* translators: 1: month name, 2: 4-digit year */ $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year); //カテゴリーのIDを追加 $url .='&cat_id='.$cat_id; if ( $show_post_count ) $after = ' ('.$arcresult->posts.')' . $afterafter; $output .= get_archives_link($url, $text, $format, $before, $after); } } } if ( $echo ) echo $output; else return $output; }
archive.phpに下記を追加
<?php $cat_id = intval($_GET['cat_id']); $m = intval($_GET['m']); $year = substr($m, 0, 4); $month = substr($m, 5, 7); //ページネーションのために追加 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array('year' => $year, 'monthnum' => $month, 'cat' =>$cat_id, 'posts_per_page' => 20, 'paged' => $paged); query_posts( $args ); while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentytwelve_content_nav( 'nav-below' );
?>