PluginProbe
WP-Stateless – Google Cloud Storage / trunk
WP-Stateless – Google Cloud Storage vtrunk
4.4.3 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.3.0 2.3.1 2.3.2 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.2.0 3.2.1 3.2.2 All 62 releases
wp-stateless / lib / classes / status / class-info.php

class-info.php in WP-Stateless – Google Cloud Storage trunk, at lib/classes/status/class-info.php

445 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * System Info class
4 *
5 * @since 4.0.3
6 */
7
8 namespace wpCloud\StatelessMedia\Status;
9
10 use wpCloud\StatelessMedia\Singleton;
11 use wpCloud\StatelessMedia\Helper;
12
13 class Info {
14 use Singleton;
15
16 protected function __construct() {
17 StatelessInfo::instance();
18 GoogleCloudInfo::instance();
19
20 $this->_init_hooks();
21 }
22
23 private function _init_hooks() {
24 add_action('wp_ajax_stateless_check_ajax', [$this, 'check_ajax']);
25
26 add_action('wp_stateless_status_tab_content', [$this, 'tab_content'], 10);
27
28 add_filter('wp_stateless_status_tab_visible', array($this, 'status_tab_visible'), 10, 1);
29
30 add_filter('wp_stateless_status_info_values_server', [$this, 'get_server_values'], 10);
31 add_filter('wp_stateless_status_info_values_server', [$this, 'get_php_values'], 20);
32 add_filter('wp_stateless_status_info_values_server', [$this, 'get_php_modules'], 30);
33
34 add_filter('wp_stateless_status_info_values_wordpress', [$this, 'get_wordpress_network_values'], 10);
35 add_filter('wp_stateless_status_info_values_wordpress', [$this, 'get_wordpress_attachments'], 20);
36 add_filter('wp_stateless_status_info_values_wordpress', [$this, 'get_wordpress_theme'], 30);
37 add_filter('wp_stateless_status_info_values_wordpress', [$this, 'get_wordpress_plugins'], 40);
38 }
39
40 /**
41 * Check AJAX requests are working
42 */
43 public function check_ajax() {
44 if ( !check_ajax_referer('stateless_check_ajax') ) {
45 wp_send_json_error([
46 'status' => __('Error', ud_get_stateless_media()->domain),
47 'message' => __('Invalid nonce', ud_get_stateless_media()->domain),
48 ]);
49 }
50
51 wp_send_json_success([
52 'status' => 'Ok',
53 ]);
54 }
55
56 /**
57 * Get boolean value (Yes/No)
58 *
59 * @param bool $value
60 * @return string
61 */
62 private function _get_bool_value($value) {
63 return (bool) $value ? __('Yes', ud_get_stateless_media()->domain) : __('No', ud_get_stateless_media()->domain);
64 }
65
66 /**
67 * Get server values
68 *
69 * @return array
70 */
71 public function get_server_values($values = []) {
72 global $wpdb;
73
74 $server_architecture = function_exists( 'php_uname' )
75 ? [ php_uname('s'), php_uname('r'), php_uname('m') ]
76 : [ __('Unknown', ud_get_stateless_media()->domain) ];
77
78 $rows = [
79 'server_architecture' => [
80 'label' => __('Server architecture', ud_get_stateless_media()->domain),
81 'value' => implode(' ', $server_architecture),
82 ],
83 'web_server' => [
84 'label' => __('Web server', ud_get_stateless_media()->domain),
85 'value' => isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : __('Unknown', ud_get_stateless_media()->domain),
86 ],
87 'mysql' => [
88 'label' => __('MySQL version', ud_get_stateless_media()->domain),
89 'value' => $wpdb->db_server_info(),
90 ],
91 ];
92
93 // Detect the default DB engine
94 try {
95 $default_engine = '';
96 $engines = $wpdb->get_results('SHOW ENGINES', ARRAY_A);
97
98 foreach ($engines as $engine) {
99 if ( $engine['Support'] === 'DEFAULT' ) {
100 $default_engine = $engine['Engine'];
101 break;
102 }
103 }
104
105 if ( !empty($default_engine) ) {
106 $rows['mysql_engine'] = [
107 'label' => __('MySQL default engine', ud_get_stateless_media()->domain),
108 'value' => $default_engine,
109 ];
110 }
111 } catch (\Throwable $e) {
112 }
113
114 $rows['php'] = [
115 'label' => __('PHP Version', ud_get_stateless_media()->domain),
116 'value' => PHP_VERSION,
117 ];
118
119 return $values + $rows;
120 }
121
122 /**
123 * Get PHP ini values
124 *
125 * @return array
126 */
127 public function get_php_values($values = []) {
128 if ( !function_exists('ini_get') ) {
129 $values['php_ini_get'] = [
130 'label' => __('PHP Config', ud_get_stateless_media()->domain),
131 'value' => __('Unable to determine some settings, init_get() is disabled.', ud_get_stateless_media()->domain),
132 ];
133
134 return $values;
135 }
136
137 $rows = [
138 'php_memory_limit' => [
139 'label' => __('PHP Memory Limit', ud_get_stateless_media()->domain),
140 'value' => ini_get('memory_limit'),
141 ],
142 'php_max_input_vars' => [
143 'label' => __('PHP Max Input Vars', ud_get_stateless_media()->domain),
144 'value' => ini_get('max_input_vars'),
145 ],
146 'php_max_post_size' => [
147 'label' => __('PHP Max Post Size', ud_get_stateless_media()->domain),
148 'value' => ini_get('post_max_size'),
149 ],
150 'php_time_limit' => [
151 'label' => __('PHP Time Limit', ud_get_stateless_media()->domain),
152 'value' => ini_get('max_execution_time'),
153 ],
154 'max_upload_size' => [
155 'label' => __('Max Upload Size', ud_get_stateless_media()->domain),
156 'value' => ini_get('upload_max_filesize'),
157 ],
158 'allow_url_fopen' => [
159 'label' => __('Allow URL-aware fopen Wrappers', ud_get_stateless_media()->domain),
160 'value' => $this->_get_bool_value( ini_get('allow_url_fopen') ),
161 ],
162 ];
163
164 return $values + $rows;
165 }
166
167 /**
168 * Get PHP modules
169 *
170 * @return array
171 */
172 public function get_php_modules($values = []) {
173 $values['extensions'] = [
174 'label' => __('Loaded Extensions', ud_get_stateless_media()->domain),
175 'value' => implode(', ', get_loaded_extensions()),
176 ];
177
178 return $values;
179 }
180
181 /**
182 * Get WP global network values
183 *
184 * @return array
185 */
186 public function get_wordpress_network_values($values = []) {
187 $rows = [
188 'home_url' => [
189 'label' => __('Home URL', ud_get_stateless_media()->domain),
190 'value' => get_bloginfo( 'url' ),
191 ],
192 'site_url' => [
193 'label' => __('Site URL', ud_get_stateless_media()->domain),
194 'value' => get_bloginfo( 'wpurl' ),
195 ],
196 'version' => [
197 'label' => __('Version', ud_get_stateless_media()->domain),
198 'value' => get_bloginfo('version'),
199 ],
200 'multisite' => [
201 'label' => __('Multisite', ud_get_stateless_media()->domain),
202 'value' => $this->_get_bool_value( is_multisite() ),
203 ],
204 'memory_limit' => [
205 'label' => __('Memory Limit', ud_get_stateless_media()->domain),
206 'value' => WP_MEMORY_LIMIT,
207 ],
208 ];
209
210 return $values + $rows;
211 }
212
213 /**
214 * Format WP theme value
215 *
216 * @param \WP_Theme $theme
217 * @return string|null
218 */
219 private function _format_theme_value($theme) {
220 if ( !is_a($theme, '\WP_Theme') ) {
221 return null;
222 }
223
224 $value = [$theme->name, $theme->version];
225
226 return implode(' ', $value);
227 }
228
229 /**
230 * Get WP attachments info
231 *
232 * @return array
233 */
234 public function get_wordpress_attachments($values = []) {
235 if ( is_network_admin() ) {
236 return $values;
237 }
238
239 global $wpdb;
240 $total = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'attachment'");
241
242 $size_keys = get_intermediate_image_sizes();
243 $sizes = [];
244
245 foreach ($size_keys as $size) {
246 // Check if image size is not a name (e.g. '1536x1536')
247 $parts = explode('x', $size);
248
249 if ( count($parts) === 2 && is_numeric($parts[0]) && is_numeric($parts[1]) ) {
250 $sizes[] = $size;
251 continue;
252 }
253
254 $width = get_option("{$size}_size_w");
255 $height = get_option("{$size}_size_h");
256 $sizes[] = sprintf('(%dx%d) %s', $width, $height, $size);
257 }
258
259 $rows = [
260 'total_attachments' => [
261 'label' => __('Total Attachments', ud_get_stateless_media()->domain),
262 'value' => $total,
263 ],
264 'image_sizes' => [
265 'label' => sprintf( __('Image Sizes (%d)', ud_get_stateless_media()->domain), count($sizes) ),
266 'value' => implode(', ', $sizes)
267 ],
268 ];
269
270 return $values + $rows;
271 }
272
273 /**
274 * Get WP theme values
275 *
276 * @return array
277 */
278 public function get_wordpress_theme($values = []) {
279 if ( is_network_admin() ) {
280 return $values;
281 }
282
283 $theme = wp_get_theme();
284
285 if ( !is_a($theme, '\WP_Theme') ) {
286 return $values;
287 }
288
289 $rows = [
290 'theme' => [
291 'label' => __('Theme', ud_get_stateless_media()->domain),
292 'value' => $this->_format_theme_value($theme),
293 ],
294 ];
295
296 $parent = $theme->parent();
297
298 if ( is_a($parent, '\WP_Theme') ) {
299 $rows['parent_theme'] = [
300 'label' => __('Parent Theme', ud_get_stateless_media()->domain),
301 'value' => $this->_format_theme_value($parent),
302 ];
303 }
304
305 return $values + $rows;
306 }
307
308 /**
309 * Format WP plugin value
310 *
311 * @param array $plugin
312 * @param bool $is_network
313 * @return string
314 */
315 private function _format_plugin_value($plugin, $is_network = false) {
316 $value = [$plugin['Name'], $plugin['Version']];
317
318 if ($is_network) {
319 $value[] = __('(network)', ud_get_stateless_media()->domain);
320 }
321
322 return implode(' ', $value);
323 }
324
325 /**
326 * Get WP plugins list
327 *
328 * @return array
329 */
330 public function get_wordpress_plugins($values = []) {
331 if ( is_network_admin() ) {
332 return $values;
333 }
334
335 $result = [];
336
337 $plugins = get_plugins();
338 $active_plugins = (array) get_option( 'active_plugins', [] );
339 $network_plugins = (array) get_site_option( 'active_sitewide_plugins', [] );
340 $network_plugins = array_keys($network_plugins);
341
342 foreach ($plugins as $file => $plugin) {
343 if ( in_array($file, $network_plugins) ) {
344 $result[] = $this->_format_plugin_value($plugin, true);
345
346 continue;
347 }
348
349 if ( in_array($file, $active_plugins) ) {
350 $result[] = $this->_format_plugin_value($plugin);
351 }
352 }
353
354 $values['active_plugins'] = [
355 'label' => __('Active Plugins', ud_get_stateless_media()->domain),
356 'value' => implode(', ', $result),
357 ];
358
359 return $values;
360 }
361
362 /**
363 * Get section values
364 *
365 * @param string $key
366 * @return array|null
367 */
368 private function _get_section_values($key) {
369 try {
370 $values = apply_filters("wp_stateless_status_info_values_$key", []);
371 } catch (\Throwable $e) {
372 $values = [
373 'error' => [
374 'label' => __('Error', ud_get_stateless_media()->domain),
375 'value' => $e->getMessage(),
376 ],
377 ];
378 }
379
380 return empty($values) ? null : Helper::array_of_objects($values);
381 }
382
383 private function _prepare_copy_text($sections) {
384 $text = '';
385
386 foreach ($sections as $section) {
387 $text .= '### ' . $section->title . PHP_EOL . PHP_EOL;
388
389 foreach ($section->rows as $row) {
390 $text .= sprintf('%s: %s%s',
391 strip_tags($row->label),
392 strip_tags($row->value),
393 PHP_EOL
394 );
395 }
396
397 $text .= PHP_EOL;
398 }
399
400 return sprintf('```%s%s```', PHP_EOL, $text);
401 }
402
403 /**
404 * Outputs 'Info' section content on Status tab.
405 */
406 public function tab_content() {
407 $sections = [
408 'server' => [
409 'title' => __('Server', ud_get_stateless_media()->domain),
410 ],
411 'wordpress' => [
412 'title' => __('WordPress', ud_get_stateless_media()->domain),
413 ],
414 'stateless' => [
415 'title' => __('WP-Stateless', ud_get_stateless_media()->domain),
416 ],
417 'google_cloud' => [
418 'title' => __('Google Cloud', ud_get_stateless_media()->domain),
419 ],
420 ];
421
422 foreach ($sections as $key => $section) {
423 $rows = $this->_get_section_values($key);
424
425 if ( !empty($rows) ) {
426 $sections[$key]['rows'] = $rows;
427 } else {
428 unset($sections[$key]);
429 }
430 }
431
432 $sections = Helper::array_of_objects($sections);
433 $copy_text = $this->_prepare_copy_text($sections);
434
435 include ud_get_stateless_media()->path('static/views/status-sections/info.php', 'dir');
436 }
437
438 /**
439 * Load 'Status' tab only in admin area
440 */
441 public function status_tab_visible($visible) {
442 return is_admin();
443 }
444 }
445