Horriblesubs/fansub/statistics.php

364 lines
14 KiB
PHP

<?php
if(!function_exists('add_filter')) exit;
if(defined('FANSUB_STATISTICS_VERSION')) {
return;
}
define('FANSUB_STATISTICS_VERSION', '1.0.2');
define('FANSUB_COUNTER_TABLE_STATISTICS', 'hw_statistics');
define('FANSUB_COUNTER_TABLE_ONLINE', 'hw_statistics_online');
define('FANSUB_COUNTER_PATH', FANSUB_CONTENT_PATH . '/counter');
if(!file_exists(FANSUB_COUNTER_PATH)) {
wp_mkdir_p(FANSUB_COUNTER_PATH);
}
$use_statistics = apply_filters('fansub_use_statistics', false);
function fansub_statistics_table_init() {
global $wpdb;
$charset_collate = '';
if(!empty($wpdb->charset)) {
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
}
if(!empty($wpdb->collate)) {
$charset_collate .= " COLLATE $wpdb->collate";
}
$table_statistics = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$table_online = $wpdb->prefix . FANSUB_COUNTER_TABLE_ONLINE;
$sql = "CREATE TABLE $table_statistics (
ID bigint(20) unsigned NOT NULL auto_increment,
user_id bigint(20) unsigned NOT NULL default '0',
visited datetime NOT NULL default '0000-00-00 00:00:00',
visited_timestamp int,
ip text,
pc_ip text,
browser text,
location text,
user_agent longtext,
PRIMARY KEY (ID),
KEY user_id (user_id)
) $charset_collate;
CREATE TABLE $table_online (
ID bigint(20) unsigned NOT NULL auto_increment,
user_id bigint(20) unsigned NOT NULL default '0',
visited datetime NOT NULL default '0000-00-00 00:00:00',
visited_timestamp int,
ip text,
pc_ip text,
browser text,
location text,
user_agent longtext,
PRIMARY KEY (ID),
KEY user_id (user_id)
) $charset_collate;\n";
if(!function_exists('dbDelta')) {
require(ABSPATH . 'wp-admin/includes/upgrade.php');
}
dbDelta($sql);
}
add_action('after_switch_theme', 'fansub_statistics_table_init');
function fansub_statistics_reset_all_data() {
fansub_empty_database_table(FANSUB_COUNTER_TABLE_STATISTICS);
fansub_empty_database_table(FANSUB_COUNTER_TABLE_ONLINE);
}
function fansub_statistics_add_row($table, $user_id, $visited, $ip, $pc_ip, $browser, $location, $user_agent) {
global $wpdb;
$wpdb->insert(
$wpdb->prefix . $table,
array(
'user_id' => $user_id,
'visited' => $visited,
'visited_timestamp' => strtotime($visited),
'ip' => $ip,
'pc_ip' => $pc_ip,
'browser' => $browser,
'location' => maybe_serialize($location),
'user_agent' => $user_agent
),
array(
'%d',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)
);
return $wpdb->insert_id;
}
function fansub_statistics_track() {
$fansub_statistics_browser = isset($_SESSION['fansub_statistics_browser']) ? $_SESSION['fansub_statistics_browser'] : '';
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$browser = fansub_get_browser();
$online = fansub_statistics_online_real();
if($fansub_statistics_browser != $browser || 0 == $online) {
$current_datetime = fansub_get_current_datetime_mysql();
$user_id = 0;
if(is_user_logged_in()) {
$user = wp_get_current_user();
$user_id = $user->ID;
}
$ip = fansub_get_user_isp_ip();
$pc_ip = fansub_get_pc_ip();
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$location = fansub_get_current_visitor_location();
$statistics_id = fansub_statistics_add_row(FANSUB_COUNTER_TABLE_STATISTICS, $user_id, $current_datetime, $ip, $pc_ip, $browser, $location, $user_agent);
$online_id = fansub_statistics_add_row(FANSUB_COUNTER_TABLE_ONLINE, $user_id, $current_datetime, $ip, $pc_ip, $browser, $location, $user_agent);
$_SESSION['fansub_statistics_user_online'] = $online_id;
$_SESSION['fansub_statistics_browser'] = $browser;
}
}
if($use_statistics && !is_admin()) add_action('init', 'fansub_statistics_track');
function fansub_statistics_refresh_online_expire() {
global $wpdb;
$current_online = isset($_SESSION['fansub_statistics_user_online']) ? $_SESSION['fansub_statistics_user_online'] : 0;
$current_online = absint($current_online);
if($current_online > 0) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_ONLINE;
$wpdb->update(
$table,
array(
'visited_timestamp' => strtotime(fansub_get_current_datetime_mysql())
),
array(
'ID' => $current_online
),
array(
'%d'
),
array(
'%d'
)
);
}
}
if($use_statistics) add_action('wp_head', 'fansub_statistics_refresh_online_expire');
function fansub_statistics_get_online_refresh_minute() {
$minutes = apply_filters('fansub_statistics_online_refresh_minute', 15);
$minutes = absint($minutes);
return $minutes;
}
function fansub_statistics_delete_online_expired() {
global $wpdb;
$minutes = fansub_statistics_get_online_refresh_minute();
$transient_name = 'fansub_statistics_delete_online';
if(false === get_transient($transient_name)) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_ONLINE;
$interval = '-' . $minutes . ' minutes';
$compare = fansub_get_datetime_ago($interval);
$compare = strtotime($compare);
$wpdb->query("DELETE FROM $table WHERE visited_timestamp < $compare");
set_transient($transient_name, 1, $minutes * MINUTE_IN_SECONDS);
}
}
if($use_statistics) add_action('wp_head', 'fansub_statistics_delete_online_expired');
function fansub_statistics_online_detail() {
global $wpdb;
$result = array();
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_ONLINE;
$rows = $wpdb->get_results("SELECT * FROM $table");
$online = $wpdb->num_rows;
$online = absint($online);
$count_user = 0;
$items = array();
foreach($rows as $item) {
$user_name = __('Guest', 'fansub');
$last_activity = fansub_human_time_diff_to_now($item->visited_timestamp) . ' ' . __('ago', 'fansub');
if($item->user_id > 0) {
$count_user++;
$user = get_user_by('id', $item->user_id);
if(is_object($user) && !is_wp_error($user)) {
$user_name = '<a href="' . get_author_posts_url($user->ID) . '">' . $user->user_login . '</a>';
}
}
$items[] = array(
'user_name' => $user_name,
'last_activity' => $last_activity,
'location' => maybe_unserialize($item->location)
);
}
$most_user_online = get_option('fansub_most_user_online');
if(!is_array($most_user_online)) {
$most_user_online = array();
}
if($most_user_online < $online) {
$most_user_online['count'] = $online;
$most_user_online['timestamp'] = strtotime(fansub_get_current_datetime_mysql());
update_option('fansub_most_user_online', $most_user_online);
}
$result['count'] = $online;
$result['items'] = $items;
$result['user_count'] = $count_user;
$result['guest_count'] = absint($online - $count_user);
$result['most_user_online'] = $most_user_online;
return $result;
}
function fansub_statistics_online_real() {
$detail = fansub_statistics_online_detail();
return $detail['count'];
}
function fansub_statistics_online() {
$online = fansub_statistics_online_real();
if($online < 1) {
$online = 1;
}
return $online;
}
function fansub_statistics_today() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$compare = strtotime(fansub_get_datetime_ago('-1 day'));
$day_in_seconds = DAY_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) < $day_in_seconds");
return $wpdb->num_rows;
}
function fansub_statistics_yesterday() {
global $wpdb;
$transient_name = 'fansub_statistics_yesterday';
if(false === ($result = get_transient($transient_name))) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$current_datetime = fansub_get_current_datetime_mysql();
$compare = strtotime(fansub_get_datetime_ago('-1 day'));
$day_in_seconds = DAY_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) > $day_in_seconds AND ($compare - visited_timestamp) < (2 * $day_in_seconds)");
$result = $wpdb->num_rows;
$interval = apply_filters('fansub_statistics_yesterday_refresh_hour', 12);
set_transient($transient_name, $result, $interval * HOUR_IN_SECONDS);
}
return $result;
}
function fansub_statistics_this_week() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$compare = strtotime(fansub_get_datetime_ago('-1 week'));
$in_seconds = WEEK_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) < $in_seconds");
return $wpdb->num_rows;
}
function fansub_statistics_last_week() {
global $wpdb;
$transient_name = 'fansub_statistics_last_week';
if(false === ($result = get_transient($transient_name))) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$current_datetime = fansub_get_current_datetime_mysql();
$compare = strtotime(fansub_get_datetime_ago('-1 week'));
$in_seconds = WEEK_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) > $in_seconds AND ($compare - visited_timestamp) < (2 * $in_seconds)");
$result = $wpdb->num_rows;
$interval = apply_filters('fansub_statistics_last_week_refresh_day', 3);
set_transient($transient_name, $result, $interval * WEEK_IN_SECONDS);
}
return $result;
}
function fansub_statistics_this_month() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$compare = strtotime(fansub_get_datetime_ago('-1 month'));
$in_seconds = 4 * WEEK_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) < $in_seconds");
return $wpdb->num_rows;
}
function fansub_statistics_last_month() {
global $wpdb;
$transient_name = 'fansub_statistics_last_month';
if(false === ($result = get_transient($transient_name))) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$current_datetime = fansub_get_current_datetime_mysql();
$compare = strtotime(fansub_get_datetime_ago('-1 month'));
$in_seconds = 4 * WEEK_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) > $in_seconds AND ($compare - visited_timestamp) < (2 * $in_seconds)");
$result = $wpdb->num_rows;
$interval = apply_filters('fansub_statistics_last_month_refresh_week', 2);
set_transient($transient_name, $result, $interval * WEEK_IN_SECONDS);
}
return $result;
}
function fansub_statistics_this_year() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$compare = strtotime(fansub_get_datetime_ago('-1 year'));
$in_seconds = 4 * YEAR_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) < $in_seconds");
return $wpdb->num_rows;
}
function fansub_statistics_last_year() {
global $wpdb;
$transient_name = 'fansub_statistics_last_year';
if(false === ($result = get_transient($transient_name))) {
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$current_datetime = fansub_get_current_datetime_mysql();
$compare = strtotime(fansub_get_datetime_ago('-1 year'));
$in_seconds = YEAR_IN_SECONDS;
$wpdb->get_results("SELECT ID FROM $table WHERE ($compare - visited_timestamp) > $in_seconds AND ($compare - visited_timestamp) < (2 * $in_seconds)");
$result = $wpdb->num_rows;
$interval = apply_filters('fansub_statistics_last_year_refresh_month', 6);
set_transient($transient_name, $result, $interval * WEEK_IN_SECONDS);
}
return $result;
}
function fansub_statistics_total() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$wpdb->get_results("SELECT ID FROM $table");
return $wpdb->num_rows;
}
function fansub_statistics_avg() {
global $wpdb;
$table = $wpdb->prefix . FANSUB_COUNTER_TABLE_STATISTICS;
$results = $wpdb->get_results("SELECT visited_timestamp FROM $table ORDER BY ID LIMIT 1");
$total_days = 1;
if($wpdb->num_rows > 0) {
$timestamp = $results[0]->visited_timestamp;
$diff = strtotime(fansub_get_current_datetime_mysql()) - $timestamp;
$total_days = ceil($diff/DAY_IN_SECONDS);
}
$wpdb->get_results("SELECT ID FROM $table");
return ceil($wpdb->num_rows/$total_days);
}
function fansub_post_statistics() {
$post_statistics = fansub_option_get_value('reading', 'post_statistics');
$post_statistics = apply_filters('fansub_post_statistics', $post_statistics);
return (bool)$post_statistics;
}
function fansub_statistics_track_post_views() {
if(is_single() || is_page() || is_singular()) {
$post_id = get_the_ID();
$session_key = 'fansub_post_' . $post_id . '_views';
if(!isset($_SESSION[$session_key]) || $_SESSION[$session_key] != 1) {
$views = get_post_meta($post_id, 'views', true);
$views = absint($views);
$views++;
update_post_meta($post_id, 'views', $views);
$_SESSION[$session_key] = 1;
}
}
}
if(fansub_post_statistics() && !is_admin()) add_action('fansub_before_doctype', 'fansub_statistics_track_post_views');