defaults = TimeMachine::defaults();
parent::__construct(
‘time-machine’, // Base ID
__( ‘Time Machine’, ‘tm’ ), // Name
array( ‘description’ => __( ‘List posts published in past relative to current date’, ‘tm’ ), ) // Args
);
} // eom __construct
/**
* Front-end display of widget.
*
* @see WP_Widget::widget()
*
* @param array $args Widget arguments.
* @param array $instance Saved values from database.
*/
public function widget( $args, $instance )
{
// get globals
global $wpdb;
// get WP timezone and set that timezone in PHP environment for calculations
// fallback to UTC
date_default_timezone_set( get_option( “timezone_string”, “UTC” ) );
// some constants
$this_year = $last_year = date( “Y” );
$range = $or = $widget_title_prefix = $widget_title_suffix = “”;
// Start SQL QUERY
$sql = “
SELECT ID, post_title, post_date, post_excerpt, comment_count
FROM $wpdb->posts
WHERE post_status=’publish’
“;
// include pages?
if ( $instance[‘exclude_pages’] ) {
$sql .= ” AND post_type = ‘post’”;
} else {
$sql .= ” AND post_type IN( ‘post’, ‘page’ )”;
}
// include private pages?
if ( !$instance[‘private’] ) {
$sql .= ” AND `post_password` = ””;
}
// exclude current year?
if ( $instance[‘exclude_current’] ) {
$sql .= ” AND CAST(`post_date` AS char) NOT LIKE ‘${this_year}-%’”;
} else {
// increase last year for query
++$last_year;
}
// offset
$sql .= ” AND “;
if ( $instance[‘range’] != ‘none’ ) {
// get through years since 2002 to current (or last) year
for ( $year = 2002; $year < $last_year; ++$year ) {// define base day (current date and time except year)
$date_base = $year . "-" . date( "m-d H:i:s" );// define theoretical before and after date range
$date_before = date( "Y-m-d H:i:s", strtotime($date_base. ' -' . $instance['rangenum'] . ' ' . $instance['range']) );
$date_after = date( "Y-m-d H:i:s", strtotime($date_base. ' +' . $instance['rangenum'] . ' ' . $instance['range']) );// decide requested before and after date range
if ( $instance['rangetype'] == 'before' ) {
// range only before
$date_start = $date_before;
$date_end = $date_base;
} else if ( $instance['rangetype'] == 'after' ) {
// range only after
$date_start = $date_base;
$date_end = $date_after;
} else {
// range before till after
$date_start = $date_before;
$date_end = $date_after;
}// append new range
$range .= $or . "`post_date` BETWEEN '$date_start' AND '$date_end'";
$or = " OR ";} // for $year$sql .= "( $range )";// compose widget title tooltip
$widget_title_prefix = "“;
$widget_title_suffix = ““;
} else {
// single range
$sql .= “CAST(`post_date` AS char) LIKE ‘%-” . date( “m-d” ) . ” %’”;
$widget_title_prefix = ““;
$widget_title_suffix = ““;
}
// number of posts
$sql .= ” LIMIT ” .$instance[‘posts’];
// execute SQL QUERY
$r = $wpdb->get_results( $sql, OBJECT );
// flush SQL query
$wpdb->flush();
// display widget if no articles?
if ( empty($r) && ! $instance[‘showifno’] )
return;
$out = ”;
$out .= $args[‘before_widget’];
if ( ! empty( $instance[‘title’] ) ) {
$out .= $args[‘before_title’];
$out .= $widget_title_prefix;
$out .= apply_filters( ‘widget_title’, $instance[‘title’] );
$out .= $widget_title_suffix;
$out .= $args[‘after_title’];
}
// start real widget content here
$out .= “
“; // show message if no articles
if ( empty( $r ) ) {
$out .= $instance[‘message’];
} else {
// we have articles, so compose content
foreach ( $r as $p ) {
$out .= “
- “;
$out .= “” . substr( $p->post_date, 0, 4 ) . “: “; // post date (make it optional)
$out .= “ID ) . “\” rel=\”nofollow\” title=\”” . __( “Published at”, “tm” ) . ” ” . $p->post_date . “\” class=\”article-title\”>” . $p->post_title . ““; // what about comments?
if ( $instance[‘display_commentnum’] ) {
$out .= ” (“;
$out .= $p->comment_count;
$out .= “)”;
}
// do we need excerpt?
if ( $instance[‘excerpt’] && ! empty( $p->post_excerpt ) ) {
$out .= html_entity_decode($instance[‘excerpt_before’]);
if ( $instance[‘excerpt_length’] && mb_strlen($p->post_excerpt) > ($instance[‘excerpt_length’]+1) ) {
$out .= $this->substr_utf8($p->post_excerpt, 0, $instance[‘excerpt_length’]).”…”;
} else {
$out .= $p->post_excerpt;
}
$out .= html_entity_decode($instance[‘excerpt_after’]);
}
$out .= “
“;
} // foreach $r
}
$out .= “
“;
$out .= $args[‘after_widget’];
echo $out;
} // eom widget
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance ) {
$title = ! empty( $instance[‘title’] ) ? $instance[‘title’] : $this->defaults[‘title’];
$message = ! empty( $instance[‘message’] ) ? $instance[‘message’] : $this->defaults[‘message’];
$posts = ! empty( $instance[‘posts’] ) ? $instance[‘posts’] : $this->defaults[‘posts’];
$showifno = ! empty( $instance[‘showifno’] ) ? $instance[‘showifno’] : ”;
$private = ! empty( $instance[‘private’] ) ? $instance[‘private’] : ”;
$exclude_pages = ! empty( $instance[‘exclude_pages’] ) ? $instance[‘exclude_pages’] : ”;
$exclude_current = ! empty( $instance[‘exclude_current’] ) ? $instance[‘exclude_current’] : ”;
$display_commentnum = ! empty( $instance[‘display_commentnum’] ) ? $instance[‘display_commentnum’] : ”;
$range = ! empty( $instance[‘range’] ) ? $instance[‘range’] : $this->defaults[‘range’];
$rangenum = ! empty( $instance[‘rangenum’] ) ? $instance[‘rangenum’] : $this->defaults[‘rangenum’];
$rangetype = ! empty( $instance[‘rangetype’] ) ? $instance[‘rangetype’] : $this->defaults[‘rangetype’];
$excerpt = ! empty( $instance[‘excerpt’] ) ? $instance[‘excerpt’] : ”;
$excerpt_cut = ! empty( $instance[‘excerpt_cut’] ) ? $instance[‘excerpt_cut’] : ”;
$excerpt_before = ! empty( $instance[‘excerpt_before’] ) ? $instance[‘excerpt_before’] : $this->defaults[‘excerpt_before’];
$excerpt_after = ! empty( $instance[‘excerpt_after’] ) ? $instance[‘excerpt_after’] : $this->defaults[‘excerpt_after’];
$excerpt_length = ! empty( $instance[‘excerpt_length’] ) ? $instance[‘excerpt_length’] : $this->defaults[‘excerpt_length’];
?>
get_field_id( ‘posts’ ); ?>”>:
get_field_id( ‘showifno’ ); ?>”>
id=”get_field_id( ‘showifno’ ); ?>” name=”get_field_name( ‘showifno’ ); ?>” type=”checkbox” value=”1″>
id=”get_field_id( ‘private’ ); ?>” name=”get_field_name( ‘private’ ); ?>” type=”checkbox” value=”1″>
id=”get_field_id( ‘exclude_pages’ ); ?>” name=”get_field_name( ‘exclude_pages’ ); ?>” type=”checkbox” value=”1″>
id=”get_field_id( ‘exclude_current’ ); ?>” name=”get_field_name( ‘exclude_current’ ); ?>” type=”checkbox” value=”1″>
id=”get_field_id( ‘display_commentnum’ ); ?>” name=”get_field_name( ‘display_commentnum’ ); ?>” type=”checkbox” value=”1″>
id=”get_field_id( ‘excerpt’ ); ?>” name=”get_field_name( ‘excerpt’ ); ?>” type=”checkbox” value=”1″>
get_field_id( ‘excerpt_cut’ ); ?>”>
id=”get_field_id( ‘excerpt_cut’ ); ?>” name=”get_field_name( ‘excerpt_cut’ ); ?>” type=”checkbox” value=”1″>