Last active
January 3, 2016 00:09
-
-
Save webspace-jp/8381243 to your computer and use it in GitHub Desktop.
コンパクトな月別アーカイブ表示ウィジェットを追加するプラグイン
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: [ws] compact archive | |
Plugin URI: http://webspace.jp/ | |
Description: コンパクトな月別アーカイブ表示ウィジェットを追加します | |
Author: hukinotou | |
Version: 0.1 | |
*/ | |
class ws_widget_compact_archives { | |
function __construct() { | |
add_action( 'widgets_init', array($this, 'ws_widgets_init') ); | |
} | |
function ws_widgets_init() { | |
register_widget("Widget_Compact_Archives"); | |
} | |
} | |
new ws_widget_compact_archives(); | |
class Widget_Compact_Archives extends WP_Widget { | |
function __construct() { | |
$widget_ops = array('classname' => 'widget_compact_archive', 'description' => '投稿のコンパクトな月別アーカイブ' ); | |
parent::__construct('compact_archives', 'コンパクトアーカイブ', $widget_ops); | |
} | |
function widget( $args, $instance ) { | |
extract($args); | |
$c = ! empty( $instance['count'] ) ? '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; | |
$this->get_archives(apply_filters('widget_archives_args', array('show_post_count' => $c))); | |
echo $after_widget; | |
} | |
function update( $new_instance, $old_instance ) { | |
$instance = $old_instance; | |
$new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '', 'count' => 0) ); | |
$instance['title'] = strip_tags($new_instance['title']); | |
$instance['count'] = $new_instance['count'] ? 1 : 0; | |
return $instance; | |
} | |
function form( $instance ) { | |
$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0) ); | |
$title = strip_tags($instance['title']); | |
$count = $instance['count'] ? '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 $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 | |
} | |
function get_archives($args = '') { | |
$defaults = array( | |
'limit' => '', | |
'before' => '', | |
'after' => '', | |
'show_post_count' => false, | |
'echo' => 1, | |
'order' => 'DESC', | |
); | |
$r = wp_parse_args( $args, $defaults ); | |
extract( $r, EXTR_SKIP ); | |
$arcresults = $this->get_monthly_archives_data($r); | |
$output = $this->build_html($r, $arcresults); | |
if ( $echo ) | |
echo $output; | |
else | |
return $output; | |
} | |
function get_monthly_archives_data($args) { | |
global $wpdb; | |
extract( $args, EXTR_SKIP ); | |
if ( '' != $limit ) { | |
$limit = absint($limit); | |
$limit = ' LIMIT '.$limit; | |
} | |
$order = strtoupper( $order ); | |
if ( $order !== 'ASC' ) | |
$order = 'DESC'; | |
//filters | |
$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $args ); | |
$join = apply_filters( 'getarchives_join', '', $args ); | |
// get data from DB | |
$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit"; | |
$key = md5($query); | |
$cache = wp_cache_get( 'get_archives2' , 'general'); | |
if ( !isset( $cache[ $key ] ) ) { | |
$arcresults = $wpdb->get_results($query); | |
$cache[ $key ] = $arcresults; | |
wp_cache_set( 'get_archives2', $cache, 'general' ); | |
} else { | |
$arcresults = $cache[ $key ]; | |
} | |
return $arcresults; | |
} | |
function build_html($args, $arcresults) { | |
extract( $args, EXTR_SKIP ); | |
if ( !$arcresults ) | |
return ''; | |
$cur_year = -1; | |
$afterafter = $after; | |
$output = '<ul>'; // (1) | |
foreach ( (array) $arcresults as $arcresult ) { | |
if ( $cur_year != $arcresult->year ) { | |
if ( $cur_year > 0 ) { | |
$output .= "</ul>"; // (/3) | |
$output .= "</li>\n"; // (/2) | |
} | |
$output .= "<li><span>" . $arcresult->year . "年</span>"; // (2) | |
$output .= "<ul>\n"; // (3) | |
$cur_year = $arcresult->year; | |
} | |
if ( $show_post_count ) | |
$after = " ({$arcresult->posts}){$afterafter}"; | |
$output .= "\t<li>" . $this->get_archives_link($arcresult->year, $arcresult->month, $before, $after) . "</li>\n"; | |
} | |
$output .= "</ul>"; // (/3) | |
$output .= "</li>\n"; // (/2) | |
$output .= "</ul>\n"; // (/1) | |
return $output; | |
} | |
function get_archives_link($year, $month, $before = '', $after = '') { | |
global $wp_locale; | |
$url = get_month_link($year, $month); | |
$url = esc_url($url); | |
$text = $wp_locale->get_month($month); | |
$text = wptexturize($text); | |
$title_text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($month), $year); | |
$title_text = esc_attr($title_text); | |
$link_html = "$before<a href='$url' title='$title_text'>$text</a>$after"; | |
$link_html = apply_filters( 'get_archives_link', $link_html ); | |
return $link_html; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment