2011-05-02 09:17:45 +00:00
< ? php
/*
2011-05-02 10:30:11 +00:00
Plugin Name : SemmelstatzR
Plugin URI : http :// sourceforge . net / projects / semmelstatzR /
Description : Visitorstatistic for Wordpress , based upon the original wp - plugin semmelstatzR by Andreas 'Redunzl' Mueller ( http :// www . kopfhoch - studio . de )
Version : 1.0 . 0 beta
Author : Ortwin Pinke
Author URI : http :// www . ortwinpinke . de
2011-05-02 09:17:45 +00:00
*/
2011-05-02 10:30:11 +00:00
/**
* file semmelstatzR . php
*
* @ package SemmelstatzR
* @ version $Rev $
* @ author Ortwin Pinke < info @ dceonline . de >
* @ author Andreas 'Redunzl' Mueller
* @ copyright ( c ) 2011 PHP - Backoffice
* @ copyright ( c ) 2005 - 2009 kopfhoch - studio
* @ link http :// www . php - backoffice . de / projects / semmelstatzR
* @ link http :// sourceforge . net / projects / semmelstatz /
* @ license http :// www . gnu . org / licenses / gpl - 2.0 . html
*
* $Id $
*
* Copyright ( c ) 2005 - 2009 Andreas 'Redunzl' Mueller ( redunzl @ gmx . de )
* Copyright ( c ) 2011 - Ortwin Pinke ( info @ php - backoffice . de )
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License ( version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2011-05-02 09:17:45 +00:00
*/
### konstante f<> r version
2011-05-02 16:38:26 +00:00
define ( 'SEMMELSTATZR_VERSION' , '1.0.0 Beta' );
2011-05-02 09:17:45 +00:00
### Deklaration der Tabellennamen
2011-05-02 16:38:26 +00:00
global $wpdb ;
$wpdb -> statz = $wpdb -> prefix . 'statz' ;
$wpdb -> statzhist = $wpdb -> prefix . 'statzhist' ;
2011-05-02 09:17:45 +00:00
### Auslesen des Domainnamens
2011-05-02 16:38:26 +00:00
global $homehost ;
if ( substr ( $_SERVER [ 'SERVER_NAME' ], 0 , 4 ) == 'www.' ) {
$homehost = '%' . substr ( $_SERVER [ 'SERVER_NAME' ], 4 ) . '%' ;
} else {
$homehost = '%' . $_SERVER [ 'SERVER_NAME' ] . '%' ;
}
### localization
if ( ! load_plugin_textdomain ( 'semmelstatzR' , '/wp-content/languages/' )) {
$plugin_dir = basename ( dirname ( __FILE__ ));
load_plugin_textdomain ( 'semmelstatzR' , null , $plugin_dir . '/locale/' );
}
2011-05-02 09:17:45 +00:00
### Erstellen des Top-Level-Menus im Adminbereich
2011-05-02 10:30:11 +00:00
add_action ( 'admin_menu' , 'semmelstatzR_menu' );
function semmelstatzR_menu () {
2011-05-02 09:17:45 +00:00
if ( function_exists ( 'add_menu_page' )) {
2011-05-02 10:30:11 +00:00
add_menu_page ( 'SemmelstatzR' , 'SemmelstatzR' , 'manage_statz' , 'semmelstatzR/semmelstatzR-statz.php' , '' , plugins_url ( 'semmelstatzR/img/statz_small.png' ));
2011-05-02 09:17:45 +00:00
}
if ( function_exists ( 'add_submenu_page' )) {
2011-05-02 10:30:11 +00:00
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Aktuell' , 'Aktuell' , 'manage_statz' , 'semmelstatzR/semmelstatzR-statz.php' );
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Historie' , 'Historie' , 'manage_statz' , 'semmelstatzR/semmelstatzR-history.php' );
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Log' , 'Log' , 'manage_statz' , 'semmelstatzR/semmelstatzR-log.php' );
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Datenbank' , 'Datenbank' , 'manage_statz' , 'semmelstatzR/semmelstatzR-database.php' );
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Templates' , 'Templates' , 'manage_statz' , 'semmelstatzR/semmelstatzR-templates.php' );
add_submenu_page ( 'semmelstatzR/semmelstatzR-statz.php' , 'Einstellungen' , 'Einstellungen' , 'manage_statz' , 'semmelstatzR/semmelstatzR-options.php' );
2011-05-02 09:17:45 +00:00
}
}
2011-05-02 10:30:11 +00:00
### Default-Werte der statz-Optionen in das Array 'semmelstatzR_options' schreiben
2011-05-02 09:17:45 +00:00
add_action ( 'init' , 'sem_init_options' );
function sem_init_options () {
global $wpdb ;
if ( get_option ( 'statz_options' )) {
$wpdb -> query ( " DELETE FROM $wpdb->options WHERE option_name LIKE 'statz%'; " ); // L<> schen der alten Optionen
}
2011-05-02 10:30:11 +00:00
if ( ! get_option ( 'semmelstatzR_options' )) {
2011-05-02 09:17:45 +00:00
$sem_options = array (
" statz_comment_limit " => 10 ,
" statz_datarecs_limit " => 100 ,
" statz_days_limit " => 7 ,
" statz_do_cron " => false ,
" statz_encode_ip " => false ,
" statz_keyword_limit " => 10 ,
" statz_referer_limit " => 10 ,
" statz_mask_referer " => false ,
" statz_on_dashboard " => false ,
" statz_online_time " => 180 ,
" statz_recdays_limit " => 20 ,
" statz_show_commenters " => true ,
" statz_show_dailystatz " => true ,
" statz_show_keywords " => true ,
" statz_show_reads " => true ,
" statz_show_referers " => true ,
" statz_show_todayreads " => true ,
" statz_show_todayusers " => true ,
" statz_show_topcommposts " => true ,
" statz_show_useronline " => true ,
" statz_topreads_limit " => 10 ,
" statz_write_admins " => false ,
" statz_write_users " => false
);
2011-05-02 10:30:11 +00:00
add_option ( 'semmelstatzR_options' , $sem_options );
2011-05-02 09:17:45 +00:00
}
}
### Anlegen der Tabellen, Optionen schreiben
2011-05-02 10:30:11 +00:00
add_action ( 'activate_semmelstatzR/semmelstatzR.php' , 'sem_statzsetup' );
2011-05-02 09:17:45 +00:00
function sem_statzsetup () {
global $wpdb ;
if ( @ is_file ( ABSPATH . '/wp-admin/upgrade-functions.php' )) {
include_once ( ABSPATH . '/wp-admin/upgrade-functions.php' );
} elseif ( @ is_file ( ABSPATH . '/wp-admin/includes/upgrade.php' )) {
include_once ( ABSPATH . '/wp-admin/includes/upgrade.php' );
} else {
die ( 'Kann <i>wp-admin/upgrade-functions.php</i> und <i>wp-admin/includes/upgrade.php</i> nicht finden!' );
}
$create_table = array ();
$create_table [ 'statz' ] = " CREATE TABLE $wpdb->statz (
id int ( 11 ) unsigned NOT NULL auto_increment ,
ip varchar ( 39 ) default NULL ,
time datetime NOT NULL default '0000-00-00 00:00:00' ,
referer varchar ( 255 ) default NULL ,
page int ( 11 ) unsigned NOT NULL default '0' ,
username varchar ( 255 ) default NULL ,
PRIMARY KEY ( `id` )) " ;
$create_table [ 'statzhist' ] = " CREATE TABLE $wpdb->statzhist (
id int ( 10 ) unsigned NOT NULL auto_increment ,
date datetime NOT NULL default '0000-00-00 00:00:00' ,
visitors int ( 10 ) unsigned NOT NULL default '0' ,
hits int ( 10 ) unsigned NOT NULL default '0' ,
referers int ( 10 ) unsigned NOT NULL default '0' ,
PRIMARY KEY ( `id` )) " ;
maybe_create_table ( $wpdb -> statz , $create_table [ 'statz' ]);
maybe_create_table ( $wpdb -> statzhist , $create_table [ 'statzhist' ]);
$sql = $wpdb -> query ( " SELECT host FROM $wpdb->statz " );
if ( $sql ) { $wpdb -> query ( " ALTER TABLE $wpdb->statz DROP host " ); }
$sql = $wpdb -> query ( " SELECT keyword FROM $wpdb->statz " );
if ( $sql ) { $wpdb -> query ( " ALTER TABLE $wpdb->statz DROP keyword " ); }
maybe_add_column ( $wpdb -> posts , 'hits' , " ALTER TABLE $wpdb->posts ADD hits bigint(20) NOT NULL DEFAULT '0'; " ); // ab 3.2
$wpdb -> query ( " ALTER TABLE $wpdb->statz CHANGE ip ip VARCHAR(39) NULL DEFAULT NULL; " );
sem_init_options ();
sem_writeOldDaysToHist ();
$role = get_role ( 'administrator' );
if ( ! $role -> has_cap ( 'manage_statz' )) {
$role -> add_cap ( 'manage_statz' );
}
}
### Zugriff analysieren und in statz-Tabelle schreiben
add_action ( 'wp_head' , 'sem_writeStatz' );
function sem_writeStatz () {
global $wpdb , $wp_query , $isBot , $isAdmin , $page ;
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
sem_writeYesterdayToHist ();
$useragent = $wpdb -> escape ( $_SERVER [ 'HTTP_USER_AGENT' ]);
$isBot = sem_AreYouBot ( $useragent );
$username = sem_getUsername ();
if (( $isBot == true )
|| ( $isAdmin == 0 && $sem_options [ 'statz_write_users' ] == false )
|| ( $isAdmin == 1 && $sem_options [ 'statz_write_admins' ] == false )
|| is_404 ()
) return ;
$userip = $wpdb -> escape ( $_SERVER [ 'REMOTE_ADDR' ]);
if ( $sem_options [ 'statz_encode_ip' ] == true ) $userip = sem_encodeIP ( $userip );
$referer = $wpdb -> escape ( urldecode ( $_SERVER [ 'HTTP_REFERER' ]));
$blogtime = gmdate ( 'Y-m-d H:i:s' , current_time ( 'timestamp' ));
if ( ! empty ( $referer )) {
if ( get_option ( 'blog_charset' ) == 'iso-8859-1' ) $referer = utf8_decode ( $referer );
$referer = " ' " . $referer . " ' " ;
}
else {
$referer = 'NULL' ;
}
$readingnow = wp_title ( '' , false );
if ( empty ( $readingnow )) {
$page = 0 ;
2011-05-02 16:38:26 +00:00
} else {
$page = $wp_query -> post -> ID ;
2011-05-02 09:17:45 +00:00
}
$wpdb -> query ( " INSERT INTO $wpdb->statz (ip, time, referer, page, username)
VALUES ( '$userip' , '$blogtime' , $referer , $page , '$username' ) " );
if ( $wpdb -> query ( " SELECT COUNT(hits) FROM $wpdb->posts " )) {
$wpdb -> query ( " UPDATE $wpdb->posts SET hits = hits + 1 WHERE ID = $page " ); // neu ab 3.2
}
}
### Zeitgesteuertes Limitieren der statz-Tabelle
// Wenn semmelKron JA UND statz_next_cron <20> lter JETZT, dann...
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
if ( $sem_options [ 'statz_do_cron' ] == true && $sem_options [ 'statz_next_cron' ] < time ()) {
add_action ( 'shutdown' , 'sem_doCronStatzLimit' ); // ...limitiere statz-Tabelle auf vorgegebenen Wert
}
### CSS f<> r den SEMMELSTATZ-Admin-Bereich
2011-05-02 16:38:26 +00:00
add_action ( 'admin_head' , 'semmelstatzR_css' );
function semmelstatzR_css () {
print " <link rel='stylesheet' href=' " . get_option ( 'siteurl' ) . " /wp-content/plugins/semmelstatzR/semmelstatzR.css' type='text/css' media='screen' /> \n " ;
}
2011-05-02 09:17:45 +00:00
### Rendert eine Mini-STATZ. Idee: Ren<65> Tauchnitz
2011-05-02 16:38:26 +00:00
function sem_dashboardStatz () {
echo '<p>' ;
printf ( _n ( " %d Visitor online " , " %d Visitors online " , sem_showNumUsersOnline (), " semmelstatzR " ), sem_showNumUsersOnline ());
echo ' - ' ;
printf ( __ ( " Today: %s " , " semmelstatzR " ), sem_showTodayStatz ());
echo ' <a title="' . __ ( " more... " , " semmelstatzR " ) . '" href="' . get_option ( 'siteurl' ) . '/wp-admin/admin.php?page=semmelstatzR/semmelstatzR-statz.php">»»</a>' ;
echo '</p>' ;
}
2011-05-02 09:17:45 +00:00
### Widget f<> r die Mini-STATZ
2011-05-02 16:38:26 +00:00
add_action ( 'wp_dashboard_setup' , 'sem_dashboardStatz_setup' );
function sem_dashboardStatz_setup () {
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
if ( ! current_user_can ( 'manage_statz' )) return ;
if ( $sem_options [ 'statz_on_dashboard' ] != true ) return ;
wp_add_dashboard_widget ( 'sem_dashboardStatz' , 'SemmelstatzR' , 'sem_dashboardStatz' );
}
2011-05-02 09:17:45 +00:00
### Mini-Statz f<> r Dashboard-Widget & AKTUELL-Anzeige
function sem_showTodayStatz () {
global $wpdb ;
$thedays = $wpdb -> get_results ( " SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, COUNT(DISTINCT referer)
AS referers , substring ( time , 1 , 10 ) AS date FROM " . $wpdb->statz . " WHERE time >= CURDATE () GROUP BY date " );
2011-05-02 16:38:26 +00:00
$thedays = array ( array ( 'hits' => 33 ));
2011-05-02 09:17:45 +00:00
if ( empty ( $thedays )) {
2011-05-02 16:38:26 +00:00
return " <small> " . __ ( " ... no entries " , " semmelstatzR " ) . " </small> " ;
2011-05-02 09:17:45 +00:00
}
foreach ( $thedays as $key => $theday ) {
$date = mysql2date ( " l " , $theday -> date );
$hits = $theday -> hits ;
$visitors = $theday -> visitors ;
$referers = $theday -> referers ;
}
2011-05-02 16:38:26 +00:00
return sprintf ( _n ( " %d Visitor " , " %d Visitors " , $visitors , " semmelstatzR " ), $visitors ) . " - "
. sprintf ( _n ( " %d Hit " , " %d Hits " , $hits , " semmelstatzR " ), $hits ) . " - "
. sprintf ( _n ( " %d Referrer " , " %d Referrers " , $referer , " semmelstatzR " ), $referers );
2011-05-02 09:17:45 +00:00
}
### Encodierung der IP-Adresse durch simple arithmetische Operation
function sem_encodeIP ( $ip ) {
$ip_parts = split ( " [.] " , $ip );
$new_ip = ( $ip_parts [ 0 ] + 700 ) . " . " . ( $ip_parts [ 1 ] * 2 ) . " . " . ( $ip_parts [ 2 ] + 600 ) . " . " . ( $ip_parts [ 3 ] * 3 );
return $new_ip ;
}
### Decodierung der IP-Adresse durch simple arithmetische Operation
function sem_decodeIP ( $ip ) {
$ip_parts = split ( " [.] " , $ip );
$new_ip = ( $ip_parts [ 0 ] - 700 ) . " . " . ( $ip_parts [ 1 ] / 2 ) . " . " . ( $ip_parts [ 2 ] - 600 ) . " . " . ( $ip_parts [ 3 ] / 3 );
return $new_ip ;
}
### Ist IP-Adresse codiert?
function sem_checkIfIPisEncoded ( $ip ) {
$ip_parts = split ( " [.] " , $ip );
if ( $ip_parts [ 0 ] > 700 ) {
return true ;
}
else {
return false ;
}
}
### Auslesen der h<> chsten Post-ID
function sem_getMaxPostID () {
global $wpdb ;
$maxpostid = $wpdb -> get_var ( " SELECT MAX(ID) FROM " . $wpdb -> posts . " LIMIT 0,1 " );
return $maxpostid ; //Ganzzahl
}
### Auslesen des User- bzw. Kommentarautornamen
function sem_getUsername () {
global $user_ID , $user_login , $isAdmin ;
get_currentuserinfo ();
if ( $user_ID > 0 ) {
$useronline = $user_login ;
if ( current_user_can ( 'manage_options' )) {
$isAdmin = 1 ;
}
else {
$isAdmin = 0 ;
}
}
elseif ( isset ( $_COOKIE [ " comment_author_ " . COOKIEHASH ])) {
$useronline = trim ( $_COOKIE [ " comment_author_ " . COOKIEHASH ]);
$isAdmin = - 1 ;
}
else {
$useronline = " Gast " ;
$isAdmin = - 1 ;
}
return $useronline ;
}
### Pr<50> fen, ob Besucher ein Bot ist
function sem_AreYouBot ( $user_agent ) {
global $isBot ;
$bots = array (
'aipbot' ,
'amfibibot' ,
'appie' ,
'ask jeeves/teoma' ,
'aspseek' ,
'axadine' ,
'baiduspider' ,
'becomebot' ,
'blogcorpuscrawler' ,
'blogpulse' ,
'blogsnowbot' ,
'boitho.com' ,
'bruinbot' ,
'cerberian' ,
'cfnetwork' ,
'check_http' ,
'cipinetbot' ,
'claymont' ,
'cometsearch@cometsystems.com' ,
'converacrawler' ,
'cydralspider' ,
'digger' ,
'es.net_crawler' ,
'eventax' ,
'everyfeed-spider' ,
'exabot@exava.com' ,
'faxobot' ,
'findlinks' ,
'fireball' ,
'francis' ,
'gaisbot' ,
'gamekitbot' ,
'gazz@nttr.co.jp' ,
'geonabot' ,
'getrax crawler' ,
'gigabot' ,
'girafa.com' ,
'goforitbot' ,
'googlebot' ,
'grub-client' ,
'holmes' ,
'houxoucrawler' ,
'http://www.almaden.ibm.com/cs/crawler' ,
'http://www.istarthere.com' ,
'http://www.relevantnoise.com' ,
'httrack ?' ,
'ia_archiver' ,
'ichiro' ,
'iltrovatore-setaccio' ,
'inelabot' ,
'infoseek' ,
'inktomi.com' ,
'irlbot' ,
'jetbot' ,
'jobspider_ba' ,
'kazoombot' ,
'larbin' ,
'libwww' ,
'linkwalker' ,
'lmspider' ,
'mackster' ,
'mediapartners-google' ,
'microsoft url control' ,
'mj12bot' ,
'moreoverbot' ,
'mozdex' ,
'msnbot' ,
'msrbot' ,
'naverbot' ,
'netresearchserver' ,
'ng/2.0' ,
'np(bot)' ,
'nutch' ,
'objectssearch' ,
'ocelli' ,
'omniexplorer_bot' ,
'openbot' ,
'overture' ,
'patwebbot' ,
'php' ,
'phpdig' ,
'pilgrim html-crawler' ,
'pipeliner' ,
'pompos' ,
'psbot' ,
'python-urllib' ,
'quepasacreep' ,
'robozilla' ,
'rpt-httpclient' ,
'savvybot' ,
'scooter' ,
'search.ch' ,
'seekbot' ,
'semager' ,
'seznambot' ,
'sherlock' ,
'shelob' ,
'sitesearch' ,
'snapbot' ,
'snappreviewbot' ,
'speedy spider' ,
'sphere scout' ,
'stackrambler' ,
'steeler' ,
'surveybot' ,
'szukacz' ,
'technoratibot' ,
'telnet' ,
'themiragorobot' ,
'thesubot' ,
'thumbshots-de-bot' ,
'topicblogs' ,
'turnitinbot' ,
'tutorgigbot' ,
'tutorial crawler' ,
'twiceler' ,
'vagabondo' ,
'versus' ,
'voilabot' ,
'w3c_css_validator' ,
'w3c_validator' ,
'w3c-checklink' ,
'web downloader' ,
'webcopier' ,
'webcrawler' ,
'webfilter robot' ,
'west wind internet protocols' ,
'wget' ,
'wwweasel robot' ,
'wwwster' ,
'xaldon webspider' ,
'xenu' ,
'yahoo! slurp' ,
'yahoofeedseeker' ,
'yahoo-mmcrawler' ,
'zao' ,
'zipppbot' ,
'zyborg' ,
);
foreach ( $bots as $bot ) {
if ( stristr ( $user_agent , $bot ) !== false ) {
return true ;
}
}
return false ;
}
### Referer nach Suchmaschinen-Queries und interner Suche pr<70> fen und Suchstring extrahieren
function sem_getKeyword ( $referer ) {
$keyword = @ parse_url ( $referer );
if ( preg_match ( " /google \ ./i " , $keyword [ " host " ])) {
if ( preg_match ( " /imgurl/i " , $keyword [ " query " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = substr ( $q [ " prev " ], 10 );
}
else if ( preg_match ( " /translate \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
}
else {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
}
if ( $keyword == " " ) return ; return " Google: " . $keyword ;
}
elseif ( preg_match ( " /search \ .live \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " LiveSearch: " . $keyword ;
}
elseif ( preg_match ( " /bing \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " Bing: " . $keyword ;
}
elseif ( preg_match ( " /yahoo \ ./i " , $keyword [ " host " ])) {
if ( preg_match ( " /images/i " , $keyword [ " query " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " p " ];
}
else {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " p " ];
}
if ( $keyword == " " ) return ; return " Yahoo: " . $keyword ;
}
elseif ( preg_match ( " /aol \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " AOL: " . $keyword ;
}
elseif ( preg_match ( " /aolsvc \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " AOL: " . $keyword ;
}
elseif ( preg_match ( " /search \ .msn \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " MSN: " . $keyword ;
}
elseif ( preg_match ( " /gmx \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " su " ];
if ( $keyword == " " ) return ; return " GMX: " . $keyword ;
}
elseif ( preg_match ( " / \ .bild \ .t \ -/i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " query " ];
if ( $keyword == " " ) return ; return " BILD: " . $keyword ;
}
elseif ( preg_match ( " /t \ -online \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " T-Online: " . $keyword ;
}
elseif ( preg_match ( " /suche \ .web \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " su " ];
if ( $keyword == " " ) return ; return " WEB.de: " . $keyword ;
}
elseif ( preg_match ( " /suche \ .lycos \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " query " ];
if ( $keyword == " " ) return ; return " Lycos: " . $keyword ;
}
elseif ( preg_match ( " /altavista \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " Altavista: " . $keyword ;
}
elseif ( preg_match ( " /alltheweb \ ./i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " q " ];
if ( $keyword == " " ) return ; return " alltheweb: " . $keyword ;
}
elseif ( preg_match ( " /technorati \ .com \ /search \ // " , $referer )) {
$q = preg_split ( " /technorati \ .com \ /search \ // " , $referer , - 1 , PREG_SPLIT_NO_EMPTY );
$keyword = $q [ 1 ];
if ( $keyword == " " ) return ; return " Technorati: " . $keyword ;
}
elseif ( preg_match ( " / " . $homehost . " /i " , $keyword [ " host " ])) {
parse_str ( $keyword [ " query " ], $q );
$keyword = $q [ " s " ];
if ( $keyword == " " ) return ; return " Interne Suche: " . $keyword ;
}
else {
return ;
}
}
### Anzahl der Datens<6E> tze in der statz-Tabelle
function sem_showNumStatzEntries () {
global $wpdb ;
$numstatzentries = $wpdb -> get_var ( " SELECT COUNT(id) FROM " . $wpdb -> statz );
return $numstatzentries ; // Zahl
}
### Aufgezeichnete Tage in der statz-Tabelle
function sem_countDaysInStatzTable () {
global $wpdb ;
$firstdate = $wpdb -> get_var ( " SELECT MIN(time) FROM " . $wpdb -> statz . " LIMIT 0,1 " );
if ( ! $firstdate ) {
return 1 ;
}
else {
$firstdate = strtotime ( $firstdate ); $now = time ();
$days = ( int ) (( $now - $firstdate ) / ( 60 * 60 * 24 ) + 1 );
return $days ; // KOMPLETTE! Tage
}
}
### Wenn Tage in statz-Tabelle kleiner als Tage in Daily-Statz, dann nimm Tage in Daily-Statz
function sem_compareLimitDays2DailyStatz () {
global $wpdb ;
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
if ( sem_countDaysInStatzTable () << $sem_options [ " statz_days_limit " ]) {
$sem_options [ " statz_days_limit " ] = sem_countDaysInStatzTable ();
2011-05-02 10:30:11 +00:00
update_option ( " semmelstatzR_options " , $sem_options );
2011-05-02 09:17:45 +00:00
}
}
### Zeigt Copyright-Notiz an
function sem_showCopyright () {
2011-05-02 10:30:11 +00:00
print " <p class='copyright'>semmelstatzR " . SEMMELSTATZ_VERSION . " ist (c) kopfhoch-studio 2005-2009<br />
2011-05-02 09:17:45 +00:00
< a target = '_blank' style = 'border:none;' href = 'http://www.kopfhoch-studio.de/blog/2765' >
2011-05-02 10:30:11 +00:00
< img src = '".get_option(' siteurl ')."/wp-content/plugins/semmelstatzR/img/statz.png' /></ a ></ p > " ;
2011-05-02 09:17:45 +00:00
}
### statz-Tabelle leeren (NICHT L<> SCHEN!!!)
function sem_truncateStatzTable () {
global $wpdb , $userip ;
$wpdb -> query ( 'TRUNCATE TABLE ' . $wpdb -> statz );
sem_optStatzTable ();
$wpdb -> query ( " INSERT INTO ` $wpdb->statz `(ip, time, referer, page, username) VALUES('127.0.0.1', NOW(),NULL,0,'statz-Tabelle geleert') " );
}
### Obsolet, bleibt aber aus Kompatibilit<69> tsgr<67> nden zu SEMMELSTATZ_DELETE
function sem_delOldRecords ( $days ) {
return true ;
}
### simpleEncoding f<> r die GoogleChartAPI
function sem_encodeChartData ( $values ) {
$maxValue = max ( $values );
$simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
$chartData = " s: " ;
for ( $i = 0 ; $i < count ( $values ); $i ++ ) {
$currentValue = $values [ $i ];
if ( $currentValue > - 1 ) {
$chartData .= substr ( $simpleEncoding , 61 * ( $currentValue / $maxValue ), 1 );
}
else {
$chartData .= '_' ;
}
}
return $chartData ;
}
### Datens<6E> tze <20> lter als statz_recdays_limit-Tage l<> schen
function sem_delOutOfLimit () {
global $wpdb ;
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
$today = time (); $days = $sem_options [ " statz_recdays_limit " ];
$enddatum = $today - ( $days * 86400 );
$enddatum = date ( " Y-m-d " , $enddatum ) . " 23:59:59 " ;
$wpdb -> query ( " DELETE FROM " . $wpdb -> statz . " WHERE time <= ' " . $enddatum . " ' " );
sem_optStatzTable ();
}
### Wenn AUTOMATISCHES LIMIT aktiviert, dann LIMITIERE und erh<72> he NEXT_CRON
function sem_doCronStatzLimit () {
sem_delOutOfLimit ();
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
$statz_next_cron = $sem_options [ " statz_next_cron " ] + 86400 ;
$sem_options [ " statz_next_cron " ] = $statz_next_cron ;
2011-05-02 10:30:11 +00:00
update_option ( " semmelstatzR_options " , $sem_options );
2011-05-02 09:17:45 +00:00
}
### Konvertiert Strings von utf-8 in ISO-8859
function sem_encodeToIso ( $string ) {
return mb_convert_encoding ( $string , " ISO-8859-1 " , mb_detect_encoding ( $string , " UTF-8, ISO-8859-1, ISO-8859-15 " , true ));
}
### statz-Tabelle optimieren
function sem_optStatzTable () {
global $wpdb ;
$wpdb -> query ( " OPTIMIZE TABLE " . $wpdb -> statz );
}
### Unter bestimmten Voraussetzungen den Vortag in die statzhist-Tabelle schreiben
function sem_writeYesterdayToHist () {
global $wpdb ;
if ( ! $wpdb -> get_var ( " SELECT date FROM " . $wpdb -> statzhist . " WHERE substring(date,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) " )) {
if ( $wpdb -> get_var ( " SELECT COUNT(ip) FROM " . $wpdb -> statz . " WHERE substring(time,1,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) " )) {
$yesterdays = $wpdb -> get_results ( " SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors, COUNT(DISTINCT referer)
AS referers , substring ( time , 1 , 10 ) AS date FROM " . $wpdb->statz . " WHERE substring ( time , 1 , 10 ) = DATE_SUB ( CURDATE (),
INTERVAL 1 DAY ) GROUP BY date " );
foreach ( $yesterdays as $yesterday ) {
$date = $yesterday -> date ;
$visitors = $yesterday -> visitors ;
$hits = $yesterday -> hits ;
$referers = $yesterday -> referers ;
}
$sql = $wpdb -> query ( " INSERT INTO " . $wpdb -> statzhist . " (date, referers, visitors, hits)
VALUES ( '$date' , $referers , $visitors , $hits ) " );
}
else {
$date = $wpdb -> get_var ( " SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) " );
$sql = $wpdb -> query ( " INSERT INTO " . $wpdb -> statzhist . " (date, referers, visitors, hits) VALUES(' $date ', 0, 0, 0) " );
}
}
}
### Summen der vergangenen Tage in die statzhist schreiben */
function sem_writeOldDaysToHist () {
global $wpdb ;
if ( ! $wpdb -> get_var ( " SELECT date FROM " . $wpdb -> statzhist . " WHERE substring(date,1,10) <= DATE_SUB(CURDATE(), INTERVAL 1 DAY) " )) {
$theolddays = $wpdb -> get_results ( " SELECT COUNT(ip) AS hits, COUNT(DISTINCT ip) AS visitors,
COUNT ( DISTINCT referer ) AS referers , substring ( time , 1 , 10 ) AS date FROM " . $wpdb->statz . " WHERE
substring ( time , 1 , 10 ) <= DATE_SUB ( CURDATE (), INTERVAL 1 DAY ) GROUP BY date ORDER BY time ASC " );
foreach ( $theolddays as $theoldday ) {
$date = $theoldday -> date ;
$visitors = $theoldday -> visitors ; if ( ! $visitors ) $visitors = 0 ;
$hits = $theoldday -> hits ; if ( ! $hits ) $hits = 0 ;
$referers = $theoldday -> referers ; if ( ! $referers ) $referers = 0 ;
$sql = $wpdb -> query ( " INSERT INTO " . $wpdb -> statzhist . " (date, referers, visitors, hits)
VALUES ( '$date' , $referers , $visitors , $hits ) " );
}
}
}
############################################## Ende SEMMELSTATZ-interne Funktionen
############################################## Beginn TEMPLATE-Funktionen
### Zeigt die letzten $num_posts-Posts an: Titel und absolutes Datum - CSS-id: #lastposts
function sem_showLastPosts ( $num_posts = 10 ) {
global $wpdb ;
$lastposts = $wpdb -> get_results ( " SELECT ID, post_title FROM " . $wpdb -> posts . " WHERE post_status = 'publish'
AND post_type = 'post' ORDER BY post_date DESC LIMIT 0 , " . $num_posts );
print " <div id='lastposts'> " ;
if ( empty ( $lastposts )) {
print " ... noch keine Beiträge " ;
}
else {
print " <b>Die letzten " . $num_posts . " Beiträge</b><br /> " ;
foreach ( $lastposts as $lastpost ) {
$posttitle = $lastpost -> post_title ;
$permalink = get_permalink ( $lastpost -> ID );
$postdate = $lastpost -> post_date ;
print " <a href=' " . $permalink . " '> " . $posttitle . " </a><br /> \n " ;
}
}
print " </div> " ;
}
### Zeigt die letzten $num_comments-Kommentare an: Autor und Post mit relativem Datum - CSS-id: #lastcomments
function sem_showLastComments ( $num_comments = 10 ) {
global $wpdb ;
$comments = $wpdb -> get_results ( " SELECT comment_author, comment_ID, comment_post_ID, comment_date
FROM " . $wpdb->comments . " WHERE comment_approved = '1' ORDER BY comment_date DESC LIMIT 0 , $num_comments " );
print " <div id='lastcomments'> " ;
if ( empty ( $comments )) {
print " Keine Kommentare " ;
}
else {
print " <b>Die letzten " . $num_comments . " Kommentare</b><br /> " ;
foreach ( $comments as $comment ) {
$commentday = strtotime ( substr ( $comment -> comment_date , 1 , 10 ));
$today = time ();
$difference = ceil (( $today - $commentday ) / ( 60 * 60 * 24 )) - 1 ;
if ( $difference == 0 ) {
$commentdate = " Heute um " . mysql2date ( " G:i " , $comment -> comment_date );
}
elseif ( $difference == 1 ) {
$commentdate = " Gestern um " . mysql2date ( " G:i " , $comment -> comment_date );
}
elseif ( $difference == 2 ) {
$commentdate = " Vorgestern um " . mysql2date ( " G:i " , $comment -> comment_date );
}
else {
$commentdate = mysql2date ( " j. F G:i " , $comment -> comment_date );
}
print " <a href=' " . get_permalink ( $comment -> comment_post_ID ) . " #comment- $comment->comment_ID '> $comment->comment_author @ " . get_the_title ( $comment -> comment_post_ID ) . " , $commentdate </a><br /> \n " ;
}
}
print " </div> " ;
}
### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads
function sem_showMostReads ( $num_reads = 10 ) {
global $wpdb ;
$mostreads = $wpdb -> get_results ( " SELECT post_title AS posttitle, guid AS postid, hits AS hits FROM " . $wpdb -> posts . " WHERE hits != '0' GROUP BY postid ORDER BY hits DESC LIMIT 0, $num_reads " );
print " <div id='mostreads'> " ;
if ( empty ( $mostreads )) {
print " ... noch keine Einträge " ;
}
else {
print " <b>Die " . $num_reads . " meist gelesenen Beiträge</b><br /> " ;
foreach ( $mostreads as $mostread ) {
$posttitle = $mostread -> posttitle ;
$postid = $mostread -> postid ;
//$permalink = get_permalink($mostread->postid);
$hits = $mostread -> hits ;
print " <a target='_blank' href=' " . $postid . " '> " . $posttitle . " ( " . $hits . " )</a><br /> \n " ;
}
}
print " </div> " ;
}
### Zeigt die $num_reads meist gelesenen Posts an - CSS-id: #mostreads - ACHTUNG: Das Ergebnis der Funktion basiert auf der statz-Tabelle
function sem_showMostReadsOld ( $num_reads = 10 ) {
global $wpdb ;
$mostreads = $wpdb -> get_results ( " SELECT post_title AS posttitle, " . $wpdb -> posts . " .guid AS postid,
COUNT ( " . $wpdb->statz . " . page ) AS count FROM " . $wpdb->posts . " , " . $wpdb->statz . " WHERE
" . $wpdb->statz . " . page = " . $wpdb->posts . " . ID GROUP BY postid ORDER BY count DESC LIMIT 0 , $num_reads " );
print " <div id='mostreads'> " ;
if ( empty ( $mostreads )) {
print " ... noch keine Einträge " ;
}
else {
print " <b>Die " . $num_reads . " meist gelesenen Beiträge</b><br /> " ;
foreach ( $mostreads as $mostread ) {
$posttitle = $mostread -> posttitle ;
$postid = $mostread -> postid ;
//$permalink = get_permalink($mostread->postid);
$count = $mostread -> count ;
print " <a target='_blank' href=' " . $postid . " '> " . $posttitle . " ( " . $count . " )</a><br /> \n " ;
}
}
print " </div> " ;
}
### Zeigt die $num_commented meist kommentierten Posts an - CSS-id: #mostcommented
function sem_showMostCommented ( $num_commented = 10 ) {
global $wpdb ;
$mostcommented = $wpdb -> get_results ( " SELECT guid, id, post_title, COUNT(*) AS count FROM " . $wpdb -> comments . " , " . $wpdb -> posts . " WHERE
comment_approved = '1' AND comment_post_id = id GROUP BY id , post_title ORDER BY count DESC LIMIT 0 , $num_commented " );
print " <div id='mostcommented'> " ;
if ( empty ( $mostcommented )) {
print " ... noch keine Einträge " ;
}
else {
print " <b>Die " . $num_commented . " meist kommentierten Beiträge</b><br /> " ;
foreach ( $mostcommented as $key => $mostcommented ) {
$posttitle = $mostcommented -> post_title ;
$count = $mostcommented -> count ;
$postid = $mostcommented -> guid ;
print " <a target='_blank' href=' " . $postid . " '> " . $posttitle . " ( " . $count . " )</a><br /> \n " ;
}
}
print " </div> " ;
}
### Zeigt einen Z<> hler der Hits im jeweiligen Post. ACHTUNG: FUNKTIONIERT NUR IM LOOP (index.php, single.php)
function sem_showPostHitsInLoop ( $postid ) {
global $wpdb ;
$hits = $wpdb -> get_var ( " SELECT hits FROM $wpdb->posts WHERE ID = $postid LIMIT 0,1 " );
return $hits ;
}
### Anzahl aller Posts/Pages
function sem_showTotalPosts () {
global $wpdb ;
$totalposts = $wpdb -> get_var ( " SELECT COUNT(ID) AS num FROM " . $wpdb -> posts . " WHERE post_status = 'publish' LIMIT 0,1 " );
return $totalposts ; // Ganzzahl
}
### Anzahl aller Kommentare
function sem_showTotalComments () {
global $wpdb ;
$totalcomments = $wpdb -> get_var ( " SELECT COUNT(comment_ID) AS num FROM " . $wpdb -> comments . " WHERE comment_approved = '1' LIMIT 0,1 " );
return $totalcomments ; // Ganzzahl
}
### Anzahl aller User seit Beginn der Statzaufzeichnung
function sem_showTotalUsers () {
global $wpdb ;
$totalusers = $wpdb -> get_var ( " SELECT SUM(visitors) FROM " . $wpdb -> statzhist . " LIMIT 0,1 " );
if ( ! $totalusers ) $totalusers = 0 ;
return $totalusers ; // Ganzzahl
}
### Anzahl User pro Tag im Durchschnitt
function sem_showAverageUserPerDay () {
$averageuser = ceil ( sem_showTotalUsers () / sem_showStatzDays ());
return $averageuser ;
}
### Datum des 1. Posts = Blogstart
function sem_showFirstPostDate () {
global $wpdb ;
$firstpostdate = $wpdb -> get_var ( " SELECT MIN(post_date) FROM " . $wpdb -> posts . " WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00:00' LIMIT 0,1 " );
$firstpostdate = mysql2date ( " j.n.Y " , $firstpostdate );
return $firstpostdate ; // String T.M.JJJJ
}
### Datum des 1. Kommentars
function sem_showFirstCommentDate () {
global $wpdb ;
$firstcommentdate = $wpdb -> get_var ( " SELECT MIN(comment_date) FROM " . $wpdb -> comments . " WHERE comment_approved = '1'
AND comment_date != '0000-00-00 00:00:00' LIMIT 0 , 1 " );
$firstcommentdate = mysql2date ( " j.n.Y " , $firstcommentdate );
return $firstcommentdate ; // String T.M.JJJJ
}
### Anzahl der Kommentierer nach Nicknamen
function sem_showNumCommenters () {
global $wpdb ;
$totalcommenters = $wpdb -> get_var ( " SELECT COUNT(DISTINCT comment_author) FROM " . $wpdb -> comments . " WHERE comment_approved = '1' LIMIT 0,1 " );
if ( ! $totalcommenters ) $totalcommenters = 0 ;
return $totalcommenters ; // Ganzzahl
}
### Blog besteht seit x Tagen
function sem_showPostDays () {
global $wpdb ;
$firstdate = $wpdb -> get_var ( " SELECT MIN(post_date) AS date FROM " . $wpdb -> posts . " WHERE post_status = 'publish' AND post_date != '0000-00-00 00:00' LIMIT 0,1 " );
$firstdate = strtotime ( $firstdate ); $now = time ();
$blogdays = ( int ) (( $now - $firstdate ) / ( 60 * 60 * 24 ));
$blogdays = $blogdays + 1 ;
return $blogdays ; // Ganzzahl
}
### Tage seit 1. Kommentar
function sem_showCommentDays () {
global $wpdb ;
$firstdate = $wpdb -> get_var ( " SELECT MIN(comment_date) AS date FROM " . $wpdb -> comments . " LIMIT 0,1 " );
$firstdate = strtotime ( $firstdate ); $now = time ();
$commentdays = ( int ) (( $now - $firstdate ) / ( 60 * 60 * 24 ));
$commentdays = $commentdays + 1 ;
return $commentdays ; // Ganzzahl
}
### durchschn. Posts pro Tag
function sem_showPostsPerDay () {
global $wpdb ;
$postsperday = ( int ) sem_showTotalPosts () / ( int ) sem_showPostDays ();
return $postsperday ; // Ganzzahl
}
### durchschn. Kommentare pro Tag
function sem_showCommentsPerDay () {
global $wpdb ;
$commentsperday = ( int ) sem_showTotalComments () / ( int ) sem_showCommentDays ();
return $commentsperday ; // Ganzzahl
}
### Startdatum der Gesamtstatistik (Basis: statzhist)
function sem_showStatzStartDate () {
global $wpdb ;
$statzhiststartdate = $wpdb -> get_var ( " SELECT MIN(date) FROM " . $wpdb -> statzhist . " WHERE date != '0000-00-00 00:00' LIMIT 0,1 " );
$statzhiststartdate = mysql2date ( " j.n.Y " , $statzhiststartdate );
// if(!$statzhiststartdate) $statzhiststartdate= "xx.xx.xxxx";
return $statzhiststartdate ; // String T.M.JJJJ
}
### Dauer der Statistikaufzeichnung in Tagen (Basis: statzhist)
function sem_showStatzDays () {
global $wpdb ;
$firstdate = $wpdb -> get_var ( " SELECT MIN(date) FROM " . $wpdb -> statzhist . " LIMIT 0,1 " );
if ( ! $firstdate ) {
return 1 ;
}
else {
$firstdate = strtotime ( $firstdate ); $now = time ();
$statzdays = ( int ) (( $now - $firstdate ) / ( 60 * 60 * 24 ));
return $statzdays ; // Ganzzahl
}
}
### Anzahl der Online-Besucher - Verweildauer in den Einstellungen
function sem_showNumUsersOnline () {
global $wpdb ;
2011-05-02 10:30:11 +00:00
$sem_options = get_option ( 'semmelstatzR_options' ); ### optionsarray auslesen
2011-05-02 09:17:45 +00:00
$onlinetime = $sem_options [ " statz_online_time " ];
$numonline = $wpdb -> get_var ( " SELECT COUNT(DISTINCT ip) FROM " . $wpdb -> statz . " WHERE time > Now() - INTERVAL " . $onlinetime . " SECOND " );
return $numonline ; // Ganzzahl
}
### Anzahl der heutigen Besucher
function sem_showUsersToday () {
global $wpdb ; $today = date ( " Y-m-d " );
$todayusers = $wpdb -> get_var ( " SELECT COUNT(DISTINCT ip) FROM " . $wpdb -> statz . " WHERE time >= ' $today ' LIMIT 0, 1 " );
return $todayusers ;
}
### Anzahl der gestrigen Besucher
function sem_showUsersYesterday () {
global $wpdb ;
$yesterdaysusers = $wpdb -> get_var ( " SELECT visitors FROM " . $wpdb -> statzhist . " WHERE date = substr(DATE_SUB(NOW(), INTERVAL 1 DAY),1,10) LIMIT 0, 1 " );
return $yesterdaysusers ;
}
##################################################### Ende TEMPLATE-Funktionen
?>