load_admin(); add_action('admin_init', array($this, 'admin_init')); add_action('admin_bar_menu', array($this, 'cache_admin_bar'), 100, 1); add_action('init', array($this, 'schedule_plugin_cron_tasks')); add_filter("plugin_action_links_".plugin_basename(__FILE__), array($this, 'plugin_settings_link')); add_action('wpo_cron_event2', array($this, 'cron_action')); add_filter('cron_schedules', array($this, 'cron_schedules')); if (!$this->get_options()->get_option('installed-for', false)) $this->get_options()->update_option('installed-for', time()); if (!self::is_premium()) { add_action('auto_option_settings', array($this->get_options(), 'auto_option_settings')); } add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts')); add_action('wp_enqueue_scripts', array($this, 'frontend_enqueue_scripts')); if ($this->get_options()->get_option('404_detector', 0)) { WP_Optimize_Performance::get_instance($this->get_404_detector())->hook_404_handler(); } $this->load_ajax_handler(); WP_Optimize_Heartbeat::get_instance(); // Show update to Premium notice for non-premium multisite. add_action('wpo_additional_options', array($this, 'show_multisite_update_to_premium_notice')); // Action column (show repair button if need). add_filter('wpo_tables_list_additional_column_data', array($this, 'tables_list_additional_column_data'), 15, 2); /** * Add action for display Images > Compress images tab. */ add_action('wp_optimize_admin_page_wpo_images_smush', array($this, 'admin_page_wpo_images_smush')); include_once(WPO_PLUGIN_MAIN_PATH.'includes/updraftcentral.php'); include_once(WPO_PLUGIN_MAIN_PATH.'includes/backward-compatibility-functions.php'); register_shutdown_function(array($this, 'log_fatal_errors')); add_action('wpo_admin_before_closing_wrap', array($this, 'load_modal_template'), 20); add_action('upgrader_process_complete', array($this, 'detect_active_plugins_and_themes_updates'), 10, 2); $import_done_hooks = array( 'import_end', // wordpress importer 'pmxi_after_xml_import', // wp all import ); $db_update_hooks = apply_filters('wp_optimize_db_update_hooks', $import_done_hooks); foreach ($db_update_hooks as $hook) { add_action($hook, array($this, 'maybe_schedule_update_record_count_event')); } add_action('wpo_update_record_count_event', array($this->get_db_info(), 'wpo_update_record_count')); } /** * Check if minimum requirements for WP-Optimize is met or not. * * @return bool */ public function is_minimum_requirement_met() { return (version_compare(WPO_REQUIRED_PHP_VERSION, PHP_VERSION, '<=')); } /** * Add admin notice about minimum server requirements. */ public function add_notice_minimum_requirements_not_met() { add_action('admin_notices', array($this, 'output_php_version_notice')); } /** * Deactivate the plugin programmatically */ public function deactivate_plugin() { if (!function_exists('deactivate_plugins')) { require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } deactivate_plugins(plugin_basename(__FILE__)); } /** * Die after stating minimum requirements */ public function die_minimum_requirement_not_met() { $message = $this->get_php_version_notice_message(); $message .= ' '.esc_html__('Back to Plugins.', 'wp-optimize').''; wp_die($message); } /** * Auto-loads classes. * * @param string $class_name The name of the class. */ private function loader($class_name) { $dirs = $this->get_class_directories(); foreach ($dirs as $dir) { $class_file = WPO_PLUGIN_MAIN_PATH . trailingslashit($dir) . 'class-' . str_replace('_', '-', strtolower($class_name)) . '.php'; if (file_exists($class_file)) { require_once($class_file); return; } $interface_file = WPO_PLUGIN_MAIN_PATH . trailingslashit($dir) . 'interface-' . str_replace('_', '-', strtolower($class_name)) . '.php'; if (file_exists($interface_file)) { require_once($interface_file); return; } } // Include PHP Minify - https://github.com/matthiasmullie/minify if (strpos($class_name, 'MatthiasMullie') !== false) { $class_name_parts = explode('\\', $class_name); $class_file = WPO_PLUGIN_MAIN_PATH.'vendor/'.strtolower($class_name_parts[0]).'/'.strtolower(preg_replace('/([a-z])([A-Z])/', '$1-$2', $class_name_parts[1])).'/src/'.implode('/', array_slice($class_name_parts, 2)).'.php'; if (file_exists($class_file)) { require_once($class_file); return; } } if ('Minify_HTML' == $class_name) { require_once WPO_PLUGIN_MAIN_PATH.'vendor/mrclay/minify/lib/Minify/HTML.php'; return; } } /** * Returns an array of class directories * * @return array */ private function get_class_directories() { return array( 'cache', 'compatibility', 'includes', 'includes/tables', 'includes/list-tables', 'minify', 'optimizations', 'webp', ); } /** * Initialize Admin class to load admin UI */ private function load_admin() { $this->get_admin_instance(); } /** * Returns Admin class instance * * @return WP_Optimize_Admin */ public function get_admin_instance() { return WP_Optimize_Admin::instance(); } /** * Detect when an active plugin or theme is updated, and trigger an action * * @param object $upgrader_object * @param array $options * @return void */ public function detect_active_plugins_and_themes_updates($upgrader_object, $options) { if (empty($options) || !isset($options['type'])) return; $should_purge_cache = false; $skin = $upgrader_object->skin; if ('plugin' === $options['type']) { // A plugin is updated using the default update system (upgrader_overwrote_package is used for the upload method) if (property_exists($skin, 'plugin_active') && $skin->plugin_active) { $should_purge_cache = true; } } elseif ('theme' === $options['type']) { $active_theme = get_stylesheet(); $parent_theme = get_template(); // A theme is updated using the upload system if (isset($options['action']) && 'install' === $options['action'] && isset($skin->options['overwrite']) && 'update-theme' === $skin->options['overwrite']) { $updated_theme = $upgrader_object->result['destination_name']; // Check if the theme is in use if ($active_theme == $updated_theme || $parent_theme == $updated_theme) { $should_purge_cache = true; } // A theme is updated using the classic update system } elseif (isset($options['action']) && 'update' === $options['action'] && isset($options['themes']) && is_array($options['themes'])) { // Check if the theme is in use if (in_array($active_theme, $options['themes']) || in_array($parent_theme, $options['themes'])) { $should_purge_cache = true; } } } /** * Action executed when an active theme or plugin was updated */ if ($should_purge_cache) do_action('wpo_active_plugin_or_theme_updated'); } /** * Sets a flag to indicate an import action is done, if needed */ public function maybe_schedule_update_record_count_event() { if (!wp_next_scheduled('wpo_update_record_count_event')) { wp_schedule_single_event(time() + 60, 'wpo_update_record_count_event'); } } public function admin_page_wpo_images_smush() { $options = Updraft_Smush_Manager()->get_smush_options(); $custom = 90 >= $options['image_quality'] && 65 <= $options['image_quality']; $sites = WP_Optimize()->get_sites(); $this->include_template('images/smush.php', false, array('smush_options' => $options, 'custom' => $custom, 'sites' => $sites, 'does_server_allows_local_webp_conversion' => $this->does_server_allows_local_webp_conversion())); $this->include_template('images/smush-popup.php'); } public static function instance() { if (empty(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; } public function get_optimizer() { return WP_Optimizer::instance(); } /** * Adds 3rd party plugin compatibilities. */ public function load_compatibilities() { WPO_Polylang_Compatibility::instance(); WPO_Page_Builder_Compatibility::instance(); WPO_Custom_Permalink_Compatibility::instance(); WPO_TranslatePress_Compatibility::instance(); do_action('wpo_load_compatibilities'); } /** * Get and instantiate WP_Optimize_Minify * * @return WP_Optimize_Minify */ public function get_minify() { return WP_Optimize_Minify::instance(); } public function get_options() { return WP_Optimize_Options::instance(); } public function get_notices() { return WP_Optimize_Notices::instance(); } /** * Returns instance if WPO_Page_Cache class. * * @return WPO_Page_Cache */ public function get_page_cache() { return WPO_Page_Cache::instance(); } /** * Returns instance if WP_Optimize_WebP class. * * @return WP_Optimize_WebP */ public function get_webp_instance() { return WP_Optimize_WebP::get_instance(); } /** * Detects if the platform is Kinsta or not * * @return bool Returns true if it is Kinsta platform, otherwise returns false */ private function is_kinsta() { return isset($_SERVER['KINSTA_CACHE_ZONE']); } /** * Detects whether the server handles cache. eg. Nginx cache */ public function does_server_handles_cache() { return $this->is_kinsta(); } /** * Detects whether the server supports table optimization. * * Some servers prevent table optimization * because InnoDB engine does not optimize table * instead it drops tables and recreate them * which results in elevated disk write operations */ public function does_server_allows_table_optimization() { return !$this->is_kinsta(); } /** * Detects whether the server supports local webp conversion tools */ private function does_server_allows_local_webp_conversion() { return !$this->is_kinsta(); } /** * Create instance of WP_Optimize_Browser_Cache. * * @return WP_Optimize_Browser_Cache */ public function get_browser_cache() { return WP_Optimize_Browser_Cache::instance(); } /** * Returns WP_Optimize_Database_Information instance. * * @return WP_Optimize_Database_Information */ public function get_db_info() { return WP_Optimize_Database_Information::instance(); } /** * Returns instance of WP_Optimize_Gzip_Compression. * * @return WP_Optimize_Gzip_Compression */ public function get_gzip_compression() { return WP_Optimize_Gzip_Compression::instance(); } /** * Create instance of WP_Optimize_Htaccess. * * @param string $htaccess_file absolute path to htaccess file, by default it use .htaccess in WordPress root directory. * @return WP_Optimize_Htaccess */ public static function get_htaccess($htaccess_file = '') { return new WP_Optimize_Htaccess($htaccess_file); } /** * Return instance of Updraft_Logger * * @return Updraft_Logger */ public function get_logger() { return Updraft_Logger::instance(); } /** * Check if the current page belongs to WP-Optimize. * * @return bool */ public function is_wpo_page() { $current_screen = get_current_screen(); return (bool) preg_match('/wp\-optimize/i', $current_screen->id); } /** * Enqueue scripts and styles on WP-Optimize pages. */ public function admin_enqueue_scripts() { $enqueue_version = $this->get_enqueue_version(); $min_or_not = $this->get_min_or_not_string(); $min_or_not_internal = $this->get_min_or_not_internal_string(); // Register or enqueue common scripts wp_register_script('wp-optimize-send-command', WPO_PLUGIN_URL.'js/send-command'.$min_or_not_internal.'.js', array(), $enqueue_version); wp_localize_script('wp-optimize-send-command', 'wp_optimize_send_command_data', array('nonce' => wp_create_nonce('wp-optimize-ajax-nonce'))); wp_register_script('wp-optimize-block-ui', WPO_PLUGIN_URL.'js/blockUI'.$min_or_not_internal.'.js', array('jquery'), $enqueue_version); wp_enqueue_style('wp-optimize-global', WPO_PLUGIN_URL.'css/wp-optimize-global'.$min_or_not_internal.'.css', array(), $enqueue_version); // load scripts and styles only on WP-Optimize pages. if (!$this->is_wpo_page()) return; wp_enqueue_script('jquery-serialize-json', WPO_PLUGIN_URL.'js/serialize-json/jquery.serializejson'.$min_or_not.'.js', array('jquery'), $enqueue_version); wp_register_script('updraft-queue-js', WPO_PLUGIN_URL.'js/queue'.$min_or_not_internal.'.js', array(), $enqueue_version); wp_enqueue_script('wp-optimize-modal', WPO_PLUGIN_URL.'js/modal'.$min_or_not_internal.'.js', array('jquery', 'backbone', 'wp-util'), $enqueue_version); wp_enqueue_script('wp-optimize-cache-js', WPO_PLUGIN_URL.'js/cache'.$min_or_not_internal.'.js', array('wp-optimize-send-command', 'smush-js', 'wp-optimize-heartbeat-js', 'wp-optimize-block-ui'), $enqueue_version); wp_enqueue_script('wp-optimize-admin-js', WPO_PLUGIN_URL.'js/wpoadmin'.$min_or_not_internal.'.js', array('jquery', 'updraft-queue-js', 'wp-optimize-send-command', 'smush-js', 'wp-optimize-modal', 'wp-optimize-cache-js', 'wp-optimize-heartbeat-js'), $enqueue_version); wp_enqueue_style('wp-optimize-admin-css', WPO_PLUGIN_URL.'css/wp-optimize-admin'.$min_or_not_internal.'.css', array(), $enqueue_version); // Using tablesorter to help with organising the DB size on Table Information // https://github.com/Mottie/tablesorter wp_enqueue_script('tablesorter-js', WPO_PLUGIN_URL.'js/tablesorter/jquery.tablesorter'.$min_or_not.'.js', array('jquery', 'wp-optimize-send-command'), $enqueue_version); wp_enqueue_script('tablesorter-widgets-js', WPO_PLUGIN_URL.'js/tablesorter/jquery.tablesorter.widgets'.$min_or_not.'.js', array('jquery'), $enqueue_version); // wp_enqueue_style('tablesorter-css', WPO_PLUGIN_URL.'css/tablesorter/theme.default.min.css', array(), $enqueue_version); $js_variables = $this->wpo_js_translations(); $js_variables['loggers_classes_info'] = $this->get_loggers_classes_info(); wp_localize_script('wp-optimize-admin-js', 'wpoptimize', $js_variables); do_action('wpo_premium_scripts_styles', $min_or_not_internal, $min_or_not, $enqueue_version); wp_enqueue_script('wp-optimize-status-report', WPO_PLUGIN_URL.'js/status'.$min_or_not_internal.'.js', array('wp-api-fetch', 'wp-optimize-admin-js'), $enqueue_version); wp_enqueue_script('js-zip', WPO_PLUGIN_URL.'/js/jszip/jszip' . $min_or_not . '.js', array(), $enqueue_version); } /** * Enqueue any required front-end scripts * * @return void */ public function frontend_enqueue_scripts() { if (!current_user_can('manage_options') || !is_admin_bar_showing()) return; $enqueue_version = $this->get_enqueue_version(); $min_or_not_internal = WP_Optimize()->get_min_or_not_internal_string(); // Register or enqueue common scripts wp_enqueue_style('wp-optimize-global', WPO_PLUGIN_URL.'css/wp-optimize-global'.$min_or_not_internal.'.css', array(), $enqueue_version); } /** * Load Task Manager */ public function get_task_manager() { include_once(WPO_PLUGIN_MAIN_PATH.'vendor/team-updraft/common-libs/src/updraft-tasks/class-updraft-tasks-activation.php'); Updraft_Tasks_Activation::check_updates(); include_once(WPO_PLUGIN_MAIN_PATH . 'vendor/team-updraft/common-libs/src/updraft-tasks/class-updraft-task-meta.php'); include_once(WPO_PLUGIN_MAIN_PATH . 'vendor/team-updraft/common-libs/src/updraft-tasks/class-updraft-task-options.php'); include_once(WPO_PLUGIN_MAIN_PATH . 'vendor/team-updraft/common-libs/src/updraft-tasks/class-updraft-task.php'); include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-updraft-smush-task.php'); include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-updraft-smush-manager.php'); return Updraft_Smush_Manager(); } /** * Indicate whether we have an associated instance of WP-Optimize Premium or not. * * @returns Boolean */ public static function is_premium() { if (file_exists(WPO_PLUGIN_MAIN_PATH.'premium.php') && function_exists('WP_Optimize_Premium')) { $wp_optimize_premium = WP_Optimize_Premium(); if (is_a($wp_optimize_premium, 'WP_Optimize_Premium')) return true; } return false; } /** * Check if script running on Apache web server. $is_apache is set in wp-includes/vars.php. Also returns true if the server uses litespeed. * * @return bool */ public function is_apache_server() { global $is_apache; return $is_apache; } /** * Check if script running on IIS web server. * * @return bool */ public function is_IIS_server() { global $is_IIS, $is_iis7; return $is_IIS || $is_iis7; } /** * Check if Apache module or modules active. * * @param string|array $module - single Apache module name or list of Apache module names. * * @return bool|null - if null, the result was indeterminate */ public function is_apache_module_loaded($module) { if (!$this->is_apache_server()) return false; if (!function_exists('apache_get_modules')) return null; $module_loaded = true; if (is_array($module)) { foreach ($module as $single_module) { if (!in_array($single_module, apache_get_modules())) { $module_loaded = false; break; } } } else { $module_loaded = in_array($module, apache_get_modules()); } return $module_loaded; } /** * Checks if this is the premium version and loads it. It also ensures that if the free version is installed then it is disabled with an appropriate error message. */ public function plugins_loaded() { if (!$this->is_minimum_requirement_met()) { $this->add_notice_minimum_requirements_not_met(); $this->deactivate_plugin(); WPO_Deactivation::actions(); return; } if ($this->does_server_handles_cache()) { add_filter('wp_optimize_admin_page_wpo_cache_tabs', array($this, 'filter_cache_tabs'), 99, 1); // If newly migrated to server that handles cache, disable wpo cache $cache = $this->get_page_cache(); if ($cache->is_enabled()) { $cache->disable(); } } add_filter('robots_txt', array($this, 'robots_txt'), 99, 1); // Run Premium loader if it exists if (file_exists(WPO_PLUGIN_MAIN_PATH.'premium.php') && !class_exists('WP_Optimize_Premium')) { include_once(WPO_PLUGIN_MAIN_PATH.'premium.php'); } // load defaults WP_Optimize()->get_options()->set_default_options(); // Initialize loggers. $this->setup_loggers(); if ($this->is_active('premium') && false !== ($free_plugin = $this->is_active('free'))) { if (!function_exists('deactivate_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php'); deactivate_plugins($free_plugin); // If WPO_ADVANCED_CACHE is defined, we empty advanced-cache.php to regenerate later. Otherwise it contains the path to free. if (defined('WPO_ADVANCED_CACHE') && WPO_ADVANCED_CACHE) { $advanced_cache_filename = trailingslashit(WP_CONTENT_DIR) . 'advanced-cache.php'; if (!is_file($advanced_cache_filename) && is_writable(dirname($advanced_cache_filename)) || (is_file($advanced_cache_filename) && is_writable($advanced_cache_filename))) { file_put_contents($advanced_cache_filename, ''); } } // Registers the notice letting the user know it cannot be active if premium is active. add_action('admin_notices', array($this, 'show_admin_notice_premium')); return; } // Loads the task manager $this->get_task_manager(); add_action('init', array($this, 'load_language_file'), 0); // Load 3rd party plugin compatibilities. $this->load_compatibilities(); // Load page cache. $this->get_page_cache(); // We use the init hook to avoid the _load_textdomain_just_in_time warning, // which is triggered because we use translations during cache initialization add_action('init', array($this, 'init_page_cache'), 1); // Include minify $this->get_minify(); $this->run_updates(); // We need this here because webp can be unavailable because of server moves // This deletes already converted webp images and original image file when a media is deleted WP_Optimize_WebP_Images::get_instance(); // Include WebP if (WPO_USE_WEBP_CONVERSION) { $this->get_webp_instance(); } // add_filter('updraftcentral_host_plugins', array($this, 'attach_updraftcentral_host')); // if (file_exists(WPO_PLUGIN_MAIN_PATH.'central/factory.php')) include_once(WPO_PLUGIN_MAIN_PATH.'central/factory.php'); } /** * Loads the language file. * * @return void */ public function load_language_file() { load_plugin_textdomain('wp-optimize', false, dirname(plugin_basename(__FILE__)) . '/languages'); } /** * Attach this wp-optimize plugin as host of the UpdraftCentral libraries * (e.g. "central" folder) * * @param array $hosts List of plugins having the "central" library integrated into them * * @return array */ public function attach_updraftcentral_host($hosts) { $hosts[] = 'wp-optimize'; return $hosts; } /** * Filter cache tabs (when it is Kinsta) * * @param array $tabs An array of tabs * * @return array $tabs An array of tabs */ public function filter_cache_tabs($tabs) { unset($tabs['preload']); unset($tabs['advanced']); unset($tabs['gzip']); unset($tabs['settings']); return $tabs; } /** * Check whether one of free/Premium is active (whether it is this instance or not) * * @param String $which - 'free' or 'premium' * * @return String|Boolean - plugin path (if installed) or false if not */ private function is_active($which = 'free') { $active_plugins = $this->get_active_plugins(); foreach ($active_plugins as $file) { if ('wp-optimize.php' == basename($file)) { $plugin_dir = WP_PLUGIN_DIR.'/'.dirname($file); if (('free' == $which && !file_exists($plugin_dir.'/premium.php')) || ('free' != $which && file_exists($plugin_dir.'/premium.php'))) return $file; } } return false; } /** * Gets an array of plugins active on either the current site, or site-wide * * @return Array - a list of plugin paths (relative to the plugin directory) */ private function get_active_plugins() { // Gets all active plugins on the current site $active_plugins = get_option('active_plugins'); if (is_multisite()) { $network_active_plugins = get_site_option('active_sitewide_plugins'); if (!empty($network_active_plugins)) { $network_active_plugins = array_keys($network_active_plugins); $active_plugins = array_merge($active_plugins, $network_active_plugins); } } return $active_plugins; } /** * This function checks whether a specific plugin is installed, and returns information about it * * @param string $name Specify "Plugin Name" to return details about it. * @return array Returns an array of details such as if installed, the name of the plugin and if it is active. */ public function is_installed($name) { // Needed to have the 'get_plugins()' function include_once(ABSPATH.'wp-admin/includes/plugin.php'); // Gets all plugins available $get_plugins = get_plugins(); $active_plugins = $this->get_active_plugins(); $plugin_info = array(); $plugin_info['installed'] = false; $plugin_info['active'] = false; // Loops around each plugin available. foreach ($get_plugins as $key => $value) { // If the plugin name matches that of the specified name, it will gather details. if ($value['Name'] != $name && $value['TextDomain'] != $name) continue; $plugin_info['installed'] = true; $plugin_info['name'] = $key; $plugin_info['version'] = $value['Version']; if (in_array($key, $active_plugins)) { $plugin_info['active'] = true; } break; } return $plugin_info; } /** * This is a notice to show users that premium is installed */ public function show_admin_notice_premium() { echo '
'; if (isset($_GET['activate'])) unset($_GET['activate']); } /** * Show update to Premium notice for non-premium multisite. */ public function show_multisite_update_to_premium_notice() { if (!is_multisite() || self::is_premium()) return; echo ''; } public function admin_init() { $pagenow = $GLOBALS['pagenow']; $this->register_template_directories(); if (('index.php' == $pagenow && current_user_can('update_plugins')) || ('index.php' == $pagenow && defined('WP_OPTIMIZE_FORCE_DASHNOTICE') && WP_OPTIMIZE_FORCE_DASHNOTICE)) { $options = $this->get_options(); $dismissed_until = $options->get_option('dismiss_dash_notice_until', 0); if (file_exists(WPO_PLUGIN_MAIN_PATH . 'index.html')) { $installed = filemtime(WPO_PLUGIN_MAIN_PATH . 'index.html'); $installed_for = (time() - $installed); } if (($installed && time() > $dismissed_until && $installed_for > (14 * 86400) && !defined('WP_OPTIMIZE_NOADS_B')) || (defined('WP_OPTIMIZE_FORCE_DASHNOTICE') && WP_OPTIMIZE_FORCE_DASHNOTICE)) { add_action('all_admin_notices', array($this, 'show_admin_notice_upgraded')); } } if ($this->is_wp_smush_installed()) { add_filter('transient_wp-smush-conflict_check', array($this, 'modify_wp_smush_conflict_check'), 9, 1); } if ($this->get_options()->get_option('404_detector', 0)) { WP_Optimize_Performance::get_instance($this->get_404_detector())->init(); } } /** * Checks whether the WP Smush plugin is active or not * * @return bool */ private function is_wp_smush_installed() { return is_plugin_active('wp-smushit/wp-smush.php'); } /** * Remove WPO plugin name from WP Smushit transient value * * @return array $active_plugins */ public function modify_wp_smush_conflict_check($active_plugins) { // This can be boolean value since it is return value of get_transient if (!is_array($active_plugins)) return $active_plugins; if (false !== ($key = array_search('WP-Optimize - Clean, Compress, Cache', $active_plugins))) { unset($active_plugins[$key]); } return $active_plugins; } /** * Get the install or update notice instance * * @return WP_Optimize_Install_Or_Update_Notice */ public function get_install_or_update_notice() { static $instance = null; if (is_a($instance, 'WP_Optimize_Install_Or_Update_Notice')) return $instance; $instance = new WP_Optimize_Install_Or_Update_Notice(); return $instance; } /** * Display an admin notice for an upgraded version. */ public function show_admin_notice_upgraded() { $this->include_template('notices/thanks-for-using-main-dash.php', false, array( 'is_premium' => WP_Optimize::is_premium() )); } public function capability_required() { return apply_filters('wp_optimize_capability_required', 'manage_options'); } /** * Returns array of translations used in javascript code. * * @return array */ public function wpo_js_translations() { $log_message = __('For more details, please check your logs configured in logging destinations settings.', 'wp-optimize'); return apply_filters('wpo_js_translations', array( 'automatic_backup_before_optimizations' => __('Automatic backup before optimizations', 'wp-optimize'), 'error_unexpected_response' => __('An unexpected response was received.', 'wp-optimize'), 'optimization_complete' => __('Optimization complete', 'wp-optimize'), 'with_warnings' => __('(with warnings - open the browser console for more details)', 'wp-optimize'), 'optimizing_table' => __('Optimizing table:', 'wp-optimize'), 'run_optimizations' => __('Run optimizations', 'wp-optimize'), 'table_optimization_timeout' => 120000, 'add' => __('Add', 'wp-optimize'), 'cancel' => __('Cancel', 'wp-optimize'), 'cancelling' => __('Cancelling...', 'wp-optimize'), 'enable' => __('Enable', 'wp-optimize'), 'disable' => __('Disable', 'wp-optimize'), 'please_select_settings_file' => __('Please, select settings file.', 'wp-optimize'), 'are_you_sure_you_want_to_remove_logging_destination' => __('Are you sure you want to remove this logging destination?', 'wp-optimize'), 'fill_all_settings_fields' => __('Before saving, you need to complete the currently incomplete settings (or remove them).', 'wp-optimize'), 'table_was_not_repaired' => __('%s was not repaired.', 'wp-optimize') . ' ' . $log_message, 'table_was_not_deleted' => __('%s was not deleted.', 'wp-optimize') . ' ' . $log_message, 'table_was_not_converted' => __('%s was not converted to InnoDB.', 'wp-optimize') . ' ' . $log_message, 'please_use_positive_integers' => __('Please use positive integers.', 'wp-optimize'), 'please_use_valid_values' => __('Please use valid values.', 'wp-optimize'), 'update' => __('Update', 'wp-optimize'), 'run_now' => __('Run now', 'wp-optimize'), 'starting_preload' => __('Started preload...', 'wp-optimize'), 'loading_urls' => __('Loading URLs...', 'wp-optimize'), 'current_cache_size' => __('Current cache size:', 'wp-optimize'), 'number_of_files' => __('Number of files:', 'wp-optimize'), 'toggle_info' => __('Show information', 'wp-optimize'), 'delete_file' => __('Delete', 'wp-optimize'), 'deleting' => __('Deleting...', 'wp-optimize'), 'added_to_list' => __('Added to the list', 'wp-optimize'), 'added_notice' => __('The file was added to the list', 'wp-optimize'), 'save_notice' => __('Save the changes', 'wp-optimize'), 'saving' => __('Saving...', 'wp-optimize'), 'clearing_cache' => __('Clearing cache...', 'wp-optimize'), 'creating_cache' => __('Creating cache...', 'wp-optimize'), 'page_refresh' => __('Refreshing the page to reflect changes...', 'wp-optimize'), 'cache_file_not_found' => __('Cache file was not found.', 'wp-optimize'), 'settings_have_been_deleted_successfully' => __('WP-Optimize settings have been deleted successfully.', 'wp-optimize'), 'loading_data' => __('Loading data...', 'wp-optimize'), 'spinner_src' => esc_url(admin_url('images/spinner-2x.gif')), 'logo_src' => esc_url(WPO_PLUGIN_URL.'images/notices/wp_optimize_logo.png'), 'settings_page_url' => is_multisite() ? network_admin_url('admin.php?page=wpo_settings') : admin_url('admin.php?page=wpo_settings'), 'sites' => $this->get_sites(), 'user_always_ignores_table_deletion_warning' => (get_user_meta(get_current_user_id(), 'wpo-ignores-table-deletion-warning', true)) ? true : false, 'user_always_ignores_post_meta_deletion_warning' => (get_user_meta(get_current_user_id(), 'wpo-ignores-post-meta-deletion-warning', true)) ? true : false, 'user_always_ignores_orphaned_relationship_data_deletion_warning' => (get_user_meta(get_current_user_id(), 'wpo-ignores-orphaned-relationship-data-deletion-warning', true)) ? true : false, 'post_meta_tweak_completed' => __('The tweak has been performed.', 'wp-optimize'), 'no_minified_assets' => __('No minified files are present', 'wp-optimize'), 'network_site_url' => network_site_url(), 'export_settings_file_name' => 'wpoptimize-settings-'.sanitize_title(get_bloginfo('name')).'.json', 'import_select_file' => __('You have not yet selected a file to import.', 'wp-optimize'), 'import_invalid_json_file' => __('Error: The chosen file is corrupt.', 'wp-optimize') . ' ' . __('Please choose a valid WP-Optimize export file.', 'wp-optimize'), 'importing' => __('Importing...', 'wp-optimize'), 'importing_data_from' => __('This will import data from:', 'wp-optimize'), 'exported_on' => __('Which was exported on:', 'wp-optimize'), 'continue_import' => __('Do you want to carry out the import?', 'wp-optimize'), 'select_destination' => __('Select destination', 'wp-optimize'), 'show' => __('Show', 'wp-optimize'), 'hide' => __('Hide', 'wp-optimize'), 'please_wait' => __('Please wait a moment...', 'wp-optimize'), 'clipboard_failed' => __('Copy to clipboard failed, please do it manually', 'wp-optimize'), 'clipboard_success' => __('System status has been copied to the clipboard', 'wp-optimize'), 'show_information' => __('Show information', 'wp-optimize'), 'hide_information' => __('Hide information', 'wp-optimize'), 'data_not_available' => __('Not available', 'wp-optimize') )); } /** * Manages the admin bar menu for caching (currently page and minify) */ public function cache_admin_bar($wp_admin_bar) { $options = $this->get_options(); if (!$options->get_option('enable_cache_in_admin_bar', true)) return; /** * The "purge cache" menu items * * @param array $menu_items - The menu items, in the format required by $wp_admin_bar->add_menu() * @param object $wp_admin_bar */ $menu_items = apply_filters('wpo_cache_admin_bar_menu_items', array(), $wp_admin_bar); if (empty($menu_items) || !is_array($menu_items)) return; $wp_admin_bar->add_menu(array( 'id' => 'wpo_purge_cache', 'title' => __('Purge cache', 'wp-optimize'), 'href' => '#', 'meta' => array( 'title' => __('Purge cache', 'wp-optimize'), ), 'parent' => false, )); foreach ($menu_items as $item) { $wp_admin_bar->add_menu($item); } } /** * Add settings link on plugin page * * @param string $links Passing through the URL to be used within the HREF. * @return string Returns the Links. */ public function plugin_settings_link($links) { $admin_page_url = $this->get_options()->admin_page_url(); $settings_page_url = $this->get_options()->admin_page_url('wpo_settings'); if (false == self::is_premium()) { $premium_link = '' . __('Premium', 'wp-optimize') . ''; array_unshift($links, $premium_link); } $settings_link = '' . __('Settings', 'wp-optimize') . ''; array_unshift($links, $settings_link); $optimize_link = '' . __('Optimize', 'wp-optimize') . ''; array_unshift($links, $optimize_link); return $links; } /** * Action wpo_tables_list_additional_column_data. Output button Optimize in the action column. * * @param string $content String for output to column * @param object $table_info Object with table info. * * @return string */ public function tables_list_additional_column_data($content, $table_info) { if ($table_info->is_needing_repair) { $content .= ' '; } // table belongs to plugin. if ($table_info->can_be_removed) { $content .= ''; $ret .= ''.__('Warning', 'wp-optimize').': '.sprintf(__('WordPress has a number (%d) of scheduled tasks which are overdue.', 'wp-optimize'), $howmany).' '. __('Unless this is a development site, this probably means that the scheduler in your WordPress install is not working.', 'wp-optimize').' '.__('Read this page for a guide to possible causes and how to fix it.', 'wp-optimize').''; $ret .= '
get_php_version_notice_message(); ?>