'. '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, '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, $args['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,'; } /////////////////////////////////////////////////////////////////////// if( isset($args['post_category']) && $args['post_category']>=0 ) { $q = ' SELECT DISTINCT p.ID, p.post_title, p.post_excerpt, 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' ).'\' AND p.post_status = \'publish\' AND p.post_type = \'post\' AND m.meta_key = \'hits\' AND p.ID IN ( SELECT DISTINCT t_r.object_id FROM '.$wpdb->term_relationships.' t_r WHERE t_r.term_taxonomy_id = '.$args['post_category'].' ) ORDER BY '. $sql_sorting_algorithm. 'p.post_date_gmt DESC LIMIT '.$args['count']; } else { $q = ' SELECT DISTINCT p.ID, p.post_title, p.post_excerpt, 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' ).'\' AND p.post_status = \'publish\' AND p.post_type = \'post\' AND m.meta_key = \'hits\' 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 = ''; /////////////////////////////////////////////////////////////////////// // 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'] ) ), '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']; $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['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( '
'. '

'. ''. ''. '

'. '

'. ''. ''. '

'. '

'. ''. ''. '

'. '

'. ''. ''. '

'. '

'. '' ); wp_dropdown_categories( array( 'id' => $this->get_field_id('post_category'), 'class' => 'widefat', 'name' => $this->get_field_name('post_category'), 'hide_empty' => 0, 'orderby' => 'name', 'selected' => $post_category, 'show_option_none' => 'Any', 'hierarchical' => true, ) ); echo( '

'. '

'. ''. ''. '

'. '

'. ''. ''. '

'. '

'. ''. ''. 'You can use this placeholders:'. '

'. '

'. '

'. 'I forgot something? You can write to me!'. '

'. '
' ); /////////////////////////////////////////////////////////////////////// } /////////////////////////////////////////////////////////////////////////// } /////////////////////////////////////////////////////////////////////////////// // 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' ) ); ///////////////////////////////////////////////////////////////////////////////