PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.2.9
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.2.9
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.2.9, at includes/class-wp-optimize-admin.php

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