PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.7.1
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.7.1
4.7.0 4.6.1 4.6.0 4.5.5 4.5.4 4.5.3 4.5.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.5 3.2.6 3.2.7 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.7.0 3.7.1 All 111 releases
wp-optimize / includes / class-wp-optimize-admin.php

class-wp-optimize-admin.php in WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance 3.7.1, at includes/class-wp-optimize-admin.php

790 lines 29.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if (!defined('ABSPATH')) die('No direct access allowed');
3
4 if (!class_exists('WP_Optimize_Admin')) :
5
6 class WP_Optimize_Admin {
7
8 /**
9 * Class constructor
10 */
11 public function __construct() {
12 if (is_multisite()) {
13 add_action('network_admin_menu', array($this, 'admin_menu'));
14 } else {
15 add_action('admin_menu', array($this, 'admin_menu'));
16 }
17 }
18
19 /**
20 * Returns singleton instance object
21 *
22 * @return WP_Optimize_Admin Returns `WP_Optimize_Admin` object
23 */
24 public static function instance() {
25 static $_instance = null;
26 if (empty($_instance)) {
27 $_instance = new self();
28 }
29 return $_instance;
30 }
31
32
33 /**
34 * Builds the Tabs that should be displayed
35 *
36 * @return array Returns all tabs specified array
37 */
38 public function get_tabs($page) {
39 // define tabs for pages.
40 $pages_tabs = array(
41 'WP-Optimize' => array(
42 'optimize' => __('Optimizations', 'wp-optimize'),
43 'tables' => __('Tables', 'wp-optimize'),
44 'settings' => __('Settings', 'wp-optimize'),
45 'table_analysis' => __('Table usage', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>'
46 ),
47 'wpo_images' => array(
48 'smush' => __('Compress images', 'wp-optimize'),
49 'dimensions' => __('Images dimensions', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>',
50 'unused' => __('Unused images and sizes', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>',
51 'lazyload' => __('Lazy-load', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>',
52 ),
53 'wpo_cache' => array(
54 'cache' => __('Page cache', 'wp-optimize'),
55 'preload' => __('Preload', 'wp-optimize'),
56 'advanced' => __('Advanced settings', 'wp-optimize'),
57 'gzip' => __('Gzip compression', 'wp-optimize'),
58 'settings' => __('Static file headers', 'wp-optimize') // Adds a settings tab
59 ),
60 'wpo_minify' => array(
61 "status" => __('Minify status', 'wp-optimize'),
62 "js" => __('JavaScript', 'wp-optimize').'<span class="menu-pill disabled hidden">'.__('Disabled', 'wp-optimize').'</span>',
63 "css" => __('CSS', 'wp-optimize').'<span class="menu-pill disabled hidden">'.__('Disabled', 'wp-optimize').'</span>',
64 "font" => __('Fonts', 'wp-optimize'),
65 "analytics" => __('Analytics', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>',
66 "settings" => __('Settings', 'wp-optimize'),
67 "preload" => __('Preload', 'wp-optimize'),
68 "advanced" => __('Advanced', 'wp-optimize')
69 ),
70 'wpo_settings' => array(
71 'settings' => array(
72 'title' => __('Settings', 'wp-optimize'),
73 ),
74 // 'updraftcentral' => array(
75 // 'title' => 'UpdraftCentral'
76 // ),
77 ),
78 'wpo_support' => array('support' => __('Support / FAQs', 'wp-optimize')),
79 'wpo_mayalso' => array('may_also' => __('Premium / Plugin family', 'wp-optimize')),
80 );
81
82 $tabs = (array_key_exists($page, $pages_tabs)) ? $pages_tabs[$page] : array();
83 return apply_filters('wp_optimize_admin_page_'.$page.'_tabs', $tabs);
84 }
85
86 /**
87 * Main page structure.
88 */
89 public function display_admin() {
90 $capability_required = WP_Optimize()->capability_required();
91 $can_run_optimizations = WP_Optimize()->can_run_optimizations();
92 $can_manage_options = WP_Optimize()->can_manage_options();
93
94 if (!current_user_can($capability_required) || (!$can_run_optimizations && !$can_manage_options)) {
95 echo "Permission denied.";
96 return;
97 }
98
99 $this->register_admin_content();
100
101 echo '<div id="wp-optimize-wrap">';
102
103 WP_Optimize()->include_template('admin-page-header.php', false, array('show_notices' => !(WP_Optimize()->get_install_or_update_notice()->show_current_notice())));
104
105 do_action('wpo_admin_after_header');
106
107 echo '<div id="actions-results-area"></div>';
108
109 $pages = $this->get_submenu_items();
110
111 foreach ($pages as $page) {
112 if (isset($page['menu_slug'])) {
113 $this->display_admin_page($page['menu_slug']);
114 }
115 }
116
117 do_action('wpo_admin_before_closing_wrap');
118
119 // closes main plugin wrapper div. #wp-optimize-wrap
120 echo '</div><!-- END #wp-optimize-wrap -->';
121
122 }
123
124 /**
125 * Prepare and display admin page with $page id.
126 *
127 * @param string $page wp-optimize page id i.e. dashboard, database, images, cache, ...
128 */
129 public function display_admin_page($page) {
130
131 $active_page = !empty($_REQUEST['page']) ? $_REQUEST['page'] : '';
132
133 echo '<div class="wpo-page' . ($active_page == $page ? ' active' : '') . '" data-whichpage="'.$page.'">';
134
135 echo '<div class="wpo-main">';
136
137 // get defined tabs for $page.
138 $tabs = $this->get_tabs($page);
139
140 // if no tabs defined for $page then use $page as $active_tab for load template, doing related actions e t.c.
141 if (empty($tabs)) {
142 $active_tab = $page;
143 } else {
144 $tab_keys = array_keys($tabs);
145 $default_tab = apply_filters('wp_optimize_admin_'.$page.'_default_tab', $tab_keys[0]);
146 $active_tab = isset($_GET['tab']) ? substr($_GET['tab'], 12) : $default_tab;
147 if (!in_array($active_tab, array_keys($tabs))) $active_tab = $default_tab;
148 }
149
150 do_action('wp_optimize_admin_page_'.$page, $active_tab);
151
152 // if tabs defined then display
153 if (!empty($tabs)) {
154 WP_Optimize()->include_template('admin-page-header-tabs.php', false, array('page' => $page, 'active_tab' => $active_tab, 'tabs' => $tabs, 'wpo_is_premium' => WP_Optimize::is_premium()));
155 }
156
157 foreach ($tabs as $tab_id => $tab_description) {
158 // output wrap div for tab with id #wp-optimize-nav-tab-contents-'.$page.'-'.$tab_id
159 echo '<div class="wp-optimize-nav-tab-contents" id="wp-optimize-nav-tab-'.$page.'-'.$tab_id.'-contents" '.(($tab_id == $active_tab) ? '' : 'style="display:none;"').'>';
160
161 echo '<div class="postbox wpo-tab-postbox">';
162 // call action for generate tab content.
163
164 do_action('wp_optimize_admin_page_'.$page.'_'.$tab_id);
165
166 // closes postbox.
167 echo '</div><!-- END .postbox -->';
168 // closes tab wrapper.
169 echo '</div><!-- END .wp-optimize-nav-tab-contents -->';
170 }
171
172 echo '</div><!-- END .wpo-main -->';
173
174 do_action('wp_optimize_admin_after_page_'.$page, $active_tab);
175
176 echo '</div><!-- END .wpo-page -->';
177
178 }
179
180 /**
181 * Define required actions for admin pages.
182 */
183 public function register_admin_content() {
184
185 do_action('wp_optimize_register_admin_content');
186
187 /**
188 * SETTINGS
189 */
190 add_action('wp_optimize_admin_page_wpo_settings_settings', array($this, 'output_dashboard_settings_tab'), 20);
191
192 /**
193 * UpdraftCentral
194 */
195 // add_action('wp_optimize_admin_page_wpo_settings_updraftcentral', array($this, 'output_dashboard_updraftcentral_tab'), 20);
196
197 /**
198 * Premium / other plugins
199 */
200 add_action('wp_optimize_admin_page_wpo_mayalso_may_also', array($this, 'output_dashboard_other_plugins_tab'), 20);
201
202 /**
203 * DATABASE
204 */
205 add_action('wp_optimize_admin_page_WP-Optimize_optimize', array($this, 'output_database_optimize_tab'), 20);
206 add_action('wp_optimize_admin_page_WP-Optimize_tables', array($this, 'output_database_tables_tab'), 20);
207 add_action('wp_optimize_admin_page_WP-Optimize_settings', array($this, 'output_database_settings_tab'), 20);
208 add_action('wp_optimize_admin_page_WP-Optimize_table_analysis', array($this, 'output_table_usage_tab'), 20);
209 /**
210 * CACHE
211 */
212 add_action('wp_optimize_admin_page_wpo_cache_cache', array($this, 'output_page_cache_tab'), 20);
213 if (!WP_Optimize()->does_server_handles_cache()) {
214 add_action('wp_optimize_admin_page_wpo_cache_preload', array($this, 'output_page_cache_preload_tab'), 20);
215 add_action('wp_optimize_admin_page_wpo_cache_advanced', array($this, 'output_page_cache_advanced_tab'), 20);
216 }
217 add_action('wp_optimize_admin_page_wpo_cache_gzip', array($this, 'output_cache_gzip_tab'), 20);
218 add_action('wp_optimize_admin_page_wpo_cache_settings', array($this, 'output_cache_settings_tab'), 20);
219 add_action('wpo_page_cache_advanced_settings', array($this, 'output_cloudflare_settings'), 20);
220 /**
221 * SUPPORT
222 */
223 add_action('wp_optimize_admin_page_wpo_support_support', array($this, 'output_dashboard_support_tab'), 20);
224 // Display Support page.
225
226 if (!WP_Optimize::is_premium()) {
227 /**
228 * Add action for display Images > Unused images and sizes tab.
229 */
230 add_action('wp_optimize_admin_page_wpo_images_unused', array($this, 'admin_page_wpo_images_unused'));
231
232 /**
233 * Add action for display Dashboard > Lazyload tab.
234 */
235 add_action('wp_optimize_admin_page_wpo_images_lazyload', array($this, 'admin_page_wpo_images_lazyload'));
236 } else {
237 /**
238 * Add filter for display footer review message and link.
239 */
240 add_filter('admin_footer_text', array($this, 'display_footer_review_message'));
241 }
242
243 /**
244 * Add action for display Images > Images dimensions tab.
245 */
246 add_action('wp_optimize_admin_page_wpo_images_dimensions', array($this, 'admin_page_wpo_images_dimensions'));
247 }
248
249 /**
250 * Database settings
251 */
252 public function output_database_settings_tab() {
253
254 if (WP_Optimize()->can_manage_options()) {
255 WP_Optimize()->include_template('database/settings.php');
256 } else {
257 $this->prevent_manage_options_info();
258 }
259 }
260
261 /**
262 * Table usage tab
263 *
264 * @return void
265 */
266 public function output_table_usage_tab() {
267 if (WP_Optimize::is_premium()) {
268 $extract = array('is_enabled' => (bool) WP_Optimize()->get_options()->get_option(WPO_DB_Table_Analysis::ENABLED_SETTING_NAME), 'dashboard' => WP_Optimize_Premium()->get_db_table_analysis_dashboard());
269 } else {
270 $extract = array('is_enabled' => false);
271 }
272 WP_Optimize()->include_template('database/table-analysis.php', false, $extract);
273 }
274
275 /**
276 * Dashboard settings
277 */
278 public function output_dashboard_settings_tab() {
279 $options = WP_Optimize()->get_options();
280
281 if ('POST' == $_SERVER['REQUEST_METHOD']) {
282 // Nonce check.
283 check_admin_referer('wpo_settings');
284
285 $output = $options->save_settings($_POST);
286
287 if (isset($_POST['wp-optimize-settings'])) {
288 // save settings request sent.
289 $output = $options->save_settings($_POST);
290 }
291
292 $this->wpo_render_output_messages($output);
293 }
294
295 if (WP_Optimize()->can_manage_options()) {
296 WP_Optimize()->include_template('settings/settings.php');
297 } else {
298 $this->prevent_manage_options_info();
299 }
300 }
301
302 /**
303 * UpdraftCentral settings tab
304 */
305 public function output_dashboard_updraftcentral_tab() {
306 if (WP_Optimize()->can_manage_options()) {
307 global $updraftcentral_host_plugin;
308 $updraftcentral_host_plugin->debugtools_dashboard();
309 } else {
310 $this->prevent_manage_options_info();
311 }
312 }
313
314 /**
315 * Dashboard support tab
316 */
317 public function output_dashboard_support_tab() {
318 WP_Optimize()->include_template('settings/support-and-faqs.php');
319 }
320
321 /**
322 * Dashboard Other plugins / premium tab
323 */
324 public function output_dashboard_other_plugins_tab() {
325 WP_Optimize()->include_template('settings/may-also-like.php');
326 }
327
328 /**
329 * Cache tab
330 */
331 public function output_page_cache_tab() {
332 $wpo_cache = WP_Optimize()->get_page_cache();
333 $wpo_cache_options = $wpo_cache->config->get();
334 $display = $wpo_cache->is_enabled() ? "display: block;" : "display: none;";
335 $error = is_wp_error(WP_Optimize()->get_init_page_cache_status()) ? WP_Optimize()->get_init_page_cache_status()->get_error_message() : '';
336
337 WP_Optimize()->include_template('cache/page-cache.php', false, array(
338 'wpo_cache' => $wpo_cache,
339 'active_cache_plugins' => WP_Optimize_Detect_Cache_Plugins::instance()->get_active_cache_plugins(),
340 'wpo_cache_options' => $wpo_cache_options,
341 'cache_size' => $wpo_cache->get_cache_size(),
342 'display' => $display,
343 'can_purge_the_cache' => $wpo_cache->can_purge_cache(),
344 'auto_preload_purged_contents' => $wpo_cache->should_auto_preload_purged_contents(),
345 'does_server_handles_cache' => WP_Optimize()->does_server_handles_cache(),
346 'error' => $error,
347 ));
348 }
349
350 /**
351 * Preload tab
352 */
353 public function output_page_cache_preload_tab() {
354 $wpo_cache = WP_Optimize()->get_page_cache();
355 $wpo_cache_options = $wpo_cache->config->get();
356 $wpo_cache_preloader = WP_Optimize_Page_Cache_Preloader::instance();
357 $is_running = $wpo_cache_preloader->is_running();
358 $status = $wpo_cache_preloader->get_status_info();
359
360 WP_Optimize()->include_template('cache/page-cache-preload.php', false, array(
361 'wpo_cache_options' => $wpo_cache_options,
362 'is_running' => $is_running,
363 'status_message' => isset($status['message']) ? $status['message'] : '',
364 'schedule_options' => array(
365 'wpo_use_cache_lifespan' => __('Same as cache lifespan', 'wp-optimize'),
366 'wpo_daily' => __('Daily', 'wp-optimize'),
367 'wpo_weekly' => __('Weekly', 'wp-optimize'),
368 'wpo_fortnightly' => __('Fortnightly', 'wp-optimize'),
369 'wpo_monthly' => __('Monthly (approx. - every 30 days)', 'wp-optimize')
370 )
371 ));
372 }
373
374 /**
375 * Advanced tab
376 */
377 public function output_page_cache_advanced_tab() {
378 $wpo_cache = WP_Optimize()->get_page_cache();
379 $wpo_cache_options = $wpo_cache->config->get();
380
381 $cache_exception_conditional_tags = is_array($wpo_cache_options['cache_exception_conditional_tags']) ? join("\n", $wpo_cache_options['cache_exception_conditional_tags']) : '';
382 $cache_exception_urls = is_array($wpo_cache_options['cache_exception_urls']) ? join("\n", $wpo_cache_options['cache_exception_urls']) : '';
383 $cache_exception_cookies = is_array($wpo_cache_options['cache_exception_cookies']) ? join("\n", $wpo_cache_options['cache_exception_cookies']) : '';
384 $cache_exception_browser_agents = is_array($wpo_cache_options['cache_exception_browser_agents']) ? join("\n", $wpo_cache_options['cache_exception_browser_agents']) : '';
385
386 WP_Optimize()->include_template('cache/page-cache-advanced.php', false, array(
387 'wpo_cache' => $wpo_cache,
388 'wpo_cache_options' => $wpo_cache_options,
389 'cache_exception_urls' => $cache_exception_urls,
390 'cache_exception_conditional_tags' => $cache_exception_conditional_tags,
391 'cache_exception_cookies' => $cache_exception_cookies,
392 'cache_exception_browser_agents' => $cache_exception_browser_agents,
393 ));
394 }
395
396 /**
397 * Gzip tab
398 */
399 public function output_cache_gzip_tab() {
400 $wpo_gzip_compression = WP_Optimize()->get_gzip_compression();
401 $wpo_gzip_compression_enabled = $wpo_gzip_compression->is_gzip_compression_enabled(true);
402 $wpo_gzip_headers_information = $wpo_gzip_compression->get_headers_information();
403 $is_cloudflare_site = $this->is_cloudflare_site();
404 $is_gzip_compression_section_exists = $wpo_gzip_compression->is_gzip_compression_section_exists();
405 $wpo_gzip_compression_enabled_by_wpo = $is_gzip_compression_section_exists && $wpo_gzip_compression_enabled && !$is_cloudflare_site && !(is_array($wpo_gzip_headers_information) && 'brotli' == $wpo_gzip_headers_information['compression']);
406
407 WP_Optimize()->include_template('cache/gzip-compression.php', false, array(
408 'wpo_gzip_headers_information' => $wpo_gzip_headers_information,
409 'wpo_gzip_compression_enabled' => $wpo_gzip_compression_enabled,
410 'is_cloudflare_site' => $is_cloudflare_site,
411 'wpo_gzip_compression_enabled_by_wpo' => $wpo_gzip_compression_enabled_by_wpo,
412 'wpo_gzip_compression_settings_added' => $is_gzip_compression_section_exists,
413 'info_link' => 'https://getwpo.com/gzip-compression-explained/',
414 'faq_link' => 'https://getwpo.com/gzip-faq-link/',
415 'class_name' => (!is_wp_error($wpo_gzip_compression_enabled) && $wpo_gzip_compression_enabled ? 'wpo-enabled' : 'wpo-disabled')
416 ));
417 }
418
419 /**
420 * Cache tab
421 */
422 public function output_cache_settings_tab() {
423
424 $wpo_browser_cache = WP_Optimize()->get_browser_cache();
425 $wpo_browser_cache_enabled = $wpo_browser_cache->is_enabled();
426
427 WP_Optimize()->include_template('cache/browser-cache.php', false, array(
428 'wpo_browser_cache_enabled' => $wpo_browser_cache_enabled,
429 'is_cloudflare_site' => $this->is_cloudflare_site(),
430 'wpo_browser_cache_settings_added' => $wpo_browser_cache->is_browser_cache_section_exists(),
431 'class_name' => (true === $wpo_browser_cache_enabled ? 'wpo-enabled' : 'wpo-disabled'),
432 'wpo_browser_cache_expire_days' => WP_Optimize()->get_options()->get_option('browser_cache_expire_days', '28'),
433 'wpo_browser_cache_expire_hours' => WP_Optimize()->get_options()->get_option('browser_cache_expire_hours', '0'),
434 'info_link' => 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching',
435 'faq_link' => 'https://www.digitalocean.com/community/tutorials/how-to-implement-browser-caching-with-nginx-s-header-module-on-ubuntu-16-04',
436 ));
437 }
438
439 /**
440 * Check if is the current site handled with Cloudflare.
441 *
442 * @return bool
443 */
444 public function is_cloudflare_site() {
445 return isset($_SERVER['HTTP_CF_RAY']);
446 }
447
448 /**
449 * Include Cloudflare settings template.
450 */
451 public function output_cloudflare_settings() {
452 if (WP_Optimize::is_premium() || !apply_filters('show_cloudflare_settings', $this->is_cloudflare_site())) return;
453
454 WP_Optimize()->include_template('cache/page-cache-cloudflare-placeholder.php');
455 }
456
457 /**
458 * Outputs the DB optimize Tab
459 */
460 public function output_database_optimize_tab() {
461 $optimizer = WP_Optimize()->get_optimizer();
462 $options = WP_Optimize()->get_options();
463
464 // check if nonce passed.
465 $nonce_passed = (!empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], 'wpo_optimization')) ? true : false;
466
467 // save options.
468 if ($nonce_passed && isset($_POST['wp-optimize'])) $options->save_sent_manual_run_optimization_options($_POST, true);
469
470 $optimize_db = ($nonce_passed && isset($_POST["optimize-db"])) ? true : false;
471
472 $optimization_results = (($nonce_passed) ? $optimizer->do_optimizations($_POST) : false);
473
474 // display optimizations table or restricted access message.
475 if (WP_Optimize()->can_run_optimizations()) {
476 WP_Optimize()->include_template('database/optimize-table.php', false, array('optimize_db' => $optimize_db, 'optimization_results' => $optimization_results, 'load_data' => false, 'does_server_allows_table_optimization' => WP_Optimize()->does_server_allows_table_optimization()));
477 } else {
478 $this->prevent_run_optimizations_message();
479 }
480 }
481
482 /**
483 * Outputs the DB Tables Tab
484 */
485 public function output_database_tables_tab() {
486 // check if nonce passed.
487 $nonce_passed = (!empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], 'wpo_optimization')) ? true : false;
488
489 $optimize_db = ($nonce_passed && isset($_POST["optimize-db"])) ? true : false;
490
491 if (!WP_Optimize()->does_server_allows_table_optimization()) {
492 $message = __('Your server takes care of table optimization', 'wp-optimize');
493 $this->prevent_run_optimizations_message($message);
494 } elseif (WP_Optimize()->can_run_optimizations()) {
495 WP_Optimize()->include_template('database/tables.php', false, array('optimize_db' => $optimize_db, 'load_data' => WP_Optimize()->template_should_include_data()));
496 } else {
497 $this->prevent_run_optimizations_message();
498 }
499 }
500
501 /**
502 * Runs upon the WP action admin_page_wpo_images_unused
503 */
504 public function admin_page_wpo_images_unused() {
505 WP_Optimize()->include_template('images/unused.php');
506 }
507
508 /**
509 * Runs upon the WP action wp_optimize_admin_page_wpo_images_lazyload
510 */
511 public function admin_page_wpo_images_lazyload() {
512 WP_Optimize()->include_template('images/lazyload.php');
513 }
514
515 /**
516 * Runs upon the WP action wp_optimize_admin_page_wpo_images_dimensions
517 */
518 public function admin_page_wpo_images_dimensions() {
519 $options = WP_Optimize()->get_options();
520 $image_dimensions = $options->get_option('image_dimensions');
521 $ignore_classes = $options->get_option('image_dimensions_ignore_classes');
522 WP_Optimize()->include_template('images/dimensions.php', false, array(
523 'images_dimensions_status' => $image_dimensions,
524 'ignore_classes' => $ignore_classes ?: '',
525 ));
526 }
527
528 /**
529 * Show footer review message and link.
530 *
531 * @return string
532 */
533 public function display_footer_review_message() {
534 $message = sprintf(
535 __('Enjoyed %s? Please leave us a %s rating on %s or %s.', 'wp-optimize').' '.__('We really appreciate your support!', 'wp-optimize'),
536 '<b>WP-Optimize</b>',
537 '<span style="color:#2271b1">&starf;&starf;&starf;&starf;&starf;</span>',
538 '<a href="https://uk.trustpilot.com/review/getwpo.com" target="_blank">Trustpilot</a>',
539 '<a href="https://www.g2.com/products/wp-optimize/reviews" target="_blank">G2.com</a>'
540 );
541 return $message;
542 }
543
544 /**
545 * Adds menu in admin bar
546 */
547 public function wpo_admin_bar() {
548 $wp_admin_bar = $GLOBALS['wp_admin_bar'];
549
550 if (defined('WPOPTIMIZE_ADMINBAR_DISABLE') && WPOPTIMIZE_ADMINBAR_DISABLE) return;
551
552 // Show menu item in top bar only for super admins.
553 if (is_multisite() & !is_super_admin(get_current_user_id())) return;
554
555 // Add a link called at the top admin bar.
556 $args = array(
557 'id' => 'wp-optimize-node',
558 'title' => apply_filters('wpoptimize_admin_node_title', 'WP-Optimize')
559 );
560 $wp_admin_bar->add_node($args);
561
562 $pages = $this->get_submenu_items();
563
564 foreach ($pages as $page_id => $page) {
565
566 if (!isset($page['create_submenu']) || !$page['create_submenu']) {
567 if (isset($page['icon']) && 'separator' == $page['icon']) {
568 $args = array(
569 'id' => 'wpo-separator-'.$page_id,
570 'parent' => 'wp-optimize-node',
571 'meta' => array(
572 'class' => 'separator',
573 ),
574 );
575 $wp_admin_bar->add_node($args);
576 }
577 continue;
578 }
579
580 // 'menu_slug' => 'WP-Optimize',
581
582 $menu_page_url = menu_page_url($page['menu_slug'], false);
583
584 if (is_multisite()) {
585 $menu_page_url = network_admin_url('admin.php?page='.$page['menu_slug']);
586 }
587
588 $args = array(
589 'id' => 'wpoptimize_admin_node_'.$page_id,
590 'title' => $page['menu_title'],
591 'parent' => 'wp-optimize-node',
592 'href' => $menu_page_url,
593 );
594 $wp_admin_bar->add_node($args);
595 }
596
597 }
598
599 /**
600 * Manages the admin bar menu for caching (currently page and minify)
601 */
602 public function cache_admin_bar($wp_admin_bar) {
603
604 $options = WP_Optimize()->get_options();
605 if (!$options->get_option('enable_cache_in_admin_bar', true)) return;
606
607 /**
608 * The "purge cache" menu items
609 *
610 * @param array $menu_items - The menu items, in the format required by $wp_admin_bar->add_menu()
611 * @param object $wp_admin_bar
612 */
613 $menu_items = apply_filters('wpo_cache_admin_bar_menu_items', array(), $wp_admin_bar);
614
615 if (empty($menu_items) || !is_array($menu_items)) return;
616
617 $wp_admin_bar->add_menu(array(
618 'id' => 'wpo_purge_cache',
619 'title' => __('Purge cache', 'wp-optimize'),
620 'href' => '#',
621 'meta' => array(
622 'title' => __('Purge cache', 'wp-optimize'),
623 ),
624 'parent' => false,
625 ));
626
627 foreach ($menu_items as $item) {
628 $wp_admin_bar->add_menu($item);
629 }
630 }
631
632 /**
633 * Adds and displays menu and submenu pages
634 */
635 public function admin_menu() {
636
637 $capability_required = WP_Optimize()->capability_required();
638 $can_run_optimizations = WP_Optimize()->can_run_optimizations();
639 $can_manage_options = WP_Optimize()->can_manage_options();
640
641 if (!current_user_can($capability_required) || (!$can_run_optimizations && !$can_manage_options)) return;
642
643 $icon_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDE2IDE2IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc0MzE2IgogICBoZWlnaHQ9IjE2IgogICB3aWR0aD0iMTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MzE4IiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzMjEiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2EwYTVhYTtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJwYXRoNTciCiAgICAgICBkPSJtIDEwLjc2ODgwOSw2Ljc2MTYwNTEgMCwwIGMgLTAuMDE2ODgsLTAuMDE2ODc4IC0wLjAyNTMxLC0wLjA0MjE4MSAtMC4wMzM3NCwtMC4wNjc0OTkgLTAuMDA4NCwtMC4wMDgzOSAtMC4wMDg0LC0wLjAxNjg3OCAtMC4wMTY4OCwtMC4wMzM3NDMgQyA5Ljk5MjYxMTIsNS4xOTIzMzY2IDguMjIwODU1Nyw0LjU4NDg3ODEgNi43NDQzOTEyLDUuMjkzNTc5NyA1LjY3MjkwMDUsNS44MDgyMzI4IDUuMDU3MDA0Myw2Ljg4ODE2MTMgNS4wNjU0NDIsOC4wMDE4MzY1IDQuNDU3OTgyMiw3LjMxMDAwNzYgMy42OTg2NTg0LDYuNzk1MzU0NSAyLjg1NDk2NDIsNi40OTE2MjUzIDMuMjY4Mzc0Myw1LjA2NTc4MzEgNC4yNTU0OTYsMy44MTcxMTY2IDUuNjg5Nzc0NiwzLjEyNTI4NzggOC4zNjQyODMyLDEuODM0NDM2OCAxMS41NzAzMTksMi45Mzk2NzQ0IDEyLjg4NjQ4MSw1LjU4ODg3MjYgMTMuNDUxNzU1LDYuNzI3ODU5NiAxNC42NDk4MDEsNy4zNTIxOTIxIDE1Ljg0Nzg0Niw3LjIzNDA3NSAxNS43NjM0ODIsNi4zMzk3NiAxNS41MTg4MDUsNS40MzcwMDg2IDE1LjEwNTM5Niw0LjU3NjQ0MDQgMTMuMjE1NTIxLDAuNjg3MDEzNCA4LjUzMzAyMjYsLTAuOTQxMzE2MjcgNC42NDM1OTQzLDAuOTQwMTIxNzkgMi4zMjM0MzcsMi4wNjIyMzM0IDAuODA0Nzg4MTQsNC4xNzk5MDQ0IDAuMzU3NjMxMzIsNi41MzM4MDk4IDIuNDE2MjQzOCw2LjQyNDEyOSA0LjQzMjY3MTcsNy41MDQwNTc0IDUuNDM2NjY2Miw5LjQzNjExNjcgbCAwLjAwODM5LDAgYyAwLjc1OTMxOTIsMS4zNzUyMjAzIDIuNDcyMDE3OCwxLjk0MDQ5NTMgMy45MDYyOTYsMS4yNDg2NjczIDEuMDQ2MTc5OCwtMC41MDYyMTggMS42NTM2NDA4LC0xLjUzNTUyMzggMS42Nzg5NTA4LC0yLjYxNTQ1MTIgMC41ODIxNDgsMC43MDg3MDE4IDEuMzMzMDM1LDEuMjQ4NjY2OCAyLjE1OTg1NiwxLjU3NzcwNjQgLTAuNDM4NzIxLDEuMzU4MzQ3OCAtMS40MDA1MzMsMi41NDc5NTQ4IC0yLjc5MjYyNywzLjIxNDQ3ODggLTIuNTkwMTM4NywxLjI0ODY1OCAtNS42NzgwNTc0LDAuMjUzMTA0IC03LjA2MTcxNTEsLTIuMjI3MzU3IGwgMCwwIEMgMi43NjIxMDQ4LDkuNDUyOTg5NCAxLjUxMzQzODMsOC44MjAyMTkxIDAuMjgxNjQ1OTIsOC45NzIwODQ0IDAuMzgyODg3NjUsOS43OTg5MDQ2IDAuNjE5MTIzMzEsMTAuNjE3Mjg3IDAuOTk4Nzg1MiwxMS40MDE5MjIgYyAxLjg4MTQzNjgsMy44OTc4NjQgNi41NjM5MzcsNS41MjYxOTggMTAuNDYxODAwOCwzLjY0NDc2IDIuMjQ0MjI2LC0xLjA4ODM2OSAzLjczNzU2MiwtMy4xMDQ3OTYgNC4yMzUzNDIsLTUuMzc0MzMyMyAtMS45OTk1NTQsMC4wNDIxODEgLTMuOTQ4NDg2LC0xLjAyOTMwNjMgLTQuOTI3MTcsLTIuOTEwNzQzMyB6IgogICAgICAgY2xhc3M9InN0MTciIC8+CiAgPC9nPgo8L3N2Zz4K';
644
645 // Removes the admin menu items on the left WP bar.
646 if (!is_multisite() || (is_multisite() && is_network_admin())) {
647 add_menu_page("WP-Optimize", "WP-Optimize", $capability_required, "WP-Optimize", array($this, "display_admin"), $icon_svg);
648
649 $sub_menu_items = $this->get_submenu_items();
650
651 foreach ($sub_menu_items as $menu_item) {
652 if ($menu_item['create_submenu']) add_submenu_page('WP-Optimize', $menu_item['page_title'], $menu_item['menu_title'], $capability_required, $menu_item['menu_slug'], $menu_item['function']);
653 }
654 }
655
656 $options = WP_Optimize()->get_options();
657
658 if ('true' == $options->get_option('enable-admin-menu', 'false')) {
659 add_action('wp_before_admin_bar_render', array($this, 'wpo_admin_bar'));
660 }
661 }
662
663 /**
664 * Get the submenu items
665 *
666 * @return array
667 */
668 public function get_submenu_items() {
669 $sub_menu_items = array(
670 array(
671 'page_title' => __('Database', 'wp-optimize'),
672 'menu_title' => __('Database', 'wp-optimize'),
673 'menu_slug' => 'WP-Optimize',
674 'function' => array($this, 'display_admin'),
675 'icon' => 'cloud',
676 'create_submenu' => true,
677 'order' => 20,
678 ),
679 array(
680 'page_title' => __('Images', 'wp-optimize'),
681 'menu_title' => __('Images', 'wp-optimize'),
682 'menu_slug' => 'wpo_images',
683 'function' => array($this, 'display_admin'),
684 'icon' => 'images-alt2',
685 'create_submenu' => true,
686 'order' => 30,
687 ),
688 array(
689 'page_title' => __('Cache', 'wp-optimize'),
690 'menu_title' => __('Cache', 'wp-optimize'),
691 'menu_slug' => 'wpo_cache',
692 'function' => array($this, 'display_admin'),
693 'icon' => 'archive',
694 'create_submenu' => true,
695 'order' => 40,
696 ),
697 array(
698 'page_title' => __('Minify', 'wp-optimize'),
699 'menu_title' => __('Minify', 'wp-optimize'),
700 'menu_slug' => 'wpo_minify',
701 'function' => array($this, 'display_admin'),
702 'icon' => 'dashboard',
703 'create_submenu' => true,
704 'order' => 50,
705 ),
706 array(
707 'create_submenu' => false,
708 'order' => 55,
709 'icon' => 'separator',
710 ),
711 array(
712 'page_title' => __('Settings', 'wp-optimize'),
713 'menu_title' => __('Settings', 'wp-optimize'),
714 'menu_slug' => 'wpo_settings',
715 'function' => array($this, 'display_admin'),
716 'icon' => 'admin-settings',
717 'create_submenu' => true,
718 'order' => 60,
719 ),
720 array(
721 'page_title' => __('Support & FAQs', 'wp-optimize'),
722 'menu_title' => __('Help', 'wp-optimize'),
723 'menu_slug' => 'wpo_support',
724 'function' => array($this, 'display_admin'),
725 'icon' => 'sos',
726 'create_submenu' => true,
727 'order' => 60,
728 ),
729 array(
730 'page_title' => __('Premium Upgrade', 'wp-optimize'),
731 'menu_title' => __('Premium Upgrade', 'wp-optimize'),
732 'menu_slug' => 'wpo_mayalso',
733 'function' => array($this, 'display_admin'),
734 'icon' => 'admin-plugins',
735 'create_submenu' => true,
736 'order' => 70,
737 ),
738 );
739
740 $sub_menu_items = apply_filters('wp_optimize_sub_menu_items', $sub_menu_items);
741
742 usort($sub_menu_items, array($this, 'order_sort'));
743
744 return $sub_menu_items;
745 }
746
747 /**
748 * Order sorting function
749 */
750 public function order_sort($a, $b) {
751 if ($a['order'] == $b['order']) return 0;
752 return ($a['order'] > $b['order']) ? 1 : -1;
753 }
754
755 /**
756 * Output information message for users who have no permissions to run optimizations.
757 *
758 * @param string $message Message to display
759 */
760 public function prevent_run_optimizations_message($message = '') {
761 if (empty($message)) {
762 $message = __('You have no permissions to run optimizations.', 'wp-optimize');
763 }
764 WP_Optimize()->include_template('info-message.php', false, array('message' => $message));
765 }
766
767 /**
768 * Output information message for users who have no permissions to manage settings.
769 */
770 public function prevent_manage_options_info() {
771 WP_Optimize()->include_template('info-message.php', false, array('message' => __('You have no permissions to manage WP-Optimize settings.', 'wp-optimize')));
772 }
773
774 /**
775 * Output success/error messages from $output array.
776 *
777 * @param array $output ['messages' => success messages, 'errors' => error messages]
778 */
779 private function wpo_render_output_messages($output) {
780 foreach ($output['messages'] as $item) {
781 echo '<div class="updated fade below-h2"><strong>'.$item.'</strong></div>';
782 }
783
784 foreach ($output['errors'] as $item) {
785 echo '<div class="error fade below-h2"><strong>'.$item.'</strong></div>';
786 }
787 }
788 }
789 endif;
790