Widget nejčtenějších článků


První věc, kterou musíte udělat je nainstalovat si a aktivovat plugin Google Analytics Dashboard. Všechna data si budeme aktualizovat pomocí cronu, čímž se nezpomalí načítání samotné stránky pro návštěvníky. Script se velmi podobá tomu, pro načítání tweetů o článku.

add_action('ana_nactipost_hook', 'ana_nactipost', 10, 1);

add_action('ana_hodina', 'nactiAnalytics');

function ana_cron_activation() {
    if (!wp_next_scheduled('ana_hodina')) {
        wp_schedule_event(time(), 'hourly', 'ana_hodina');
        nactiAnalytics();
    }
}

add_action('wp', 'ana_cron_activation');

function ana_nactipost($id) {
    global $wpdb;
    $url = get_permalink($id);
    $rozdil = time() - Date("U", strtotime($wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE ID = '" . $id . "'")));
    wp_schedule_single_event(time() + rand(300, 1600), 'ana_nactipost_hook', array('id' => $id));
    $data = new SingleGADWidgetData();
	update_post_meta($id, 'analytics', $data->get_page_views($url));
	}

function nactiAnalytics() {
    global $wpdb;
    foreach ($wpdb->get_results("SELECT ID
        FROM $wpdb->posts
            WHERE post_type='post' AND post_status='publish'") as $post) {
        if (!wp_next_scheduled('ana_nactipost_hook', array('id' => $post->ID))) {
        	wp_schedule_single_event(time() + rand(60 * 10, 60 * 30), 'ana_nactipost_hook', array('id' => $post->ID));
        	}
    	}
	}

add_action('init', 'GALoad');

function GALoad(){
	class SingleGADWidgetData extends GADWidgetData {

    function gad_pageviews_text_begining($link_uri){
	    if($this->auth_type == 'oauth') $ga = new GALib('oauth', NULL, $this->oauth_token, $this->oauth_secret, $this->account_id);
	    else $ga = new GALib('client', $this->auth_token, NULL, NULL, $this->account_id);
	    $start_date = date('Y-m-d', strtotime("2005-01-01"));
	    $end_date = date('Y-m-d');
	    $data = $ga->total_uri_pageviews_for_date_period($link_uri, $start_date, $end_date);
	    $error_type = gad_request_error_type($ga);
	    if($error_type == 'perm') return '';
	    else if($error_type == 'retry') $data = $ga->total_uri_pageviews_for_date_period($link_uri, $start_date, $end_date);
	    return $data['value'];
	  	}

	 function get_page_views($url){
	 	$url = parse_url($url);
	 	$url = $url['path'];
	 	return $this->gad_pageviews_text_begining($url);
	 }
	}
}

Všimněte si především řádku 19, kde je interval pro obnovení cache. V tomto konkrétním případě to je náhodná veličina mezi 300 a 1600 vteřinami. Je už na vás, jestli si nastavíte rychlejší aktualizaci či naopak pomalejší. Až script vložíte do šablony, tak začnou postupně načítat data, která se ukládají do uživatelských polí (konkrétně “analytics”). Vypsat je můžete takto:

echo str_replace(' ', ' ', number_format(get_post_meta(get_the_ID(), 'analytics', true), 0, ",", " ")));

A ještě script pro widget nejčtenějších článků:

class nejctenejsiWidget extends WP_Widget {

    function nejctenejsiWidget() {
        parent::WP_Widget(false, $name = 'Nejčtenější články');
    }

    function widget($args, $instance) {
        extract($args);
        $title = apply_filters('widget_title', $instance['title']);
        $pocet = $instance['pocet'];
        echo $before_widget;
        if ($title)
            echo $before_title . $title . $after_title;
        echo "<ul>";
        foreach(get_posts('post_type=post&meta_key=analytics&orderby=meta_value_num&order=DESC&posts_per_page=' . $pocet) as $post){
        	echo "<li><a href='". get_permalink($post->ID) ."'>" . $post->post_title . "</a> (". str_replace(' ', ' ', number_format(get_post_meta($post->ID, 'analytics', true), 0, ",", " ")) ."x)</li>";
        }
        echo "</ul>";
        //zde napíšete kód widgetu
        echo $after_widget;
    }

    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['pocet'] = $new_instance['pocet'];
        return $instance;
    }

    function form($instance) {
        $title = esc_attr($instance['title']);
        $pocet = esc_attr($instance['pocet']);
        ?>
        <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 $title; ?>" />
        </p>
        <p>
            <label for="<?php echo $this->get_field_id('pocet'); ?>"><?php _e('Počet článků:'); ?></label>
            <input class='widefat' id="<?php echo $this->get_field_id('pocet'); ?>" name="<?php echo $this->get_field_name('pocet'); ?>" type="text" value="<?php echo $pocet; ?>" />
        </p>
        <?php
    }

}

add_action('widgets_init', create_function('', 'return register_widget("nejctenejsiWidget");'));