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

753 lines 27.8 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
315 WP_Optimize()->include_template('cache/page-cache.php', false, array(
316 'wpo_cache' => $wpo_cache,
317 'active_cache_plugins' => WP_Optimize_Detect_Cache_Plugins::instance()->get_active_cache_plugins(),
318 'wpo_cache_options' => $wpo_cache_options,
319 'cache_size' => $wpo_cache->get_cache_size(),
320 'display' => $display,
321 'can_purge_the_cache' => WP_Optimize()->get_page_cache()->can_purge_cache(),
322 'does_server_handles_cache' => WP_Optimize()->does_server_handles_cache(),
323 ));
324 }
325
326 /**
327 * Preload tab
328 */
329 public function output_page_cache_preload_tab() {
330 $wpo_cache = WP_Optimize()->get_page_cache();
331 $wpo_cache_options = $wpo_cache->config->get();
332 $wpo_cache_preloader = WP_Optimize_Page_Cache_Preloader::instance();
333 $is_running = $wpo_cache_preloader->is_running();
334 $status = $wpo_cache_preloader->get_status_info();
335
336 WP_Optimize()->include_template('cache/page-cache-preload.php', false, array(
337 'wpo_cache_options' => $wpo_cache_options,
338 'is_running' => $is_running,
339 'status_message' => isset($status['message']) ? $status['message'] : '',
340 'schedule_options' => array(
341 'wpo_use_cache_lifespan' => __('Same as cache lifespan', 'wp-optimize'),
342 'wpo_daily' => __('Daily', 'wp-optimize'),
343 'wpo_weekly' => __('Weekly', 'wp-optimize'),
344 'wpo_fortnightly' => __('Fortnightly', 'wp-optimize'),
345 'wpo_monthly' => __('Monthly (approx. - every 30 days)', 'wp-optimize')
346 )
347 ));
348 }
349
350 /**
351 * Advanced tab
352 */
353 public function output_page_cache_advanced_tab() {
354 $wpo_cache = WP_Optimize()->get_page_cache();
355 $wpo_cache_options = $wpo_cache->config->get();
356
357 $cache_exception_conditional_tags = is_array($wpo_cache_options['cache_exception_conditional_tags']) ? join("\n", $wpo_cache_options['cache_exception_conditional_tags']) : '';
358 $cache_exception_urls = is_array($wpo_cache_options['cache_exception_urls']) ? join("\n", $wpo_cache_options['cache_exception_urls']) : '';
359 $cache_exception_cookies = is_array($wpo_cache_options['cache_exception_cookies']) ? join("\n", $wpo_cache_options['cache_exception_cookies']) : '';
360 $cache_exception_browser_agents = is_array($wpo_cache_options['cache_exception_browser_agents']) ? join("\n", $wpo_cache_options['cache_exception_browser_agents']) : '';
361
362 WP_Optimize()->include_template('cache/page-cache-advanced.php', false, array(
363 'wpo_cache' => $wpo_cache,
364 'wpo_cache_options' => $wpo_cache_options,
365 'cache_exception_urls' => $cache_exception_urls,
366 'cache_exception_conditional_tags' => $cache_exception_conditional_tags,
367 'cache_exception_cookies' => $cache_exception_cookies,
368 'cache_exception_browser_agents' => $cache_exception_browser_agents,
369 ));
370 }
371
372 /**
373 * Gzip tab
374 */
375 public function output_cache_gzip_tab() {
376 $wpo_gzip_compression = WP_Optimize()->get_gzip_compression();
377 $wpo_gzip_compression_enabled = $wpo_gzip_compression->is_gzip_compression_enabled(true);
378 $wpo_gzip_headers_information = $wpo_gzip_compression->get_headers_information();
379 $is_cloudflare_site = $this->is_cloudflare_site();
380 $is_gzip_compression_section_exists = $wpo_gzip_compression->is_gzip_compression_section_exists();
381 $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']);
382
383 WP_Optimize()->include_template('cache/gzip-compression.php', false, array(
384 'wpo_gzip_headers_information' => $wpo_gzip_headers_information,
385 'wpo_gzip_compression_enabled' => $wpo_gzip_compression_enabled,
386 'is_cloudflare_site' => $is_cloudflare_site,
387 'wpo_gzip_compression_enabled_by_wpo' => $wpo_gzip_compression_enabled_by_wpo,
388 'wpo_gzip_compression_settings_added' => $is_gzip_compression_section_exists,
389 'info_link' => 'https://getwpo.com/gzip-compression-explained/',
390 'faq_link' => 'https://getwpo.com/gzip-faq-link/',
391 'class_name' => (!is_wp_error($wpo_gzip_compression_enabled) && $wpo_gzip_compression_enabled ? 'wpo-enabled' : 'wpo-disabled')
392 ));
393 }
394
395 /**
396 * Cache tab
397 */
398 public function output_cache_settings_tab() {
399
400 $wpo_browser_cache = WP_Optimize()->get_browser_cache();
401 $wpo_browser_cache_enabled = $wpo_browser_cache->is_enabled();
402
403 WP_Optimize()->include_template('cache/browser-cache.php', false, array(
404 'wpo_browser_cache_enabled' => $wpo_browser_cache_enabled,
405 'is_cloudflare_site' => $this->is_cloudflare_site(),
406 'wpo_browser_cache_settings_added' => $wpo_browser_cache->is_browser_cache_section_exists(),
407 'class_name' => (true === $wpo_browser_cache_enabled ? 'wpo-enabled' : 'wpo-disabled'),
408 'wpo_browser_cache_expire_days' => WP_Optimize()->get_options()->get_option('browser_cache_expire_days', '28'),
409 'wpo_browser_cache_expire_hours' => WP_Optimize()->get_options()->get_option('browser_cache_expire_hours', '0'),
410 'info_link' => 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching',
411 'faq_link' => 'https://www.digitalocean.com/community/tutorials/how-to-implement-browser-caching-with-nginx-s-header-module-on-ubuntu-16-04',
412 ));
413 }
414
415 /**
416 * Check if is the current site handled with Cloudflare.
417 *
418 * @return bool
419 */
420 public function is_cloudflare_site() {
421 return isset($_SERVER['HTTP_CF_RAY']);
422 }
423
424 /**
425 * Include Cloudflare settings template.
426 */
427 public function output_cloudflare_settings() {
428 if (WP_Optimize::is_premium() || !apply_filters('show_cloudflare_settings', $this->is_cloudflare_site())) return;
429
430 WP_Optimize()->include_template('cache/page-cache-cloudflare-placeholder.php');
431 }
432
433 /**
434 * Outputs the DB optimize Tab
435 */
436 public function output_database_optimize_tab() {
437 $optimizer = WP_Optimize()->get_optimizer();
438 $options = WP_Optimize()->get_options();
439
440 // check if nonce passed.
441 $nonce_passed = (!empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], 'wpo_optimization')) ? true : false;
442
443 // save options.
444 if ($nonce_passed && isset($_POST['wp-optimize'])) $options->save_sent_manual_run_optimization_options($_POST, true);
445
446 $optimize_db = ($nonce_passed && isset($_POST["optimize-db"])) ? true : false;
447
448 $optimization_results = (($nonce_passed) ? $optimizer->do_optimizations($_POST) : false);
449
450 // display optimizations table or restricted access message.
451 if (WP_Optimize()->can_run_optimizations()) {
452 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()));
453 } else {
454 $this->prevent_run_optimizations_message();
455 }
456 }
457
458 /**
459 * Outputs the DB Tables Tab
460 */
461 public function output_database_tables_tab() {
462 // check if nonce passed.
463 $nonce_passed = (!empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], 'wpo_optimization')) ? true : false;
464
465 $optimize_db = ($nonce_passed && isset($_POST["optimize-db"])) ? true : false;
466
467 if (!WP_Optimize()->does_server_allows_table_optimization()) {
468 $message = __('Your server takes care of table optimization', 'wp-optimize');
469 $this->prevent_run_optimizations_message($message);
470 } elseif (WP_Optimize()->can_run_optimizations()) {
471 WP_Optimize()->include_template('database/tables.php', false, array('optimize_db' => $optimize_db, 'load_data' => WP_Optimize()->template_should_include_data()));
472 } else {
473 $this->prevent_run_optimizations_message();
474 }
475 }
476
477 /**
478 * Runs upon the WP action admin_page_wpo_images_unused
479 */
480 public function admin_page_wpo_images_unused() {
481 WP_Optimize()->include_template('images/unused.php');
482 }
483
484 /**
485 * Runs upon the WP action wp_optimize_admin_page_wpo_images_lazyload
486 */
487 public function admin_page_wpo_images_lazyload() {
488 WP_Optimize()->include_template('images/lazyload.php');
489 }
490
491 /**
492 * Show footer review message and link.
493 *
494 * @return string
495 */
496 public function display_footer_review_message() {
497 $message = sprintf(
498 __('Enjoyed %s? Please leave us a %s rating.', 'wp-optimize'),
499 '<b>WP-Optimize</b>',
500 '<a href="https://www.g2.com/products/wp-optimize/reviews" target="_blank">&starf;&starf;&starf;&starf;&starf;</a>'
501 );
502 $message .= ' ';
503 $message .= __('We really appreciate your support!', 'wp-optimize');
504 return $message;
505 }
506
507 /**
508 * Adds menu in admin bar
509 */
510 public function wpo_admin_bar() {
511 $wp_admin_bar = $GLOBALS['wp_admin_bar'];
512
513 if (defined('WPOPTIMIZE_ADMINBAR_DISABLE') && WPOPTIMIZE_ADMINBAR_DISABLE) return;
514
515 // Show menu item in top bar only for super admins.
516 if (is_multisite() & !is_super_admin(get_current_user_id())) return;
517
518 // Add a link called at the top admin bar.
519 $args = array(
520 'id' => 'wp-optimize-node',
521 'title' => apply_filters('wpoptimize_admin_node_title', 'WP-Optimize')
522 );
523 $wp_admin_bar->add_node($args);
524
525 $pages = $this->get_submenu_items();
526
527 foreach ($pages as $page_id => $page) {
528
529 if (!isset($page['create_submenu']) || !$page['create_submenu']) {
530 if (isset($page['icon']) && 'separator' == $page['icon']) {
531 $args = array(
532 'id' => 'wpo-separator-'.$page_id,
533 'parent' => 'wp-optimize-node',
534 'meta' => array(
535 'class' => 'separator',
536 ),
537 );
538 $wp_admin_bar->add_node($args);
539 }
540 continue;
541 }
542
543 // 'menu_slug' => 'WP-Optimize',
544
545 $menu_page_url = menu_page_url($page['menu_slug'], false);
546
547 if (is_multisite()) {
548 $menu_page_url = network_admin_url('admin.php?page='.$page['menu_slug']);
549 }
550
551 $args = array(
552 'id' => 'wpoptimize_admin_node_'.$page_id,
553 'title' => $page['menu_title'],
554 'parent' => 'wp-optimize-node',
555 'href' => $menu_page_url,
556 );
557 $wp_admin_bar->add_node($args);
558 }
559
560 }
561
562 /**
563 * Manages the admin bar menu for caching (currently page and minify)
564 */
565 public function cache_admin_bar($wp_admin_bar) {
566
567 $options = WP_Optimize()->get_options();
568 if (!$options->get_option('enable_cache_in_admin_bar', true)) return;
569
570 /**
571 * The "purge cache" menu items
572 *
573 * @param array $menu_items - The menu items, in the format required by $wp_admin_bar->add_menu()
574 * @param object $wp_admin_bar
575 */
576 $menu_items = apply_filters('wpo_cache_admin_bar_menu_items', array(), $wp_admin_bar);
577
578 if (empty($menu_items) || !is_array($menu_items)) return;
579
580 $wp_admin_bar->add_menu(array(
581 'id' => 'wpo_purge_cache',
582 'title' => __('Purge cache', 'wp-optimize'),
583 'href' => '#',
584 'meta' => array(
585 'title' => __('Purge cache', 'wp-optimize'),
586 ),
587 'parent' => false,
588 ));
589
590 foreach ($menu_items as $item) {
591 $wp_admin_bar->add_menu($item);
592 }
593 }
594
595 /**
596 * Adds and displays menu and submenu pages
597 */
598 public function admin_menu() {
599
600 $capability_required = WP_Optimize()->capability_required();
601 $can_run_optimizations = WP_Optimize()->can_run_optimizations();
602 $can_manage_options = WP_Optimize()->can_manage_options();
603
604 if (!current_user_can($capability_required) || (!$can_run_optimizations && !$can_manage_options)) return;
605
606 $icon_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDE2IDE2IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc0MzE2IgogICBoZWlnaHQ9IjE2IgogICB3aWR0aD0iMTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MzE4IiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzMjEiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2EwYTVhYTtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJwYXRoNTciCiAgICAgICBkPSJtIDEwLjc2ODgwOSw2Ljc2MTYwNTEgMCwwIGMgLTAuMDE2ODgsLTAuMDE2ODc4IC0wLjAyNTMxLC0wLjA0MjE4MSAtMC4wMzM3NCwtMC4wNjc0OTkgLTAuMDA4NCwtMC4wMDgzOSAtMC4wMDg0LC0wLjAxNjg3OCAtMC4wMTY4OCwtMC4wMzM3NDMgQyA5Ljk5MjYxMTIsNS4xOTIzMzY2IDguMjIwODU1Nyw0LjU4NDg3ODEgNi43NDQzOTEyLDUuMjkzNTc5NyA1LjY3MjkwMDUsNS44MDgyMzI4IDUuMDU3MDA0Myw2Ljg4ODE2MTMgNS4wNjU0NDIsOC4wMDE4MzY1IDQuNDU3OTgyMiw3LjMxMDAwNzYgMy42OTg2NTg0LDYuNzk1MzU0NSAyLjg1NDk2NDIsNi40OTE2MjUzIDMuMjY4Mzc0Myw1LjA2NTc4MzEgNC4yNTU0OTYsMy44MTcxMTY2IDUuNjg5Nzc0NiwzLjEyNTI4NzggOC4zNjQyODMyLDEuODM0NDM2OCAxMS41NzAzMTksMi45Mzk2NzQ0IDEyLjg4NjQ4MSw1LjU4ODg3MjYgMTMuNDUxNzU1LDYuNzI3ODU5NiAxNC42NDk4MDEsNy4zNTIxOTIxIDE1Ljg0Nzg0Niw3LjIzNDA3NSAxNS43NjM0ODIsNi4zMzk3NiAxNS41MTg4MDUsNS40MzcwMDg2IDE1LjEwNTM5Niw0LjU3NjQ0MDQgMTMuMjE1NTIxLDAuNjg3MDEzNCA4LjUzMzAyMjYsLTAuOTQxMzE2MjcgNC42NDM1OTQzLDAuOTQwMTIxNzkgMi4zMjM0MzcsMi4wNjIyMzM0IDAuODA0Nzg4MTQsNC4xNzk5MDQ0IDAuMzU3NjMxMzIsNi41MzM4MDk4IDIuNDE2MjQzOCw2LjQyNDEyOSA0LjQzMjY3MTcsNy41MDQwNTc0IDUuNDM2NjY2Miw5LjQzNjExNjcgbCAwLjAwODM5LDAgYyAwLjc1OTMxOTIsMS4zNzUyMjAzIDIuNDcyMDE3OCwxLjk0MDQ5NTMgMy45MDYyOTYsMS4yNDg2NjczIDEuMDQ2MTc5OCwtMC41MDYyMTggMS42NTM2NDA4LC0xLjUzNTUyMzggMS42Nzg5NTA4LC0yLjYxNTQ1MTIgMC41ODIxNDgsMC43MDg3MDE4IDEuMzMzMDM1LDEuMjQ4NjY2OCAyLjE1OTg1NiwxLjU3NzcwNjQgLTAuNDM4NzIxLDEuMzU4MzQ3OCAtMS40MDA1MzMsMi41NDc5NTQ4IC0yLjc5MjYyNywzLjIxNDQ3ODggLTIuNTkwMTM4NywxLjI0ODY1OCAtNS42NzgwNTc0LDAuMjUzMTA0IC03LjA2MTcxNTEsLTIuMjI3MzU3IGwgMCwwIEMgMi43NjIxMDQ4LDkuNDUyOTg5NCAxLjUxMzQzODMsOC44MjAyMTkxIDAuMjgxNjQ1OTIsOC45NzIwODQ0IDAuMzgyODg3NjUsOS43OTg5MDQ2IDAuNjE5MTIzMzEsMTAuNjE3Mjg3IDAuOTk4Nzg1MiwxMS40MDE5MjIgYyAxLjg4MTQzNjgsMy44OTc4NjQgNi41NjM5MzcsNS41MjYxOTggMTAuNDYxODAwOCwzLjY0NDc2IDIuMjQ0MjI2LC0xLjA4ODM2OSAzLjczNzU2MiwtMy4xMDQ3OTYgNC4yMzUzNDIsLTUuMzc0MzMyMyAtMS45OTk1NTQsMC4wNDIxODEgLTMuOTQ4NDg2LC0xLjAyOTMwNjMgLTQuOTI3MTcsLTIuOTEwNzQzMyB6IgogICAgICAgY2xhc3M9InN0MTciIC8+CiAgPC9nPgo8L3N2Zz4K';
607
608 // Removes the admin menu items on the left WP bar.
609 if (!is_multisite() || (is_multisite() && is_network_admin())) {
610 add_menu_page("WP-Optimize", "WP-Optimize", $capability_required, "WP-Optimize", array($this, "display_admin"), $icon_svg);
611
612 $sub_menu_items = $this->get_submenu_items();
613
614 foreach ($sub_menu_items as $menu_item) {
615 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']);
616 }
617 }
618
619 $options = WP_Optimize()->get_options();
620
621 if ('true' == $options->get_option('enable-admin-menu', 'false')) {
622 add_action('wp_before_admin_bar_render', array($this, 'wpo_admin_bar'));
623 }
624 }
625
626 /**
627 * Get the submenu items
628 *
629 * @return array
630 */
631 public function get_submenu_items() {
632 $sub_menu_items = array(
633 array(
634 'page_title' => __('Database', 'wp-optimize'),
635 'menu_title' => __('Database', 'wp-optimize'),
636 'menu_slug' => 'WP-Optimize',
637 'function' => array($this, 'display_admin'),
638 'icon' => 'cloud',
639 'create_submenu' => true,
640 'order' => 20,
641 ),
642 array(
643 'page_title' => __('Images', 'wp-optimize'),
644 'menu_title' => __('Images', 'wp-optimize'),
645 'menu_slug' => 'wpo_images',
646 'function' => array($this, 'display_admin'),
647 'icon' => 'images-alt2',
648 'create_submenu' => true,
649 'order' => 30,
650 ),
651 array(
652 'page_title' => __('Cache', 'wp-optimize'),
653 'menu_title' => __('Cache', 'wp-optimize'),
654 'menu_slug' => 'wpo_cache',
655 'function' => array($this, 'display_admin'),
656 'icon' => 'archive',
657 'create_submenu' => true,
658 'order' => 40,
659 ),
660 array(
661 'page_title' => __('Minify', 'wp-optimize'),
662 'menu_title' => __('Minify', 'wp-optimize'),
663 'menu_slug' => 'wpo_minify',
664 'function' => array($this, 'display_admin'),
665 'icon' => 'dashboard',
666 'create_submenu' => true,
667 'order' => 50,
668 ),
669 array(
670 'create_submenu' => false,
671 'order' => 55,
672 'icon' => 'separator',
673 ),
674 array(
675 'page_title' => __('Settings', 'wp-optimize'),
676 'menu_title' => __('Settings', 'wp-optimize'),
677 'menu_slug' => 'wpo_settings',
678 'function' => array($this, 'display_admin'),
679 'icon' => 'admin-settings',
680 'create_submenu' => true,
681 'order' => 60,
682 ),
683 array(
684 'page_title' => __('Support & FAQs', 'wp-optimize'),
685 'menu_title' => __('Help', 'wp-optimize'),
686 'menu_slug' => 'wpo_support',
687 'function' => array($this, 'display_admin'),
688 'icon' => 'sos',
689 'create_submenu' => true,
690 'order' => 60,
691 ),
692 array(
693 'page_title' => __('Premium Upgrade', 'wp-optimize'),
694 'menu_title' => __('Premium Upgrade', 'wp-optimize'),
695 'menu_slug' => 'wpo_mayalso',
696 'function' => array($this, 'display_admin'),
697 'icon' => 'admin-plugins',
698 'create_submenu' => true,
699 'order' => 70,
700 ),
701 );
702
703 $sub_menu_items = apply_filters('wp_optimize_sub_menu_items', $sub_menu_items);
704
705 usort($sub_menu_items, array($this, 'order_sort'));
706
707 return $sub_menu_items;
708 }
709
710 /**
711 * Order sorting function
712 */
713 public function order_sort($a, $b) {
714 if ($a['order'] == $b['order']) return 0;
715 return ($a['order'] > $b['order']) ? 1 : -1;
716 }
717
718 /**
719 * Output information message for users who have no permissions to run optimizations.
720 *
721 * @param string $message Message to display
722 */
723 public function prevent_run_optimizations_message($message = '') {
724 if (empty($message)) {
725 $message = __('You have no permissions to run optimizations.', 'wp-optimize');
726 }
727 WP_Optimize()->include_template('info-message.php', false, array('message' => $message));
728 }
729
730 /**
731 * Output information message for users who have no permissions to manage settings.
732 */
733 public function prevent_manage_options_info() {
734 WP_Optimize()->include_template('info-message.php', false, array('message' => __('You have no permissions to manage WP-Optimize settings.', 'wp-optimize')));
735 }
736
737 /**
738 * Output success/error messages from $output array.
739 *
740 * @param array $output ['messages' => success messages, 'errors' => error messages]
741 */
742 private function wpo_render_output_messages($output) {
743 foreach ($output['messages'] as $item) {
744 echo '<div class="updated fade below-h2"><strong>'.$item.'</strong></div>';
745 }
746
747 foreach ($output['errors'] as $item) {
748 echo '<div class="error fade below-h2"><strong>'.$item.'</strong></div>';
749 }
750 }
751 }
752 endif;
753