'.
'function ahc_getXmlHttp(){var e;try{e=new ActiveXObject("Msxml2.XMLHTTP")}catch(t){try{e=new ActiveXObject("Microsoft.XMLHTTP")}catch(n){e=false}}if(!e&&typeof XMLHttpRequest!="undefined"){e=new XMLHttpRequest}return e};'.
'var ahc_xmlhttp=ahc_getXmlHttp();'.
'ahc_xmlhttp.open("GET","'.admin_url( 'admin-ajax.php' ).'?action=ajax-hits-counter-increment&post_id='.$post->ID.'",true);'.
'ahc_xmlhttp.send(null);'.
'';
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_increment()
{
if( !isset($_GET['post_id']) || empty($_GET['post_id']) )
{
die( '0' );
}
$post_id = intval( filter_var( $_GET['post_id'], FILTER_SANITIZE_NUMBER_INT ) );
if( empty($post_id) )
{
die( '0' );
}
$current_hits = get_post_meta( $post_id, 'hits', true );
if( empty($current_hits) )
{
$current_hits = 0;
}
$current_hits++;
update_post_meta( $post_id, 'hits', $current_hits );
die( strval( $current_hits ) );
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_get_hits( $post_id )
{
$post_id = intval( filter_var( $post_id, FILTER_SANITIZE_NUMBER_INT ) );
if( empty($post_id) )
{
return 0;
}
$hits = get_post_meta( $post_id, 'hits', true );
if( empty($hits) )
{
return 0;
}
return intval($hits);
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_posts_table_column( $column )
{
$column['hits'] = 'Hits';
return $column;
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_posts_table_row( $column_name, $post_id )
{
if( $column_name=='hits' )
{
$current_hits = get_post_meta( $post_id, 'hits', true );
if( empty($current_hits) )
{
$current_hits = 0;
}
echo( $current_hits );
}
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_posts_table_sortable( $column )
{
$column['hits'] = 'hits';
return $column;
}
///////////////////////////////////////////////////////////////////////////////
function ajax_hits_counter_posts_table_orderby( $vars )
{
if( isset($vars['orderby']) && $vars['orderby']=='hits' )
{
$vars = array_merge(
$vars,
array(
'meta_key' => 'hits',
'orderby' => 'meta_value_num'
)
);
}
return $vars;
}
///////////////////////////////////////////////////////////////////////////////
add_filter('the_content', 'ajax_hits_counter_init', 100);
///////////////////////////////////////////////////////////////////////////////
add_action( 'wp_ajax_nopriv_ajax-hits-counter-increment', 'ajax_hits_counter_increment' );
add_action( 'wp_ajax_ajax-hits-counter-increment', 'ajax_hits_counter_increment' );
///////////////////////////////////////////////////////////////////////////////
add_filter( 'manage_posts_columns', 'ajax_hits_counter_posts_table_column' );
add_filter( 'manage_posts_custom_column', 'ajax_hits_counter_posts_table_row', 10, 2 );
add_filter( 'manage_edit-post_sortable_columns', 'ajax_hits_counter_posts_table_sortable' );
add_filter( 'request', 'ajax_hits_counter_posts_table_orderby' );
///////////////////////////////////////////////////////////////////////////////
/**
* Adds ajax_hits_counter_popular_posts_widget widget.
*/
class AJAX_Hits_Counter_Popular_Posts_Widget extends WP_Widget
{
///////////////////////////////////////////////////////////////////////////
protected $defaults = array(
'widget_id' => 'ajax_hits_counter_popular_posts_widget',
'sorting_algorithm' => 1, // hits only
'count' => 5,
'cache_lifetime' => 3600,
'date_range' => 7,
'one_element_html' => "\n {post_title} ({post_hits})\n",
'post_category' => -1,
'post_categories_separator' => ', ',
'post_date_format' => 'd.m.Y',
);
///////////////////////////////////////////////////////////////////////////
/**
* Register widget with WordPress.
*/
public function __construct()
{
///////////////////////////////////////////////////////////////////////
parent::__construct(
$this->defaults['widget_id'],
'AJAX Hits Counter: Popular Posts',
array(
'description' => 'Displays popular posts counted by AJAX Hits Counter.',
'classname' => $this->defaults['widget_id'],
),
array(
'width' => 400,
'height' => 350,
)
);
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* 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 )
{
///////////////////////////////////////////////////////////////////////
// args
$args = array_merge( $this->defaults, $args );
// cache key
$cache_key = 'ajax_hits_counter_'.dechex(crc32( $args['widget_id'] ));
// try to get cached data from transient cache
$cache = get_transient( $cache_key );
if( !is_array($cache) && !empty($cache) )
#if( false )
{
// cache exists, return cached data
echo( $cache );
return true;
}
// get popular posts
$popular_posts = $this->getPopularPosts( $instance );
if( empty($popular_posts) )
{
return false;
}
$title = apply_filters( 'widget_title', $instance['title'] );
$output = $args['before_widget'];
if( !empty( $title ) )
{
$output .= $args['before_title'].$title.$args['after_title'];
}
$output .= $this->getHTML( $popular_posts, $instance );
$output .= $args['after_widget'];
// store result to cache
set_transient( $cache_key, $output, $instance['cache_lifetime'] );
echo( $output );
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* Returns Popular Posts
*
* @param array $args
* @return array
*/
public function getPopularPosts( $args = array() )
{
///////////////////////////////////////////////////////////////////////
global $wpdb;
if( isset($args['sorting_algorithm']) )
{
switch( $args['sorting_algorithm'] )
{
case 1: // hits only
default:
$sql_sorting_algorithm = '( m.meta_value + 0 ) DESC,';
break;
case 2: // comments only
$sql_sorting_algorithm = '( p.comment_count + 0 ) DESC,';
break;
case 3: // hits + comments * 10
$sql_sorting_algorithm = '( ( m.meta_value + 0 ) + ( p.comment_count + 0 ) * 10 ) DESC,';
break;
}
}
else
{
$sql_sorting_algorithm = '( m.meta_value + 0 ) DESC,';
}
///////////////////////////////////////////////////////////////////////
$q = '
SELECT
DISTINCT p.ID,
p.post_title,
p.post_content,
p.post_author,
p.post_date,
m.meta_value as post_hits,
p.comment_count as post_comments_count
FROM
'.$wpdb->posts.' p
JOIN
'.$wpdb->postmeta.' m ON ( p.ID = m.post_id )
WHERE
p.post_date_gmt < \''.date( 'Y-m-d H:i:s' ).'\'';
if( isset($args['date_range']) && $args['date_range']<7 )
{
switch( $args['date_range'] )
{
case 1:
$temp_post_date_shift = '-1 day';
break;
case 2:
$temp_post_date_shift = '-1 week';
break;
case 3:
$temp_post_date_shift = '-1 month';
break;
case 4:
$temp_post_date_shift = '-3 months';
break;
case 5:
$temp_post_date_shift = '-6 months';
break;
case 6:
$temp_post_date_shift = '-1 year';
break;
default:
$temp_post_date_shift = false;
}
if( !empty($temp_post_date_shift) )
{
$q .= '
AND
p.post_date_gmt >= \''.date( 'Y-m-d H:i:s', strtotime( $temp_post_date_shift ) ).'\'';
}
}
$q .= '
AND
p.post_status = \'publish\'
AND
p.post_type = \'post\'
AND
m.meta_key = \'hits\'';
if( isset($args['post_category']) )
{
$temp_post_category = false;
if( $args['post_category']>0 )
{
$temp_post_category = $args['post_category'];
}
elseif( $args['post_category']==-2 )
{
$temp_post_category = intval( get_query_var('cat') );
}
if( !empty($temp_post_category) )
{
$q .= '
AND
p.ID IN
(
SELECT
DISTINCT t_r.object_id
FROM
'.$wpdb->term_relationships.' t_r
WHERE
t_r.term_taxonomy_id = '.$temp_post_category.'
)';
}
}
$q .= '
ORDER BY '.
$sql_sorting_algorithm.
'p.post_date_gmt DESC
LIMIT
'.$args['count'];
return
$wpdb->get_results($q);
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* Returns HTML of Popular Posts
*
* @param array $popular_posts
* @param array $args
* @return string
*/
public function getHTML( $popular_posts = array(), $args = array() )
{
///////////////////////////////////////////////////////////////////////
if( empty($popular_posts) )
{
return false;
}
///////////////////////////////////////////////////////////////////////
// fix bug in Wordpress :-)
global $post;
$tmp_post = $post;
// args
$args = array_merge( $this->defaults, $args );
$excerpt_length_isset = false;
///////////////////////////////////////////////////////////////////////
$html = '
';
foreach( $popular_posts as $post )
{
$post_author_obj = get_userdata( $post->post_author );
$post_author_name = $post_author_obj->display_name;
$post_author_link = get_author_posts_url( $post_author_obj->ID, $post_author_obj->user_nicename );
setup_postdata($post);
$temp_html =
str_ireplace(
array(
'{post_id}',
'{post_title}',
'{post_author}',
'{post_author_link}',
'{permalink}',
'{post_date}',
'{post_hits}',
'{post_comments_count}',
),
array(
$post->ID,
//$post->post_title,
get_the_title(),
$post_author_name,
$post_author_link,
get_permalink($post->ID),
date( $args['post_date_format'], strtotime($post->post_date) ),
$post->post_hits,
$post->post_comments_count,
),
$args['one_element_html']
);
if( preg_match_all( '#(\{thumbnail\-([^\}]+)\})#sim', $temp_html, $matches ) )
{
if( isset($matches['2']) && !empty($matches['2']) )
{
foreach( $matches['2'] as $m )
{
$size = $m;
if( preg_match( '#([0-9]+)x([0-9]+)#i', $m, $sizes ) )
{
if( isset($sizes['1']) && isset($sizes['2']) )
{
$size = array( $sizes['1'], $sizes['2'] );
}
}
$temp_html = str_ireplace( '{thumbnail-'.$m.'}', get_the_post_thumbnail( $post->ID, $size ), $temp_html );
}
}
}
if( stripos( $args['one_element_html'], '{post_categories}' )!==false )
{
$categories = get_the_category( $post->ID );
if( !empty($categories) )
{
$temp = array();
foreach( $categories as $category )
{
$temp[] = ''.$category->cat_name.'';
}
$temp_html = str_ireplace( '{post_categories}', join( $args['post_categories_separator'], $temp ), $temp_html );
}
}
if( preg_match( '#(\{post\_title\_([0-9]+)\})#sim', $temp_html, $matches ) )
{
if( isset($matches['2']) && !empty($matches['2']) )
{
$temp_title_excerpt = get_the_title();
$temp_title_excerpt_length = intval($matches['2']);
if( $temp_title_excerpt_length > 0 )
{
$temp_title_excerpt_arr = explode( ' ', $temp_title_excerpt );
$temp_title_excerpt =
join(
' ',
array_slice(
$temp_title_excerpt_arr,
0,
$temp_title_excerpt_length
)
);
if( count($temp_title_excerpt_arr) > $temp_title_excerpt_length )
{
$temp_title_excerpt .= '...';
}
}
$temp_html = str_ireplace( $matches['1'], $temp_title_excerpt, $temp_html );
}
}
if( preg_match( '#(\{post\_excerpt\_([0-9]+)\})#sim', $temp_html, $matches ) )
{
if( isset($matches['2']) && !empty($matches['2']) )
{
/*
$excerpt_length = intval($matches['2']);
if( $excerpt_length > 0 )
{
if( $excerpt_length_isset===false )
{
add_filter( 'excerpt_length', create_function( '', 'return '.$excerpt_length.';' ), 1024 );
$excerpt_length_isset = true;
}
}
$temp_html = str_ireplace( $matches['1'], get_the_excerpt(), $temp_html );
*/
$temp_excerpt = get_the_content();
$temp_excerpt_length = intval($matches['2']);
if( $temp_excerpt_length > 0 )
{
$temp_excerpt_arr = explode( ' ', $temp_excerpt );
$temp_excerpt =
join(
' ',
array_slice(
$temp_excerpt_arr,
0,
$temp_excerpt_length
)
);
if( count($temp_excerpt_arr) > $temp_excerpt_length )
{
$temp_excerpt .= '...';
}
}
$temp_html = str_ireplace( $matches['1'], $temp_excerpt, $temp_html );
}
}
$html .= '- '.$temp_html.'
';
}
$html .= '
';
///////////////////////////////////////////////////////////////////////
// restore $post (Wordpress bug fixing)
wp_reset_postdata();
$post = $tmp_post;
///////////////////////////////////////////////////////////////////////
return $html;
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* Clear transient widget cache
*
* @return bool
*/
public function clearCache()
{
///////////////////////////////////////////////////////////////////////
global $wpdb;
$q = '
SELECT
option_name as name
FROM
'.$wpdb->options.'
WHERE
option_name LIKE \'_transient_ajax_hits_counter_%\'';
$transients = $wpdb->get_results($q);
if( !empty($transients) )
{
foreach( $transients as $transient )
{
delete_transient( str_replace( '_transient_', '', $transient->name ) );
}
}
return true;
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance )
{
///////////////////////////////////////////////////////////////////////
// drop cache
$this->clearCache();
///////////////////////////////////////////////////////////////////////
// return sanitized data
return array(
'title' => trim( strip_tags( $new_instance['title'] ) ),
'sorting_algorithm' => intval( preg_replace( '#[^0-9]#', '', $new_instance['sorting_algorithm'] ) ),
'count' => intval( preg_replace( '#[^0-9]#', '', $new_instance['count'] ) ),
'cache_lifetime' => intval( preg_replace( '#[^0-9]#', '', $new_instance['cache_lifetime'] ) ),
'date_range' => intval( preg_replace( '#[^1-9]#', '', $new_instance['date_range'] ) ),
'one_element_html' => trim( $new_instance['one_element_html'] ),
'post_category' => intval( preg_replace( '#[^\-0-9]#', '', $new_instance['post_category'] ) ),
'post_categories_separator' => $new_instance['post_categories_separator'],
'post_date_format' => trim( strip_tags( $new_instance['post_date_format'] ) ),
);
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance )
{
///////////////////////////////////////////////////////////////////////
// defaults
$title = __('Popular Posts');
$sorting_algorithm = $this->defaults['sorting_algorithm'];
$count = $this->defaults['count'];
$cache_lifetime = $this->defaults['cache_lifetime'];
$date_range = $this->defaults['date_range'];
$one_element_html = $this->defaults['one_element_html'];
$post_category = $this->defaults['post_category'];
$post_categories_separator = $this->defaults['post_categories_separator'];
$post_date_format = $this->defaults['post_date_format'];
///////////////////////////////////////////////////////////////////////
if( isset($instance['title']) && strlen($instance['title'])>1 )
{
$title = $instance[ 'title' ];
}
if( isset($instance['sorting_algorithm']) && intval($instance['sorting_algorithm'])>0 )
{
$sorting_algorithm = intval($instance['sorting_algorithm']);
}
if( isset($instance['count']) && intval($instance['count'])>0 )
{
$count = intval($instance['count']);
}
if( isset($instance['cache_lifetime']) && intval($instance['cache_lifetime'])>0 )
{
$cache_lifetime = intval($instance['cache_lifetime']);
}
if( isset($instance['date_range']) && intval($instance['date_range'])>0 )
{
$date_range = intval($instance['date_range']);
}
if( isset($instance['post_category']) )
{
$post_category = intval($instance['post_category']);
}
if( isset($instance['post_categories_separator']) && strlen($instance['post_categories_separator'])>0 )
{
$post_categories_separator = $instance['post_categories_separator'];
}
if( isset($instance['post_date_format']) && strlen($instance['post_date_format'])>0 )
{
$post_date_format = $instance['post_date_format'];
}
if( isset($instance['one_element_html']) && strlen($instance['one_element_html'])>1 )
{
$one_element_html = $instance['one_element_html'];
}
///////////////////////////////////////////////////////////////////////
echo(
''
);
///////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
private function _dropdownCategories( $args = array() )
{
$args = array_merge(
array(
'id' => 'categories_'.uniqid(),
'name' => 'categories_'.uniqid(),
'selected' => false,
'class' => 'widefat',
),
$args
);
///////////////////////////////////////////////////////////////////////
$html =
'';
return $html;
}
///////////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////////
// register AJAX Hits Counter: Popular Posts Widget
add_action( 'widgets_init', create_function( '', 'register_widget( "AJAX_Hits_Counter_Popular_Posts_Widget" );' ) );
// remove cached data
add_action( 'save_post', array( 'AJAX_Hits_Counter_Popular_Posts_Widget', 'clearCache' ) );
///////////////////////////////////////////////////////////////////////////////