PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 4.7.0
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v4.7.0
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
← All changes | includes/class-wp-optimize-admin.php +133 -39 4.5.4 → 4.7.0 View file →
@@ -27,10 +27,9 @@
27 27 $_instance = new self();
28 28 }
29 29 return $_instance;
30 30 }
31 -
32 -
31 +
33 32 /**
34 33 * Builds the Tabs that should be displayed
35 34 *
36 35 * @param string $page
@@ -40,8 +39,11 @@
40 39 public function get_tabs($page) {
41 40 // define tabs for pages.
42 41 $pages_tabs = array(
43 42 'WP-Optimize' => array(
43 + 'dashboard' => __('Overview', 'wp-optimize'),
44 + ),
45 + 'wpo_database' => array(
44 46 'optimize' => __('Optimizations', 'wp-optimize'),
45 47 'tables' => __('Tables', 'wp-optimize'),
46 48 'settings' => __('Settings', 'wp-optimize'),
47 49 'table_analysis' => __('Table usage', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>'
@@ -54,8 +56,9 @@
54 56 ),
55 57 'wpo_cache' => array(
56 58 'cache' => __('Page cache', 'wp-optimize'),
57 59 'preload' => __('Preload', 'wp-optimize'),
60 + 'lcp' => __('Auto LCP', 'wp-optimize').'<span class="menu-pill premium-only">Premium</span>',
58 61 'advanced' => __('Advanced settings', 'wp-optimize'),
59 62 'gzip' => __('Gzip compression', 'wp-optimize'),
60 63 'settings' => __('Static file headers', 'wp-optimize') // Adds a settings tab
61 64 ),
@@ -99,16 +102,18 @@
99 102 $can_run_optimizations = WP_Optimize()->can_run_optimizations();
100 103 $can_manage_options = WP_Optimize()->can_manage_options();
101 104
102 105 if (!current_user_can($capability_required) || (!$can_run_optimizations && !$can_manage_options)) {
103 - echo "Permission denied.";
106 + echo esc_html__('Permission denied.', 'wp-optimize');
104 107 return;
105 108 }
106 109
107 110 $this->register_admin_content();
108 -
109 - echo '<div id="wp-optimize-wrap">';
110 -
111 +
112 + global $wp_version;
113 +
114 + echo '<div id="wp-optimize-wrap" class="'.(version_compare($wp_version, '7.0', '>=') ? 'wp-version-7' : '').'">';
115 +
111 116 WP_Optimize()->include_template('admin-page-header.php', false, array('show_notices' => !(WP_Optimize()->get_install_or_update_notice()->show_current_notice())));
112 117
113 118 do_action('wpo_admin_after_header');
114 119
@@ -134,9 +139,8 @@
134 139 *
135 140 * @param string $page wp-optimize page id i.e. dashboard, database, images, cache, ...
136 141 */
137 142 public function display_admin_page($page) {
138 -
139 143 $active_page = TeamUpdraft\WP_Optimize\Includes\Fragments\fetch_superglobal('request', 'page', 'string', 'sanitize_text_field', '');
140 144
141 145 echo '<div class="wpo-page' . ($active_page === $page ? ' active' : '') . '" data-whichpage="'.esc_attr($page).'">';
142 146
@@ -150,9 +154,9 @@
150 154 $active_tab = $page;
151 155 } else {
152 156 $tab_keys = array_keys($tabs);
153 157 $default_tab = apply_filters('wp_optimize_admin_'.$page.'_default_tab', $tab_keys[0]);
154 - $active_tab = substr(TeamUpdraft\WP_Optimize\Includes\Fragments\fetch_superglobal('get', 'tab', null, 'sanitize_text_field', ''), 12);
158 + $active_tab = substr(TeamUpdraft\WP_Optimize\Includes\Fragments\fetch_superglobal('get', 'tab', null, 'sanitize_text_field', $default_tab), 12);
155 159 if (!in_array($active_tab, array_keys($tabs))) $active_tab = $default_tab;
156 160 }
157 161
158 162 do_action('wp_optimize_admin_page_'.$page, $active_tab);
@@ -206,16 +210,22 @@
206 210 /**
207 211 * Premium / other plugins
208 212 */
209 213 add_action('wp_optimize_admin_page_wpo_mayalso_may_also', array($this, 'output_dashboard_other_plugins_tab'), 20);
210 -
214 +
211 215 /**
216 + * Dashboard
217 + */
218 + add_action('wp_optimize_admin_page_WP-Optimize_dashboard', array($this, 'output_dashboard'), 20);
219 +
220 + /**
212 221 * DATABASE
213 222 */
214 - add_action('wp_optimize_admin_page_WP-Optimize_optimize', array($this, 'output_database_optimize_tab'), 20);
215 - add_action('wp_optimize_admin_page_WP-Optimize_tables', array($this, 'output_database_tables_tab'), 20);
216 - add_action('wp_optimize_admin_page_WP-Optimize_settings', array($this, 'output_database_settings_tab'), 20);
217 - add_action('wp_optimize_admin_page_WP-Optimize_table_analysis', array($this, 'output_table_usage_tab'), 20);
223 + add_action('wp_optimize_admin_page_wpo_database_optimize', array($this, 'output_database_optimize_tab'), 20);
224 + add_action('wp_optimize_admin_page_wpo_database_tables', array($this, 'output_database_tables_tab'), 20);
225 + add_action('wp_optimize_admin_page_wpo_database_settings', array($this, 'output_database_settings_tab'), 20);
226 + add_action('wp_optimize_admin_page_wpo_database_table_analysis', array($this, 'output_table_usage_tab'), 20);
227 +
218 228 /**
219 229 * PERFORMANCE
220 230 */
221 231 add_action('wp_optimize_admin_page_wpo_performance_404_detector', array($this, 'output_performance_404_requests'), 20);
@@ -230,8 +240,10 @@
230 240 }
231 241 add_action('wp_optimize_admin_page_wpo_cache_gzip', array($this, 'output_cache_gzip_tab'), 20);
232 242 add_action('wp_optimize_admin_page_wpo_cache_settings', array($this, 'output_cache_settings_tab'), 20);
233 243 add_action('wpo_page_cache_advanced_settings', array($this, 'output_cloudflare_settings'), 20);
244 + add_action('wp_optimize_admin_page_wpo_cache_lcp', array($this, 'output_page_cache_lcp'), 20);
245 +
234 246 /**
235 247 * SUPPORT
236 248 */
237 249 add_action('wp_optimize_admin_page_wpo_support_support', array($this, 'output_dashboard_support_tab'), 20);
@@ -263,9 +275,9 @@
263 275 /**
264 276 * Database settings
265 277 */
266 278 public function output_database_settings_tab() {
267 -
279 +
268 280 if (WP_Optimize()->can_run_optimizations()) {
269 281 $wp_optimize_commands = new WP_Optimize_Commands();
270 282 $settings_general_data = $wp_optimize_commands->get_widgets_data(array('widgets' => array('wp_optimize_general_settings')));
271 283 $settings_cleanup_data = $wp_optimize_commands->get_widgets_data(array('widgets' => array('wp_optimize_schedule_cleanup_settings')));
@@ -293,22 +305,19 @@
293 305 /**
294 306 * Dashboard settings
295 307 */
296 308 public function output_dashboard_settings_tab() {
297 - $options = WP_Optimize()->get_options();
298 -
299 309 if (isset($_SERVER['REQUEST_METHOD']) && 'POST' === $_SERVER['REQUEST_METHOD']) {
300 310 // Nonce check.
301 311 check_admin_referer('wpo_settings');
302 -
303 - $output = $options->save_settings($_POST);
304 -
312 +
305 313 if (isset($_POST['wp-optimize-settings'])) {
314 + $options = WP_Optimize()->get_options();
306 315 // save settings request sent.
307 316 $output = $options->save_settings($_POST);
317 +
318 + $this->wpo_render_output_messages($output);
308 319 }
309 -
310 - $this->wpo_render_output_messages($output);
311 320 }
312 321
313 322 if (WP_Optimize()->can_manage_options()) {
314 323 $wp_optimize_commands = new WP_Optimize_Commands();
@@ -397,9 +406,9 @@
397 406 'wpo_use_cache_lifespan' => __('Same as cache lifespan', 'wp-optimize')
398 407 ),
399 408 $scheduled_types
400 409 );
401 -
410 +
402 411 WP_Optimize()->include_template('cache/page-cache-preload.php', false, array(
403 412 'wpo_cache_options' => $wpo_cache_options,
404 413 'is_running' => $is_running,
405 414 'status_message' => $status['message'] ?? '',
@@ -423,8 +432,9 @@
423 432
424 433 WP_Optimize()->include_template('cache/page-cache-advanced.php', false, array(
425 434 'wpo_cache' => $wpo_cache,
426 435 'wpo_cache_options' => $wpo_cache_options,
436 + 'show_avatars' => (bool) get_option('show_avatars'),
427 437 'cache_include_urls' => $cache_include_urls,
428 438 'cache_exception_urls' => $cache_exception_urls,
429 439 'cache_ignore_query_variables' => $cache_ignore_query_variables,
430 440 'cache_exception_conditional_tags' => $cache_exception_conditional_tags,
@@ -437,26 +447,49 @@
437 447 * Gzip tab
438 448 */
439 449 public function output_cache_gzip_tab() {
440 450 $wpo_gzip_compression = WP_Optimize()->get_gzip_compression();
441 - $wpo_gzip_compression_enabled = $wpo_gzip_compression->is_gzip_compression_enabled(true);
442 - $wpo_gzip_headers_information = $wpo_gzip_compression->get_headers_information();
443 - $is_cloudflare_site = $this->is_cloudflare_site();
451 + $wpo_gzip_compression_enabled = $wpo_gzip_compression->is_gzip_compression_enabled();
452 + $wpo_gzip_compression_test_results_html = $wpo_gzip_compression->get_compression_test_results_html(true);
453 +
454 + WP_Optimize()->include_template('cache/gzip-compression.php', false, array(
455 + 'gzip_compression_control_panel' => $this->get_gzip_compression_control_panel($wpo_gzip_compression_enabled, true),
456 + 'wpo_gzip_compression_enabled' => $wpo_gzip_compression_enabled,
457 + 'compression_test_results_html' => $wpo_gzip_compression_test_results_html,
458 + 'info_link' => 'https://teamupdraft.com/documentation/wp-optimize/topics/caching/faqs/what-is-gzip-compression/?utm_source=wpo-plugin&utm_medium=referral&utm_campaign=paac&utm_content=gzip-compression-guide&utm_creative_format=text',
459 + ));
460 + }
461 +
462 + /**
463 + * Get gzip compression control panel html content.
464 + *
465 + * @param bool|null $wpo_gzip_compression_enabled Pass gzip compression status if already known to avoid double check.
466 + *
467 + * @return string
468 + */
469 + public function get_gzip_compression_control_panel($wpo_gzip_compression_enabled = null, $use_cache = false) {
470 + $wpo_gzip_compression = WP_Optimize()->get_gzip_compression();
471 + $wpo_gzip_compression_enabled = is_null($wpo_gzip_compression_enabled) ? $wpo_gzip_compression->is_gzip_compression_enabled() : $wpo_gzip_compression_enabled;
472 + $wpo_gzip_headers_information = $wpo_gzip_compression->get_headers_information($wpo_gzip_compression->css_resource_url());
473 + $is_cloudflare_site = $this->is_cloudflare_site($use_cache);
444 474 $is_gzip_compression_section_exists = $wpo_gzip_compression->is_gzip_compression_section_exists();
445 - $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']);
446 -
447 - WP_Optimize()->include_template('cache/gzip-compression.php', false, array(
475 + $wpo_gzip_compression_enabled_by_wpo = $is_gzip_compression_section_exists && true === $wpo_gzip_compression_enabled && !$is_cloudflare_site && !(is_array($wpo_gzip_headers_information) && 'brotli' === $wpo_gzip_headers_information['compression']);
476 + $wpo_gzip_compression_content_types = $wpo_gzip_compression->get_enabled_disabled_compression_content_types($use_cache);
477 + $wpo_gzip_compression_partially_enabled = count($wpo_gzip_compression_content_types['enabled']) > 0 && count($wpo_gzip_compression_content_types['disabled']) > 0;
478 +
479 + return WP_Optimize()->include_template('cache/gzip-compression-control-panel.php', true, array(
448 480 'wpo_gzip_headers_information' => $wpo_gzip_headers_information,
449 481 'wpo_gzip_compression_enabled' => $wpo_gzip_compression_enabled,
450 482 'is_cloudflare_site' => $is_cloudflare_site,
451 483 'wpo_gzip_compression_enabled_by_wpo' => $wpo_gzip_compression_enabled_by_wpo,
452 484 'wpo_gzip_compression_settings_added' => $is_gzip_compression_section_exists,
453 - 'info_link' => 'https://teamupdraft.com/documentation/wp-optimize/topics/caching/faqs/what-is-gzip-compression/?utm_source=wpo-plugin&utm_medium=referral&utm_campaign=paac&utm_content=lossy-compression-guide&utm_creative_format=text',
454 485 'faq_link' => 'https://getwpo.com/gzip-faq-link/',
455 - 'class_name' => (!is_wp_error($wpo_gzip_compression_enabled) && $wpo_gzip_compression_enabled ? 'wpo-enabled' : 'wpo-disabled')
486 + 'class_name' => $is_gzip_compression_section_exists ? 'wpo-enabled' : 'wpo-disabled',
487 + 'wpo_gzip_compression_content_types' => $wpo_gzip_compression_content_types,
488 + 'wpo_gzip_compression_partially_enabled' => $wpo_gzip_compression_partially_enabled,
456 489 ));
457 490 }
458 -
491 +
459 492 /**
460 493 * Cache tab
461 494 */
462 495 public function output_cache_settings_tab() {
@@ -462,8 +495,9 @@
462 495 public function output_cache_settings_tab() {
463 496
464 497 $wpo_browser_cache = WP_Optimize()->get_browser_cache();
465 498 $wpo_browser_cache_enabled = $wpo_browser_cache->is_enabled();
499 + $wpo_browser_cache->maybe_reset_error_message_output();
466 500
467 501 WP_Optimize()->include_template('cache/browser-cache.php', false, array(
468 502 'wpo_browser_cache_enabled' => $wpo_browser_cache_enabled,
469 503 'is_cloudflare_handling_browser_cache' => $this->is_cloudflare_handling_browser_cache(),
@@ -470,24 +504,45 @@
470 504 'wpo_browser_cache_settings_added' => $wpo_browser_cache->is_browser_cache_section_exists(),
471 505 'class_name' => (true === $wpo_browser_cache_enabled ? 'wpo-enabled' : 'wpo-disabled'),
472 506 'wpo_browser_cache_expire_days' => WP_Optimize()->get_options()->get_option('browser_cache_expire_days', '28'),
473 507 'wpo_browser_cache_expire_hours' => WP_Optimize()->get_options()->get_option('browser_cache_expire_hours', '0'),
508 + 'wpo_browser_cache_error_message' => WP_Optimize()->get_options()->get_option('browser_cache_error_message', ''),
509 + 'wpo_browser_cache_output' => WP_Optimize()->get_options()->get_option('browser_cache_output', ''),
474 510 'info_link' => 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching',
475 511 'faq_link' => 'https://www.digitalocean.com/community/tutorials/how-to-implement-browser-caching-with-nginx-s-header-module-on-ubuntu-16-04',
476 512 ));
477 513 }
478 -
514 +
479 515 /**
516 + * Cache: Auto LCP tab
517 + */
518 + public function output_page_cache_lcp() {
519 + $lcp_options = array();
520 + if (WP_Optimize::is_premium()) {
521 + $lcp_options['lcp_preload_enable'] = (bool) WPO_Cache_Config::instance()->get_option('lcp_preload_enable');
522 + }
523 + WP_Optimize()->include_template('cache/page-cache-lcp-settings.php', false, $lcp_options);
524 + }
525 +
526 + /**
480 527 * Check if is the current site handled with Cloudflare.
481 528 *
482 529 * @return bool
483 530 */
484 - public function is_cloudflare_site(): bool {
531 + public function is_cloudflare_site($use_cache = false): bool {
532 +
533 + if ($use_cache) {
534 + $cached_value = get_transient('wpo_is_cloudflare_site');
535 + if (false !== $cached_value) return $cached_value;
536 + }
537 +
485 538 $response = wp_remote_get(home_url());
486 539 if (is_wp_error($response)) return false;
487 540
488 541 $cloudflare_status = wp_remote_retrieve_header($response, 'cf-cache-status');
489 542
543 + set_transient('wpo_is_cloudflare_site', $cloudflare_status, HOUR_IN_SECONDS);
544 +
490 545 return !empty($cloudflare_status);
491 546 }
492 547
493 548 /**
@@ -517,8 +572,9 @@
517 572 */
518 573 public function output_database_optimize_tab() {
519 574 $optimizer = WP_Optimize()->get_optimizer();
520 575 $options = WP_Optimize()->get_options();
576 + $optimization_results = false;
521 577
522 578 $nonce_passed = TeamUpdraft\WP_Optimize\Includes\Fragments\verify_nonce('_wpnonce', 'wpo_optimization');
523 579
524 580 // save options.
@@ -529,14 +585,35 @@
529 585 $optimize_db = $nonce_passed && TeamUpdraft\WP_Optimize\Includes\Fragments\fetch_superglobal('post', 'optimize-db');
530 586
531 587 $optimization_results = (($nonce_passed) ? $optimizer->do_optimizations($_POST) : false); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Only isset is used to check, and compared again literal string
532 588
533 - // display optimizations table or restricted access message.
589 + // display optimization table or restricted access message.
534 590 if (WP_Optimize()->can_run_optimizations()) {
591 +
592 + $total_table_count = 0;
593 + $too_many_tables = $optimizer->is_table_count_too_high($total_table_count);
594 + $server_allows_table_optimization = WP_Optimize()->get_server_compatibility_instance()->does_server_allow_table_optimization();
595 +
535 596 $wp_optimize_commands = new WP_Optimize_Commands();
536 597 $status_data = $wp_optimize_commands->get_widgets_data(array('widgets' => array('all_status')));
537 598 $optimizations_table_data = $wp_optimize_commands->get_widgets_data(array('widgets' => array('wp_optimize')));
538 - WP_Optimize()->include_template('database/optimize-table.php', false, array('optimize_db' => $optimize_db, 'optimization_results' => $optimization_results, 'load_data' => false, 'does_server_allow_table_optimization' => WP_Optimize()->get_server_compatibility_instance()->does_server_allow_table_optimization(), 'optimizations_table_data' => $optimizations_table_data['data']['wp_optimize'], 'status_data' => $status_data['data']['all_status']));
599 +
600 + // Merge both sets of parameters
601 + $template_params = array(
602 + 'optimize_db' => $optimize_db,
603 + 'optimization_results' => $optimization_results,
604 + 'too_many_tables' => $too_many_tables && !$optimizer->is_large_table_count_scan_complete(),
605 + 'done_table_count' => $optimizer->get_table_status_count(),
606 + 'total_table_count' => $total_table_count,
607 + 'should_show_load_in_batches_button' => $server_allows_table_optimization && $too_many_tables && (0 < $total_table_count),
608 + 'load_data' => false,
609 + 'onboarding_active' => WP_Optimize()->get_onboarding()->is_active(),
610 + 'optimizations_table_data' => $optimizations_table_data['data']['wp_optimize'],
611 + 'status_data' => $status_data['data']['all_status'],
612 + );
613 +
614 + WP_Optimize()->include_template('database/optimize-table.php', false, $template_params);
615 +
539 616 } else {
540 617 $this->prevent_run_optimizations_message();
541 618 }
542 619 }
@@ -557,8 +634,16 @@
557 634 } else {
558 635 $this->prevent_run_optimizations_message();
559 636 }
560 637 }
638 +
639 + /**
640 + * Outputs Dashboard Tab
641 + */
642 + public function output_dashboard() {
643 + $data = WP_Optimize_Dashboard::instance()->get_dashboard_data();
644 + WP_Optimize()->include_template('dashboard/dashboard.php', false, $data);
645 + }
561 646
562 647 /**
563 648 * Outputs Performance 404 requests Tab
564 649 */
@@ -564,9 +649,9 @@
564 649 */
565 650 public function output_performance_404_requests() {
566 651 $wp_optimize = WP_Optimize();
567 652 $is_enabled = $wp_optimize->get_options()->get_option('404_detector', 0);
568 -
653 +
569 654 $detector = $wp_optimize->get_404_detector();
570 655 $suspicious_threshold = $detector->get_suspicious_request_count_threshold();
571 656
572 657 $report_has_data = false;
@@ -700,9 +785,9 @@
700 785 */
701 786 public function cache_admin_bar($wp_admin_bar) {
702 787 $options = WP_Optimize()->get_options();
703 788 if (!$options->get_option('enable_cache_in_admin_bar', true)) return;
704 -
789 +
705 790 /**
706 791 * The "purge cache" menu items
707 792 *
708 793 * @param array $menu_items - The menu items, in the format required by $wp_admin_bar->add_menu()
@@ -735,9 +820,9 @@
735 820 $capability_required = WP_Optimize()->capability_required();
736 821 $can_run_optimizations = WP_Optimize()->can_run_optimizations();
737 822 $can_manage_options = WP_Optimize()->can_manage_options();
738 823
739 - if (!current_user_can($capability_required) || (!$can_run_optimizations && !$can_manage_options)) return;
824 + if (!WP_Optimize()->current_user_can() || (!$can_run_optimizations && !$can_manage_options)) return;
740 825
741 826 $icon_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDE2IDE2IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc0MzE2IgogICBoZWlnaHQ9IjE2IgogICB3aWR0aD0iMTYiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0MzE4IiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQzMjEiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2EwYTVhYTtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJwYXRoNTciCiAgICAgICBkPSJtIDEwLjc2ODgwOSw2Ljc2MTYwNTEgMCwwIGMgLTAuMDE2ODgsLTAuMDE2ODc4IC0wLjAyNTMxLC0wLjA0MjE4MSAtMC4wMzM3NCwtMC4wNjc0OTkgLTAuMDA4NCwtMC4wMDgzOSAtMC4wMDg0LC0wLjAxNjg3OCAtMC4wMTY4OCwtMC4wMzM3NDMgQyA5Ljk5MjYxMTIsNS4xOTIzMzY2IDguMjIwODU1Nyw0LjU4NDg3ODEgNi43NDQzOTEyLDUuMjkzNTc5NyA1LjY3MjkwMDUsNS44MDgyMzI4IDUuMDU3MDA0Myw2Ljg4ODE2MTMgNS4wNjU0NDIsOC4wMDE4MzY1IDQuNDU3OTgyMiw3LjMxMDAwNzYgMy42OTg2NTg0LDYuNzk1MzU0NSAyLjg1NDk2NDIsNi40OTE2MjUzIDMuMjY4Mzc0Myw1LjA2NTc4MzEgNC4yNTU0OTYsMy44MTcxMTY2IDUuNjg5Nzc0NiwzLjEyNTI4NzggOC4zNjQyODMyLDEuODM0NDM2OCAxMS41NzAzMTksMi45Mzk2NzQ0IDEyLjg4NjQ4MSw1LjU4ODg3MjYgMTMuNDUxNzU1LDYuNzI3ODU5NiAxNC42NDk4MDEsNy4zNTIxOTIxIDE1Ljg0Nzg0Niw3LjIzNDA3NSAxNS43NjM0ODIsNi4zMzk3NiAxNS41MTg4MDUsNS40MzcwMDg2IDE1LjEwNTM5Niw0LjU3NjQ0MDQgMTMuMjE1NTIxLDAuNjg3MDEzNCA4LjUzMzAyMjYsLTAuOTQxMzE2MjcgNC42NDM1OTQzLDAuOTQwMTIxNzkgMi4zMjM0MzcsMi4wNjIyMzM0IDAuODA0Nzg4MTQsNC4xNzk5MDQ0IDAuMzU3NjMxMzIsNi41MzM4MDk4IDIuNDE2MjQzOCw2LjQyNDEyOSA0LjQzMjY3MTcsNy41MDQwNTc0IDUuNDM2NjY2Miw5LjQzNjExNjcgbCAwLjAwODM5LDAgYyAwLjc1OTMxOTIsMS4zNzUyMjAzIDIuNDcyMDE3OCwxLjk0MDQ5NTMgMy45MDYyOTYsMS4yNDg2NjczIDEuMDQ2MTc5OCwtMC41MDYyMTggMS42NTM2NDA4LC0xLjUzNTUyMzggMS42Nzg5NTA4LC0yLjYxNTQ1MTIgMC41ODIxNDgsMC43MDg3MDE4IDEuMzMzMDM1LDEuMjQ4NjY2OCAyLjE1OTg1NiwxLjU3NzcwNjQgLTAuNDM4NzIxLDEuMzU4MzQ3OCAtMS40MDA1MzMsMi41NDc5NTQ4IC0yLjc5MjYyNywzLjIxNDQ3ODggLTIuNTkwMTM4NywxLjI0ODY1OCAtNS42NzgwNTc0LDAuMjUzMTA0IC03LjA2MTcxNTEsLTIuMjI3MzU3IGwgMCwwIEMgMi43NjIxMDQ4LDkuNDUyOTg5NCAxLjUxMzQzODMsOC44MjAyMTkxIDAuMjgxNjQ1OTIsOC45NzIwODQ0IDAuMzgyODg3NjUsOS43OTg5MDQ2IDAuNjE5MTIzMzEsMTAuNjE3Mjg3IDAuOTk4Nzg1MiwxMS40MDE5MjIgYyAxLjg4MTQzNjgsMy44OTc4NjQgNi41NjM5MzcsNS41MjYxOTggMTAuNDYxODAwOCwzLjY0NDc2IDIuMjQ0MjI2LC0xLjA4ODM2OSAzLjczNzU2MiwtMy4xMDQ3OTYgNC4yMzUzNDIsLTUuMzc0MzMyMyAtMS45OTk1NTQsMC4wNDIxODEgLTMuOTQ4NDg2LC0xLjAyOTMwNjMgLTQuOTI3MTcsLTIuOTEwNzQzMyB6IgogICAgICAgY2xhc3M9InN0MTciIC8+CiAgPC9nPgo8L3N2Zz4K';
742 827
743 828 // Removes the admin menu items on the left WP bar.
@@ -765,11 +850,20 @@
765 850 */
766 851 public function get_submenu_items() {
767 852 $sub_menu_items = array(
768 853 array(
854 + 'page_title' => __('Overview', 'wp-optimize'),
855 + 'menu_title' => __('Overview', 'wp-optimize'),
856 + 'menu_slug' => 'WP-Optimize',
857 + 'function' => array($this, 'display_admin'),
858 + 'icon' => 'chart-bar',
859 + 'create_submenu' => true,
860 + 'order' => 10,
861 + ),
862 + array(
769 863 'page_title' => __('Database', 'wp-optimize'),
770 864 'menu_title' => __('Database', 'wp-optimize'),
771 - 'menu_slug' => 'WP-Optimize',
865 + 'menu_slug' => 'wpo_database',
772 866 'function' => array($this, 'display_admin'),
773 867 'icon' => 'cloud',
774 868 'create_submenu' => true,
775 869 'order' => 20,