PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / RealTime / RecentTraffic.php
independent-analytics / IAWP / RealTime Last commit date
RealTime.php 5 days ago RecentTraffic.php 5 days ago
RecentTraffic.php
145 lines
1 <?php
2
3 namespace IAWP\RealTime;
4
5 use IAWP\Date_Range\Exact_Date_Range;
6 use IAWP\Examiner_Config;
7 use IAWP\Illuminate_Builder;
8 use IAWP\Query_Taps;
9 use IAWP\Tables;
10 /** @internal */
11 class RecentTraffic
12 {
13 private array $short_labels;
14 private array $long_labels;
15 private array $timestamps;
16 private int $visitors;
17 private array $views;
18 private array $orders;
19 private array $clicks;
20 private array $form_submissions;
21 public function __construct(Exact_Date_Range $range, ?Examiner_Config $examiner_config)
22 {
23 $this->populate_data($range, $examiner_config);
24 }
25 public function short_labels() : array
26 {
27 return $this->short_labels;
28 }
29 public function long_labels() : array
30 {
31 return $this->long_labels;
32 }
33 public function timestamps() : array
34 {
35 return $this->timestamps;
36 }
37 public function visitor_count() : int
38 {
39 return $this->visitors;
40 }
41 public function views() : array
42 {
43 return $this->views;
44 }
45 public function view_count() : int
46 {
47 return \array_sum($this->views);
48 }
49 public function orders() : array
50 {
51 return $this->orders;
52 }
53 public function order_count() : int
54 {
55 return \array_sum($this->orders);
56 }
57 public function clicks() : array
58 {
59 return $this->clicks;
60 }
61 public function click_count() : int
62 {
63 return \array_sum($this->clicks);
64 }
65 public function form_submissions() : array
66 {
67 return $this->form_submissions;
68 }
69 public function form_submission_count() : int
70 {
71 return \array_sum($this->form_submissions);
72 }
73 private function populate_data(Exact_Date_Range $range, ?Examiner_Config $examiner_config) : void
74 {
75 $visitors_query = Illuminate_Builder::new()->selectRaw('COUNT(DISTINCT sessions.visitor_id) AS visitors')->from(Tables::views(), 'views')->leftJoin(Tables::sessions() . ' AS sessions', 'sessions.session_id', '=', 'views.session_id')->tap(Query_Taps::tap_related_to_examined_record($examiner_config))->whereBetween('viewed_at', [$range->iso_start(), $range->iso_end()]);
76 $visitors = $visitors_query->value('visitors');
77 $clicks_query = Illuminate_Builder::new()->selectRaw('0 AS views')->selectRaw('COUNT(*) AS clicks')->selectRaw('0 AS form_submissions')->selectRaw('0 AS orders')->selectRaw("ABS(CEILING(TIMESTAMPDIFF(SECOND, '{$range->iso_end()}', clicks.created_at) / 10)) AS interval_ago")->from(Tables::clicks(), 'clicks')->leftJoin(Tables::views() . ' AS views', 'views.id', '=', 'clicks.view_id')->leftJoin(Tables::sessions() . ' AS sessions', 'sessions.session_id', '=', 'views.session_id')->tap(Query_Taps::tap_related_to_examined_record($examiner_config))->whereBetween('clicks.created_at', [$range->iso_start(), $range->iso_end()])->groupBy('interval_ago');
78 $orders_query = Illuminate_Builder::new()->selectRaw('0 AS views')->selectRaw('0 AS clicks')->selectRaw('0 AS form_submissions')->selectRaw('COUNT(*) AS orders')->selectRaw("ABS(CEILING(TIMESTAMPDIFF(SECOND, '{$range->iso_end()}', orders.created_at) / 10)) AS interval_ago")->from(Tables::orders(), 'orders')->leftJoin(Tables::views() . ' AS views', 'views.id', '=', 'orders.view_id')->leftJoin(Tables::sessions() . ' AS sessions', 'sessions.session_id', '=', 'views.session_id')->tap(Query_Taps::tap_related_to_examined_record($examiner_config))->whereBetween('orders.created_at', [$range->iso_start(), $range->iso_end()])->groupBy('interval_ago');
79 $form_submissions_query = Illuminate_Builder::new()->selectRaw('0 AS views')->selectRaw('0 AS clicks')->selectRaw('COUNT(*) AS form_submissions')->selectRaw('0 AS orders')->selectRaw("ABS(CEILING(TIMESTAMPDIFF(SECOND, '{$range->iso_end()}', form_submissions.created_at) / 10)) AS interval_ago")->from(Tables::form_submissions(), 'form_submissions')->leftJoin(Tables::views() . ' AS views', 'views.id', '=', 'form_submissions.view_id')->leftJoin(Tables::sessions() . ' AS sessions', 'sessions.session_id', '=', 'views.session_id')->tap(Query_Taps::tap_related_to_examined_record($examiner_config))->whereBetween('form_submissions.created_at', [$range->iso_start(), $range->iso_end()])->groupBy('interval_ago');
80 $views_query = Illuminate_Builder::new()->selectRaw('COUNT(*) AS views')->selectRaw('0 AS clicks')->selectRaw('0 AS form_submissions')->selectRaw('0 AS orders')->selectRaw("ABS(CEILING(TIMESTAMPDIFF(SECOND, '{$range->iso_end()}', views.viewed_at) / 10)) AS interval_ago")->from(Tables::views(), 'views')->leftJoin(Tables::sessions() . ' AS sessions', 'sessions.session_id', '=', 'views.session_id')->tap(Query_Taps::tap_related_to_examined_record($examiner_config))->whereBetween('viewed_at', [$range->iso_start(), $range->iso_end()])->unionAll($clicks_query)->unionAll($form_submissions_query)->unionAll($orders_query)->groupBy('interval_ago');
81 $union_query = Illuminate_Builder::new()->select(['interval_ago'])->selectRaw('SUM(views) AS views')->selectRaw('SUM(clicks) AS clicks')->selectRaw('SUM(form_submissions) AS form_submissions')->selectRaw('SUM(orders) AS orders')->from($views_query)->groupBy('interval_ago')->orderBy('interval_ago');
82 // Illuminate_Builder::ray($union_query);
83 $rows = $union_query->get()->all();
84 $interval = new \DateInterval('PT10S');
85 $period = new \DatePeriod($range->start(), $interval, $range->end());
86 foreach ($period as $interval => $date) {
87 $views = 0;
88 $orders = 0;
89 $clicks = 0;
90 $form_submissions = 0;
91 // Search the rows for a matching interval to pull data from
92 foreach ($rows as $row) {
93 if (\intval($row->interval_ago) !== $interval) {
94 continue;
95 }
96 $views = \intval($row->views);
97 $orders = \intval($row->orders);
98 $clicks = \intval($row->clicks);
99 $form_submissions = \intval($row->form_submissions);
100 break;
101 }
102 $this->short_labels[] = $this->get_short_label($interval);
103 $this->long_labels[] = $this->get_long_label($interval);
104 $this->timestamps[] = $date->getTimestamp();
105 $this->views[] = $views;
106 $this->orders[] = $orders;
107 $this->clicks[] = $clicks;
108 $this->form_submissions[] = $form_submissions;
109 }
110 $this->short_labels = \array_reverse($this->short_labels);
111 $this->long_labels = \array_reverse($this->long_labels);
112 $this->timestamps = \array_reverse($this->timestamps);
113 $this->visitors = $visitors;
114 $this->views = \array_reverse($this->views);
115 $this->orders = \array_reverse($this->orders);
116 $this->clicks = \array_reverse($this->clicks);
117 $this->form_submissions = \array_reverse($this->form_submissions);
118 }
119 private function get_short_label(int $interval) : string
120 {
121 if ($interval === 0) {
122 return \__('Now', 'independent-analytics');
123 }
124 $seconds_passed = $interval * 10;
125 $is_whole_minute = $seconds_passed % 60 === 0;
126 if (!$is_whole_minute) {
127 // Don't show short labels for partial minutes
128 return '';
129 }
130 $minutes_passed = $seconds_passed / 60;
131 if ($minutes_passed === 1) {
132 return '-' . $minutes_passed . ' ' . \__('min', 'independent-analytics');
133 }
134 return '-' . $minutes_passed . ' ' . \__('mins', 'independent-analytics');
135 }
136 private function get_long_label(int $interval) : string
137 {
138 if ($interval === 0) {
139 return \__('Now', 'independent-analytics');
140 }
141 $seconds_passed = $interval * 10;
142 return $seconds_passed . ' ' . \__('seconds ago', 'independent-analytics');
143 }
144 }
145