PluginProbe ʕ •ᴥ•ʔ
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more / 4.4.8
EmbedPress – PDF Embedder, Embed PDF viewer, YouTube Videos, 3D FlipBook, Social feeds & more v4.4.8
4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 trunk 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.5.0 1.6.0 1.6.1 1.6.2 1.6.3 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2.0 2.2.1 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.1.3 3.2.0 3.2.1 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.6.8 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 4.0.0 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.14 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.10 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2.0 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8 4.2.9 4.3.0 4.3.1 4.4.0 4.4.1 4.4.10 4.4.11 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9 4.5.0 4.5.1
embedpress / EmbedPress / Includes / Classes / Analytics / Browser_Detector.php
embedpress / EmbedPress / Includes / Classes / Analytics Last commit date
Analytics_Manager.php 9 months ago Browser_Detector.php 9 months ago Content_Cache_Manager.php 9 months ago Data_Collector.php 7 months ago Email_Reports.php 9 months ago Export_Manager.php 9 months ago License_Manager.php 9 months ago Milestone_Manager.php 9 months ago Pro_Data_Collector.php 9 months ago REST_API.php 9 months ago
Browser_Detector.php
294 lines
1 <?php
2
3 namespace EmbedPress\Includes\Classes\Analytics;
4
5 defined('ABSPATH') or die("No direct script access allowed.");
6
7 /**
8 * EmbedPress Browser Detector
9 *
10 * Detects browser and device information for analytics
11 *
12 * @package EmbedPress
13 * @author EmbedPress <help@embedpress.com>
14 * @copyright Copyright (C) 2023 WPDeveloper. All rights reserved.
15 * @license GPLv3 or later
16 * @since 4.2.7
17 */
18 class Browser_Detector
19 {
20 /**
21 * User agent string
22 *
23 * @var string
24 */
25 private $user_agent;
26
27 /**
28 * Constructor
29 *
30 * @param string $user_agent
31 */
32 public function __construct($user_agent = null)
33 {
34 $this->user_agent = $user_agent ?: (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '');
35 }
36
37 /**
38 * Detect browser and device information
39 *
40 * @return array
41 */
42 public function detect()
43 {
44 return [
45 'browser_name' => $this->get_browser_name(),
46 'browser_version' => $this->get_browser_version(),
47 'operating_system' => $this->get_operating_system(),
48 'device_type' => $this->get_device_type()
49 ];
50 }
51
52 /**
53 * Get browser name
54 *
55 * @return string
56 */
57 private function get_browser_name()
58 {
59 $browsers = [
60 'Edge' => 'Edge',
61 'Chrome' => 'Chrome',
62 'Firefox' => 'Firefox',
63 'Safari' => 'Safari',
64 'Opera' => 'Opera',
65 'Internet Explorer' => 'MSIE|Trident'
66 ];
67
68 foreach ($browsers as $browser => $pattern) {
69 if (preg_match('/(' . $pattern . ')/i', $this->user_agent)) {
70 return $browser;
71 }
72 }
73
74 return 'Unknown';
75 }
76
77 /**
78 * Get browser version
79 *
80 * @return string
81 */
82 private function get_browser_version()
83 {
84 $browser = $this->get_browser_name();
85 $version = 'Unknown';
86
87 switch ($browser) {
88 case 'Chrome':
89 if (preg_match('/Chrome\/([0-9.]+)/', $this->user_agent, $matches)) {
90 $version = $matches[1];
91 }
92 break;
93 case 'Firefox':
94 if (preg_match('/Firefox\/([0-9.]+)/', $this->user_agent, $matches)) {
95 $version = $matches[1];
96 }
97 break;
98 case 'Safari':
99 if (preg_match('/Version\/([0-9.]+)/', $this->user_agent, $matches)) {
100 $version = $matches[1];
101 }
102 break;
103 case 'Edge':
104 if (preg_match('/Edge\/([0-9.]+)/', $this->user_agent, $matches)) {
105 $version = $matches[1];
106 } elseif (preg_match('/Edg\/([0-9.]+)/', $this->user_agent, $matches)) {
107 $version = $matches[1];
108 }
109 break;
110 case 'Opera':
111 if (preg_match('/Opera\/([0-9.]+)/', $this->user_agent, $matches)) {
112 $version = $matches[1];
113 } elseif (preg_match('/OPR\/([0-9.]+)/', $this->user_agent, $matches)) {
114 $version = $matches[1];
115 }
116 break;
117 case 'Internet Explorer':
118 if (preg_match('/MSIE ([0-9.]+)/', $this->user_agent, $matches)) {
119 $version = $matches[1];
120 } elseif (preg_match('/rv:([0-9.]+)/', $this->user_agent, $matches)) {
121 $version = $matches[1];
122 }
123 break;
124 }
125
126 return $version;
127 }
128
129 /**
130 * Get operating system
131 *
132 * @return string
133 */
134 private function get_operating_system()
135 {
136 $os_array = [
137 'Windows 11' => 'Windows NT 10.0.*Windows NT 10.0.*22000',
138 'Windows 10' => 'Windows NT 10.0',
139 'Windows 8.1' => 'Windows NT 6.3',
140 'Windows 8' => 'Windows NT 6.2',
141 'Windows 7' => 'Windows NT 6.1',
142 'Windows Vista' => 'Windows NT 6.0',
143 'Windows XP' => 'Windows NT 5.1|Windows XP',
144 'macOS Big Sur' => 'Mac OS X 10_16|Mac OS X 11',
145 'macOS Monterey' => 'Mac OS X 12',
146 'macOS Ventura' => 'Mac OS X 13',
147 'macOS Sonoma' => 'Mac OS X 14',
148 'macOS' => 'Mac OS X|Macintosh',
149 'iOS' => 'iPhone|iPad',
150 'Android' => 'Android',
151 'Linux' => 'Linux',
152 'Ubuntu' => 'Ubuntu',
153 'Chrome OS' => 'CrOS'
154 ];
155
156 foreach ($os_array as $os => $pattern) {
157 if (preg_match('/(' . $pattern . ')/i', $this->user_agent)) {
158 return $os;
159 }
160 }
161
162 return 'Unknown';
163 }
164
165 /**
166 * Get device type
167 *
168 * @return string
169 */
170 private function get_device_type()
171 {
172 // Check for mobile devices
173 $mobile_patterns = [
174 'iPhone', 'iPod', 'Android.*Mobile', 'BlackBerry', 'webOS',
175 'Windows Phone', 'Opera Mini', 'IEMobile', 'Mobile'
176 ];
177
178 foreach ($mobile_patterns as $pattern) {
179 if (preg_match('/(' . $pattern . ')/i', $this->user_agent)) {
180 return 'mobile';
181 }
182 }
183
184 // Check for tablets
185 $tablet_patterns = [
186 'iPad', 'Android(?!.*Mobile)', 'Tablet', 'PlayBook', 'Kindle'
187 ];
188
189 foreach ($tablet_patterns as $pattern) {
190 if (preg_match('/(' . $pattern . ')/i', $this->user_agent)) {
191 return 'tablet';
192 }
193 }
194
195 // Default to desktop
196 return 'desktop';
197 }
198
199 /**
200 * Check if device is mobile
201 *
202 * @return bool
203 */
204 public function is_mobile()
205 {
206 return $this->get_device_type() === 'mobile';
207 }
208
209 /**
210 * Check if device is tablet
211 *
212 * @return bool
213 */
214 public function is_tablet()
215 {
216 return $this->get_device_type() === 'tablet';
217 }
218
219 /**
220 * Check if device is desktop
221 *
222 * @return bool
223 */
224 public function is_desktop()
225 {
226 return $this->get_device_type() === 'desktop';
227 }
228
229 /**
230 * Get detailed browser information
231 *
232 * @return array
233 */
234 public function get_detailed_info()
235 {
236 $info = $this->detect();
237
238 return array_merge($info, [
239 'user_agent' => $this->user_agent,
240 'is_mobile' => $this->is_mobile(),
241 'is_tablet' => $this->is_tablet(),
242 'is_desktop' => $this->is_desktop(),
243 'supports_webp' => $this->supports_webp(),
244 'supports_avif' => $this->supports_avif()
245 ]);
246 }
247
248 /**
249 * Check if browser supports WebP
250 *
251 * @return bool
252 */
253 private function supports_webp()
254 {
255 // Chrome 23+, Firefox 65+, Safari 14+, Edge 18+
256 $browser = $this->get_browser_name();
257 $version = $this->get_browser_version();
258
259 switch ($browser) {
260 case 'Chrome':
261 return version_compare($version, '23', '>=');
262 case 'Firefox':
263 return version_compare($version, '65', '>=');
264 case 'Safari':
265 return version_compare($version, '14', '>=');
266 case 'Edge':
267 return version_compare($version, '18', '>=');
268 default:
269 return false;
270 }
271 }
272
273 /**
274 * Check if browser supports AVIF
275 *
276 * @return bool
277 */
278 private function supports_avif()
279 {
280 // Chrome 85+, Firefox 93+
281 $browser = $this->get_browser_name();
282 $version = $this->get_browser_version();
283
284 switch ($browser) {
285 case 'Chrome':
286 return version_compare($version, '85', '>=');
287 case 'Firefox':
288 return version_compare($version, '93', '>=');
289 default:
290 return false;
291 }
292 }
293 }
294