Count access statistics for anonymous users only (Drupal 7)

Estimated reading time of this article: 2 minutes

Do you want to count access statistics for anonymous visitors only? Do you want to reset access statistics for unpublished articles?

I'm assuming you're using the Drupal 7 statistics module.

Instead of copying the whole statistics module and changing it, there's a simple trick: Undo the +1 of registered users by an -1. Thus, the increase of the statistics module is compensated.

<?php/** * Implements hook_exit(). * * Compensate access statistics of registered users with -1. * See statistics_exit(). */function YOUR_MODULE_exit() {  global $user// When serving cached pages with the 'page_cache_without_database'  // configuration, system variables need to be loaded. This is a major  // performance decrease for non-database page caches, but with Statistics  // module, it is likely to also have 'statistics_enable_access_log' enabled,  // in which case we need to bootstrap to the session phase anyway.  drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);  if (variable_get('statistics_count_content_views', 0)) {    // We are counting content views.    if ($user->uid != 0 && arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == NULL) {      // A node has been viewed, so update the node's counters.      db_merge('node_counter')        ->key(array('nid' => arg(1)))        ->fields(array(          'daycount' => 1,          'totalcount' => 1,          'timestamp' => REQUEST_TIME,        ))        ->expression('daycount', 'GREATEST(daycount, 1) - 1')        ->expression('totalcount', 'GREATEST(totalcount, 1) - 1')        ->execute();    }  }}?>

Additionally, it's possible to reset node access statistics of unpublished articles with each cron run.

<?php/** * Reset counts of unpublished nodes. * Implements hook_cron(). */function YOUR_MODULE_cron() {  if (variable_get('statistics_count_content_views', 0)) {    // Reset counts of unpublished nodes.    $unpblished = db_select('node', 'n')      ->condition('n.status', 0, '=')      ->fields('n', array('nid'));    db_update('node_counter')      ->fields(array('daycount' => 0, 'totalcount' => 0))      ->condition('nid', $unpblished, 'IN')      ->execute();    watchdog('ibexutils', 'Reset counts of unpublished nodes.', array());  }}?>