<?php
// if this an Atom theme make a special widget for it ;)
if(class_exists('AtomWidget') && (defined('Atom::VERSION'))){
/*
* Atom Top Rated Widget
*
* @since 1.0
*/
class PostRatingsWidget extends AtomWidget{
/*
* Initialization
*
* @see AtomWidget::set and WP_Widget::__construct
*/
public function __construct(){
// register the widget and it's options
$this->set(array(
'id' => 'top-rated',
'title' => __('Top Rated', PostRatings::ID),
'description' => __('The highest rated posts on your site'),
'width' => 500,
'ajax_control' => 'get_top_rated',
// default widget options
'defaults' => array(
'title' => __('Top Rated', PostRatings::ID),
'sort' => 'bayesian_rating',
'order' => 'DESC',
'number' => 5,
'date_limit' => 0,
'post_type' => 'post',
'thumb_size' => 48,
'more' => true,
),
// one template definition only
'templates' => array(
'<a class="clear-block" href="{URL}" title="{TITLE}">',
' {THUMBNAIL}',
' <span class="tt">{TITLE} ({AVG_RATING})</span>',
' <span class="c1">',
' {CONTENT}',
' {BAYESIAN_RATING_BAR}',
' </span>',
'</a>',
),
));
// register thumbnail size
add_action('wp_loaded', array(&$this, 'setThumbSize'));
add_action('save_post', array(&$this, 'flushCache'));
add_action('deleted_post', array(&$this, 'flushCache'));
add_action('switch_theme', array(&$this, 'flushCache'));
add_action('rated_post', array(&$this, 'flushCache'));
}
public function setThumbSize($sizes){
// we need to process all instances because this function gets to run only once
$widget_options = get_option($this->option_name);
foreach((array)$widget_options as $instance => $options){
// identify instance
$id = "{$this->id_base}-{$instance}";
// register thumb size if the widget is active
if(!is_active_widget(false, $id, $this->id_base)) continue;
$options = wp_parse_args($options, AtomWidget::getObject($id)->getDefaults());
add_image_size($id, $options['thumb_size'], $options['thumb_size'], true);
}
return $sizes;
}
protected function getTopRated($args, &$more, $offset = 0){
global $post;
extract($args);
$posts = PostRatings()->getTopRated(array(
'post_type' => $post_type,
'number' => $number,
'sortby' => $sort,
'order' => in_array($order, array('ASC', 'DESC'), true) ? $order : 'DESC',
'offset' => $offset,
'date_limit' => $date_limit,
));
$output = array();
$max_rating = PostRatings()->getOptions('max_rating');
foreach($posts as $index => $post){
atom()->post = $post;
$output[] = '<li>';
$avg_rating = atom()->post->get('rating');
$bayesian_rating = atom()->post->get('bayesian_rating');
$bayesian_rating_bar = sprintf('<span class="rating" title="%s"><span class="bar" style="width:%d%%">%.2F</span></span>',
sprintf(__('%s out of 10', PostRatings::ID), $avg_rating), (($bayesian_rating / $max_rating) * 100), $avg_rating);
$avg_rating_bar = sprintf('<span class="rating" title="%s"><span class="bar" style="width:%d%%">%.2F</span></span>',
sprintf(__('%s out of 10', PostRatings::ID), $avg_rating), (($avg_rating / $max_rating) * 100), $avg_rating);
$fields = array(
'TITLE' => atom()->post->getTitle(),
'COMMENT_COUNT' => atom()->post->getCommentCount(),
'THUMBNAIL' => atom()->post->getThumbnail(str_replace('instance-', '', $id)),
'URL' => atom()->post->getURL(),
'CONTENT' => convert_smilies(atom()->post->getContent(150, array(
'allowed_tags' => Atom::SAFE_INLINE_TAGS,
'more' => '[…]',
))),
'AVG_RATING' => sprintf('%.2F', $avg_rating),
'BAYESIAN_RATING' => (int)(100 * ($bayesian_rating / $max_rating)),
'BAYESIAN_RATING_BAR' => $bayesian_rating_bar,
'AVG_RATING_BAR' => $avg_rating_bar,
'VOTES' => (int)atom()->post->get('votes'),
'MAX_RATING' => $max_rating,
'EXCERPT' => atom()->post->getContent('e'),
'DATE' => atom()->post->getDate('relative'),
'AUTHOR' => atom()->post->author->getName(),
'CATEGORIES' => strip_tags(atom()->post->getTerms('category')),
'TAGS' => strip_tags(atom()->post->getTerms()),
'VIEWS' => number_format_i18n(atom()->post->getViews()),
'INDEX' => isset($posts->current_post) ? ($posts->current_post + 1) : $index,
'ID' => atom()->post->getID(),
);
$fields = apply_filters('atom_widget_top_rated_keywords', $fields, atom()->post, $args);
// output template
$output[] = atom()->getBlockTemplate($template, $fields);
$output[] = '</li>';
}
atom()->resetCurrentPost();
return implode("\n", $output);
}
public function widget($args, $instance){
extract($args);
// check for a cached instance and display it if we have it
if($this->getAndDisplayCache($widget_id)) return;
$instance = wp_parse_args($instance, $this->getDefaults());
$instance['id'] = $this->id;
$title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
$posts = $this->getTopRated($instance, $next);
if(empty($posts))
return atom()->log("No rated posts found in {$args['widget_id']} ({$args['widget_name']}). Widget marked as inactive");
$output = $before_widget;
if($title)
$output .= $before_title.$title.$after_title;
$output .= "<ul class=\"menu fadeThis ratings clear-block\">\n{$posts}\n</ul>\n";
if($instance['more'] && $next && atom()->options('jquery')){
// Atom 2.0 r9 +
if(method_exists($this, 'getMoreLink')){
$output .= $this->getMoreLink($instance['number'], 'get_top_rated');
// for compatibility (deprecated from Atom 2.0 r9)
}else{
$output .= '<div class="fadeThis clear-block"><a href="#" class="more" data-count="'.$instance['number'].'">'.__('Show More', PostRatings::ID).'</a></div>';
$output .= $this->getShowMoreCtrl('get_top_rated');
}
}
$output .= $after_widget;
echo $output;
$this->addCache($widget_id, $output);
}
/*
* Saves the widget options
*
* @see WP_Widget::update
*/
public function update($new_instance, $old_instance){
$this->FlushCache();
extract($new_instance);
return array(
'title' => esc_attr($title),
'sort' => esc_attr($sort),
'order' => ($order !== 'DESC') ? 'ASC' : 'DESC',
'number' => min(max((int)$number, 1), 20),
'date_limit' => (int)$date_limit,
'post_type' => post_type_exists($post_type) ? $post_type : 'post',
'thumb_size' => (int)$thumb_size,
'more' => (bool)$more,
'template' => (isset($template) && current_user_can('edit_themes')) ? $template : $old_instance['template'],
) + $old_instance;
}
public function form($instance){
$instance = wp_parse_args($instance, $this->getDefaults());
$plugin_options = PostRatings()->getOptions();
?>
<div <?php $this->formClass(); ?>>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', PostRatings::ID); ?></label>
<input class="wide" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $instance['title']; ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('post_type'); ?>"><?php _e('Get most rated:', PostRatings::ID); ?></label>
<select id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
<?php foreach(get_post_types(array('public' => true)) as $type): ?>
<?php $object = get_post_type_object($type); ?>
<option <?php if(!in_array($type, $plugin_options['post_types'])): ?> disabled="disabled" <?php endif; ?> value="<?php echo $type; ?>" <?php selected($type, $instance['post_type']); ?>><?php echo $object->labels->name; ?></option>
<?php endforeach; ?>
</select>
</p>
<p>
<label for="<?php echo $this->get_field_id('sort'); ?>"><?php _e('Sort by:', PostRatings::ID); ?></label>
<select class="wide" id="<?php echo $this->get_field_id('sort'); ?>" name="<?php echo $this->get_field_name('sort'); ?>">
<option <?php selected('bayesian_rating', $instance['sort']); ?> value="bayesian_rating"><?php _e('Overall bayesian rating (score)', PostRatings::ID); ?></option>
<option <?php selected('rating', $instance['sort']); ?> value="rating"><?php _e('Average rating', PostRatings::ID); ?></option>
<option <?php selected('votes', $instance['sort']); ?> value="votes"><?php _e('Number of votes', PostRatings::ID); ?></option>
</select>
</p>
<p>
<label for="<?php echo $this->get_field_id('order'); ?>_desc">
<input id="<?php echo $this->get_field_id('order'); ?>_desc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="DESC" <?php checked('DESC', $instance['order']); ?> />
<?php _e('Descending', PostRatings::ID); ?>
</label>
<label for="<?php echo $this->get_field_id('order'); ?>_asc">
<input id="<?php echo $this->get_field_id('order'); ?>_asc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="ASC" <?php checked('ASC', $instance['order']); ?> />
<?php _e('Ascending', PostRatings::ID); ?>
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('date_limit'); ?>"><?php _e('Ignore posts older than:', PostRatings::ID); ?></label>
<input id="<?php echo $this->get_field_id('date_limit'); ?>" name="<?php echo $this->get_field_name('date_limit'); ?>" type="text" value="<?php echo $instance['date_limit']; ?>" size="3" /> <?php _e('days', PostRatings::ID); ?>
<br />
<small><?php _e('(0 to ignore date)', PostRatings::ID); ?></small>
</p>
<p>
<label for="<?php echo $this->get_field_id('thumb_size'); ?>"><?php _e('Thumbnail Size:', PostRatings::ID) ?></label>
<input type="text" size="3" id="<?php echo $this->get_field_id('thumb_size'); ?>" name="<?php echo $this->get_field_name('thumb_size'); ?>" value="<?php if (isset($instance['thumb_size'])) echo (int)$instance['thumb_size']; ?>" /> <em><?php _e('pixels', PostRatings::ID); ?></em>
</p>
<p>
<label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Limit:', PostRatings::ID); ?></label>
<input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $instance['number']; ?>" size="3" />
</p>
<p>
<input <?php if(!atom()->options('jquery')) echo "disabled=\"disabled\""; ?> type="checkbox" id="<?php echo $this->get_field_id('more'); ?>" name="<?php echo $this->get_field_name('more'); ?>"<?php checked($instance['more']); ?> />
<label for="<?php echo $this->get_field_id('more'); ?>" <?php if(!atom()->options('jquery')) echo "class=\"disabled\""; ?>><?php printf(__('Display %s Link', PostRatings::ID), '<code>'.__('Show More', PostRatings::ID).'</code>'); ?></label>
</p>
<?php if(current_user_can('edit_themes')): ?>
<div class="user-template">
<textarea class="wide code editor" id="<?php echo $this->get_field_id('template'); ?>" name="<?php echo $this->get_field_name('template'); ?>" rows="8" cols="28" mode="atom/html"><?php echo (empty($instance['template'])) ? format_to_edit($this->getTemplate()) : format_to_edit($instance['template']); ?></textarea>
<small>
<?php printf(__('Read the %s to see all available keywords.', PostRatings::ID), '<a href="'.Atom::THEME_DOC_URI.'" target="_blank">'.__('documentation', PostRatings::ID).'</a>'); ?>
</small>
</div>
<?php endif; ?>
<hr />
<p>
<em>
<?php
printf(__('<strong>Important:</strong> %1$s sized thumbnails have to be created if you just added this widget, or if you\'re changing the thumbnail size. Read more about thumbnail sizes %2$s', PostRatings::ID), (int)$instance['thumb_size'].'x'.(int)$instance['thumb_size'], '<a href="'.admin_url('themes.php?page='.ATOM.'#advanced').'">'.__('here', PostRatings::ID).'</a>'); ?>
</em>
</p>
</div>
<?php
}
}
// ...normal widget
}else{
/*
* Top Rated posts widget
*
* @since 1.0
*/
class PostRatingsWidget extends WP_Widget{
/*
* @since 1.0
* @see WP_Widget::__construct
*/
function __construct(){
$widget_ops = array('classname' => 'widget_top_rated', 'description' => __('The highest rated posts on your site', PostRatings::ID));
parent::__construct('top-rated', __('Top Rated', PostRatings::ID), $widget_ops);
add_action('save_post', array(&$this, 'flush_widget_cache'));
add_action('deleted_post', array(&$this, 'flush_widget_cache'));
add_action('switch_theme', array(&$this, 'flush_widget_cache'));
add_action('rated_post', array(&$this, 'flush_widget_cache'));
}
/*
* @since 1.0
* @see WP_Widget::widget
*/
public function widget($args, $instance){
global $post;
extract($args);
$cache = wp_cache_get('widget_top_rated', 'widget');
if(!is_array($cache))
$cache = array();
if(isset($cache[$widget_id])){
echo $cache[$widget_id];
return;
}
$output = array();
$options = PostRatings()->getOptions();
extract($options);
$title = apply_filters('widget_title', empty($instance['title']) ? __('Top Rated', PostRatings::ID) : $instance['title'], $instance, $this->id_base);
$number = min(max((int)$instance['number'], 1), 20);
$date_limit = min(max((int)$instance['date_limit'], 0), 999);
$post_type = post_type_exists($instance['post_type']) ? $instance['post_type'] : 'post';
$sort = isset($instance['sort']) ? esc_attr($instance['sort']) : 'bayesian_rating';
$output[] = $before_widget;
if($title)
$output[] = $before_title.$title.$after_title;
$posts = PostRatings()->getTopRated(array(
'post_type' => $post_type,
'number' => $number,
'sortby' => $sort,
'order' => in_array($instance['order'], array('ASC', 'DESC'), true) ? $instance['order'] : 'DESC',
'date_limit' => $date_limit,
));
if($posts){
$output[] = '<ul>';
foreach($posts as $post){
setup_postdata($post);
$output[] = '<li>';
$output[] = '<a href="'.get_permalink().'">'.get_the_title().'</a>';
if($sort === 'votes')
$output[] = '('.sprintf(_n('%d vote', '%d votes', $post->votes, PostRatings::ID), $post->votes, $post->votes).')';
elseif($sort === 'rating')
$output[] = sprintf('(%.2F)', $post->rating);
else
$output[] = sprintf('(%d%%)', (100 * ($post->bayesian_rating / $max_rating)));
$output[] = '</li>';
}
$output[] = '</ul>';
wp_reset_postdata();
}
$output[] = $after_widget;
$output = implode("\n", $output);
echo $output;
$cache[$widget_id] = $output;
wp_cache_set('widget_top_rated', $cache, 'widget');
}
/*
* @since 1.0
* @see WP_Widget::update
*/
public function update($new_instance, $old_instance){
extract($new_instance);
$instance = $old_instance;
$instance['title'] = esc_attr(strip_tags($title));
$instance['sort'] = esc_attr(strip_tags($sort));
$instance['order'] = in_array($order, array('ASC', 'DESC'), true) ? $order : 'DESC';
$instance['number'] = min(max((int)$number, 1), 20);
$instance['date_limit'] = min(max((int)$date_limit, 0), 999);
$instance['post_type'] = post_type_exists($post_type) ? $post_type : 'post';
$this->flush_widget_cache();
return $instance;
}
/*
* Clears widget cache.
* Should run after a post has been rated, deleted, edited etc...
*
* @since 1.0
*/
public function flush_widget_cache(){
wp_cache_delete('widget_top_rated', 'widget');
}
/*
* @since 1.0
* @see WP_Widget::form
*/
public function form($instance){
$plugin_options = PostRatings()->getOptions();
$title = isset($instance['title']) ? esc_attr($instance['title']) : __('Top Rated', PostRatings::ID);
$sort = isset($instance['sort']) ? esc_attr($instance['sort']) : 'bayesian_rating';
$order = in_array($instance['order'], array('ASC', 'DESC'), true) ? $instance['order'] : 'DESC';
$date_limit = isset($instance['date_limit']) ? (int)$instance['date_limit'] : 0;
$number = isset($instance['number']) ? min(max((int)$instance['number'], 1), 20) : 5;
$post_type = post_type_exists($instance['post_type']) ? $instance['post_type'] : 'post';
?>
<fieldset>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', PostRatings::ID); ?></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 $title; ?>" />
</p>
<p>
<label for="<?php echo $this->get_field_id('post_type'); ?>"><?php _e('Get most rated:', PostRatings::ID); ?></label>
<select class="widefat" id="<?php echo $this->get_field_id('post_type'); ?>" name="<?php echo $this->get_field_name('post_type'); ?>">
<?php foreach(get_post_types(array('public' => true)) as $type): ?>
<?php $object = get_post_type_object($type); ?>
<option <?php if(!in_array($type, $plugin_options['post_types'])): ?> disabled="disabled" <?php endif; ?> value="<?php echo $type; ?>" <?php selected($type, $post_type); ?>><?php echo $object->labels->name; ?></option>
<?php endforeach; ?>
</select>
</p>
<p>
<label for="<?php echo $this->get_field_id('sort'); ?>"><?php _e('Sort by:', PostRatings::ID); ?></label>
<select class="widefat" id="<?php echo $this->get_field_id('sort'); ?>" name="<?php echo $this->get_field_name('sort'); ?>">
<option <?php selected('bayesian_rating', $sort); ?> value="bayesian_rating"><?php _e('Overall bayesian rating (score)', PostRatings::ID); ?></option>
<option <?php selected('rating', $sort); ?> value="rating"><?php _e('Average rating', PostRatings::ID); ?></option>
<option <?php selected('votes', $sort); ?> value="votes"><?php _e('Number of votes', PostRatings::ID); ?></option>
</select>
</p>
<p>
<label for="<?php echo $this->get_field_id('order'); ?>_desc">
<input id="<?php echo $this->get_field_id('order'); ?>_desc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="DESC" <?php checked('DESC', $order); ?> />
<?php _e('Descending', PostRatings::ID); ?>
</label>
<label for="<?php echo $this->get_field_id('order'); ?>_asc">
<input id="<?php echo $this->get_field_id('order'); ?>_asc" name="<?php echo $this->get_field_name('order'); ?>" type="radio" value="ASC" <?php checked('ASC', $order); ?> />
<?php _e('Ascending', PostRatings::ID); ?>
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('date_limit'); ?>"><?php _e('Ignore posts older than:', PostRatings::ID); ?></label>
<input id="<?php echo $this->get_field_id('date_limit'); ?>" name="<?php echo $this->get_field_name('date_limit'); ?>" type="text" value="<?php echo $date_limit; ?>" size="3" /> <?php _e('days', PostRatings::ID); ?>
<br />
<small><?php _e('(0 to ignore date)', PostRatings::ID); ?></small>
</p>
<p>
<label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Limit:', PostRatings::ID); ?></label>
<input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" />
</p>
</fieldset>
<?php
}
}
}