PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 1.7
Independent Analytics – WordPress Analytics Plugin v1.7
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 / inc / queries / views.php
independent-analytics / inc / queries Last commit date
range_query.php 4 years ago referrers.php 4 years ago resources.php 4 years ago views.php 4 years ago
views.php
183 lines
1 <?php
2
3 namespace IAWP;
4
5 class Views extends Range_Query
6 {
7 const REFERRERS = 'REFERRERS';
8 const RESOURCES = 'RESOURCES';
9 private $views;
10 private $prev_period_views;
11 private $daily_views;
12 private $visitors;
13 private $prev_period_visitors;
14 private $daily_visitors;
15
16 public function __construct($type, $ids = null, $start = null, $end = null)
17 {
18 parent::__construct($start, $end);
19 if ($type == self::RESOURCES || $type == self::REFERRERS) {
20 $this->query($type, $ids);
21 } else {
22 throw new \Exception('IAWP_Views: Unsupported type');
23 }
24 }
25
26 public function views()
27 {
28 return $this->views;
29 }
30
31 public function prev_period_views()
32 {
33 return $this->prev_period_views;
34 }
35
36 public function daily_views()
37 {
38 return $this->daily_views;
39 }
40
41 public function views_percentage_growth()
42 {
43 if ($this->views() == 0 || $this->prev_period_views() == 0) {
44 return 0;
45 } else {
46 return round((($this->views() / $this->prev_period_views()) - 1) * 100);
47 }
48 }
49
50 public function visitors()
51 {
52 return $this->visitors;
53 }
54
55 public function visitors_percentage_growth()
56 {
57 if ($this->visitors() == 0 || $this->prev_period_visitors() == 0) {
58 return 0;
59 } else {
60 return round((($this->visitors() / $this->prev_period_visitors()) - 1) * 100);
61 }
62 }
63
64 public function prev_period_visitors()
65 {
66 return $this->prev_period_visitors;
67 }
68
69 public function daily_visitors()
70 {
71 return $this->daily_visitors;
72 }
73
74 private function query($type, $ids)
75 {
76 global $wpdb;
77 $views_table = DB::views_table();
78
79 if (is_null($ids)) {
80 $skip_in = 1;
81 $ids = [0];
82 $in = '%s';
83 } elseif (count($ids) == 0) {
84 $skip_in = 0;
85 $ids = [0];
86 $in = '%s';
87 } else {
88 $skip_in = 0;
89 $in = implode(',', array_fill(0, count($ids), '%s'));
90 }
91
92 $column = $type == self::RESOURCES ? 'resource_id' : 'referrer_id';
93 $has_null_id = false;
94 foreach ($ids as $id) {
95 if (is_null($id)) {
96 $has_null_id = true;
97 break;
98 }
99 }
100 $null_check = '';
101
102 if ($type == self::REFERRERS && $has_null_id) {
103 $null_check = "OR $column IS NULL";
104 }
105
106 $utc = Timezone::utc_offset();
107 $local_offset = Timezone::local_offset();
108 $query = $wpdb->prepare(
109 "SELECT DATE(CONVERT_TZ(viewed_at, '$utc', '$local_offset')) as date, COUNT(*) as views, COUNT(DISTINCT visitor_id) as visitors FROM $views_table WHERE viewed_at BETWEEN %s AND %s AND (%d = 1 OR $column IN ($in) $null_check) GROUP BY DATE(CONVERT_TZ(viewed_at, '$utc', '$local_offset'))",
110 $this->formatted_start(),
111 $this->formatted_end(),
112 $skip_in,
113 ...$ids
114 );
115 $rows = $wpdb->get_results($query);
116
117 $visitors_query = $wpdb->prepare(
118 "SELECT count(DISTINCT visitor_id) as visitors FROM $views_table WHERE viewed_at BETWEEN %s AND %s AND (%d = 1 OR $column IN ($in) $null_check)",
119 $this->formatted_start(),
120 $this->formatted_end(),
121 $skip_in,
122 ...$ids
123 );
124 $visitors = intval($wpdb->get_var($visitors_query));
125
126 $prev_period_query = $wpdb->prepare(
127 "SELECT count(*) as views, count(DISTINCT visitor_id) as visitors FROM $views_table WHERE viewed_at BETWEEN %s AND %s AND (%d = 1 OR $column IN ($in) $null_check)",
128 $this->prev_period_formatted_start(),
129 $this->prev_period_formatted_end(),
130 $skip_in,
131 ...$ids
132 );
133 $prev_period_results = $wpdb->get_row($prev_period_query);
134 $prev_period_views = $prev_period_results->views;
135 $prev_period_visitors = $prev_period_results->visitors;
136
137 $views = 0;
138 $daily_views = [];
139 $daily_visitors = [];
140
141 foreach ($rows as $row) {
142 $views += $row->views;
143 $daily_views[] = [$row->date, intval($row->views)];
144 $daily_visitors[] = [$row->date, intval($row->visitors)];
145 }
146
147 $this->views = $views;
148 $this->prev_period_views = $prev_period_views;
149 $this->visitors = $visitors;
150 $this->prev_period_visitors = $prev_period_visitors;
151 $this->daily_views = $this->fill_in_data_range($daily_views);
152 $this->daily_visitors = $this->fill_in_data_range($daily_visitors);
153 }
154
155 private function fill_in_data_range($partial_data)
156 {
157 $interval = new \DateInterval('P1D');
158 $start = clone $this->start();
159 $end = clone $this->end();
160 $user_timezone = new \DateTimeZone(Timezone::local_offset());
161 $start->setTimezone($user_timezone);
162 $end->setTimezone($user_timezone);
163
164 $date_range = new \DatePeriod($start, $interval, $end);
165 $new_data = [];
166
167 foreach ($date_range as $date) {
168 $views = 0;
169
170 foreach ($partial_data as $data_point) {
171 if ($date == (new \DateTime($data_point[0], $user_timezone))) {
172 $views = intval($data_point[1]);
173 break;
174 }
175 }
176
177 $new_data[] = [$date, $views];
178 }
179
180 return $new_data;
181 }
182 }
183