From 68e28c8c1bd53e50de779e3797e09587a34bcd5d Mon Sep 17 00:00:00 2001
From: Steven Ayers <5614-bluegeek9@users.noreply.drupalcode.org>
Date: Sat, 8 Mar 2025 17:58:02 +0000
Subject: [PATCH] Issue #3454500 by bluegeek9: track visits and visitors

---
 src/Form/SettingsForm.php |  2 ++
 visitors.module           | 22 ++++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/Form/SettingsForm.php b/src/Form/SettingsForm.php
index c65e8945..87e2e78b 100644
--- a/src/Form/SettingsForm.php
+++ b/src/Form/SettingsForm.php
@@ -246,6 +246,7 @@ class SettingsForm extends ConfigFormBase {
         4838400 => $this->t('1 month 3 weeks'),
         9676800 => $this->t('3 months 3 weeks'),
         31536000 => $this->t('1 year'),
+        34214400 => $this->t('13 months'),
       ],
       '#description' =>
       $this->t('Older visitors log entries (including referrer statistics) will be automatically discarded. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)',
@@ -273,6 +274,7 @@ class SettingsForm extends ConfigFormBase {
         4838400 => $this->t('1 month 3 weeks'),
         9676800 => $this->t('3 months 3 weeks'),
         31536000 => $this->t('1 year'),
+        34214400 => $this->t('13 months'),
       ],
       '#description' =>
       $this->t('Control how long or if visits by bots are logged.'),
diff --git a/visitors.module b/visitors.module
index 86c4f3f0..153f4913 100644
--- a/visitors.module
+++ b/visitors.module
@@ -22,13 +22,17 @@ use Drupal\Core\Render\BubbleableMetadata;
 function visitors_cron(): void {
   try {
     $settings = \Drupal::config('visitors.settings');
+    $connection = \Drupal::database();
 
     $flush_log_timer = $settings->get('flush_log_timer') ?? 0;
     if ($flush_log_timer > 0) {
       $delete_since = (string) time() - $flush_log_timer;
       // Clean up expired access logs.
-      \Drupal::database()->delete('visitors')
-        ->condition('visitors_date_time', $delete_since, '<')
+      $connection->delete('visitors_view')
+        ->condition('created', $delete_since, '<')
+        ->execute();
+      $connection->delete('visitors_visit')
+        ->condition('exit_time', $delete_since, '<')
         ->execute();
     }
 
@@ -39,10 +43,20 @@ function visitors_cron(): void {
       if ($bot_retention_log == 1) {
         $delete_since = '0';
       }
+
       // Clean up expired access logs.
-      \Drupal::database()->delete('visitors')
+      $subquery = $connection->select('visitors_visit', 'visit')
+        ->fields('visit', ['id'])
+        ->condition('visit.bot', 1)
+        ->condition('entry_time', $delete_since, '<');
+      $connection->delete('visitors_view')
+        ->condition('visit_id', $subquery, 'IN')
+        ->condition('created', $delete_since, '<')
+        ->execute();
+
+      $connection->delete('visitors_visit')
         ->condition('bot', 1)
-        ->condition('visitors_date_time', $delete_since, '<')
+        ->condition('exit_time', $delete_since, '<')
         ->execute();
     }
 
-- 
GitLab