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

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