38217-vm/wp-content/plugins/mainwp-child/class/class-mainwp-child-wp-rocket.php
2026-02-05 17:08:59 +03:00

1094 lines
40 KiB
PHP

<?php
/**
* MainWP Rocket
*
* MainWP Rocket extension handler.
* Extension URL: https://mainwp.com/extension/rocket/
*
* @package MainWP\Child
*
* Credits
*
* Plugin-Name: WP Rocket
* Plugin-URI: https://wp-rocket.me
* Author: WP Media
* Author URI: http://wp-media.me
* Licence: GPLv2 or later
*/
namespace MainWP\Child;
// phpcs:disable PSR1.Classes.ClassDeclaration, WordPress.WP.AlternativeFunctions -- required to achieve desired results, pull request solutions appreciated.
/**
* Class MainWP_Child_WP_Rocket
*
* MainWP Rocket extension handler.
*/
class MainWP_Child_WP_Rocket {//phpcs:ignore -- NOSONAR - multi methods.
/**
* Public static variable to hold the single instance of the class.
*
* @var mixed Default null
*/
public static $instance = null;
/**
* Public variable to hold the infomration if the WP Rocket plugin is installed on the child site.
*
* @var bool If WP Rocket intalled, return true, if not, return false.
*/
public $is_plugin_installed = false;
/**
* Public variable to hold the information about the language domain.
*
* @var string 'mainwp-child' languge domain.
*/
public $plugin_translate = 'mainwp-child';
/**
* Method instance()
*
* Create a public static instance.
*
* @return mixed Class instance.
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* MainWP_Child_WP_Rocket constructor.
*
* Run any time class is called.
*/
public function __construct() {
if ( is_plugin_active( 'wp-rocket/wp-rocket.php' ) ) {
$this->is_plugin_installed = true;
}
}
/**
* Method init()
*
* Initiate action hooks.
*
* @return void
*/
public function init() {
if ( ! $this->is_plugin_installed ) {
return;
}
add_filter( 'mainwp_site_sync_others_data', array( $this, 'sync_others_data' ), 10, 2 );
if ( 'hide' === get_option( 'mainwp_wprocket_hide_plugin' ) ) {
add_filter( 'all_plugins', array( $this, 'all_plugins' ) );
add_action( 'admin_menu', array( $this, 'remove_menu' ) );
add_filter( 'site_transient_update_plugins', array( &$this, 'remove_update_nag' ) );
add_filter( 'mainwp_child_hide_update_notice', array( &$this, 'hide_update_notice' ) );
add_action( 'wp_before_admin_bar_render', array( $this, 'wp_before_admin_bar_render' ), 99 );
add_action( 'admin_init', array( $this, 'remove_notices' ) );
}
}
/**
* Method get_rocket_default_options()
*
* WP Rocket plugin settings default options.
*
* @return array Default options.
*/
public function get_rocket_default_options() {
return array(
'emoji' => 0,
'embeds' => 1,
'control_heartbeat' => 0,
'heartbeat_site_behavior' => 'reduce_periodicity',
'heartbeat_admin_behavior' => 'reduce_periodicity',
'heartbeat_editor_behavior' => 'reduce_periodicity',
'manual_preload' => 0,
'preload_excluded_uri' => array(),
'automatic_preload' => 0,
'sitemap_preload' => 0,
'preload_links' => 0,
'sitemaps' => array(),
'database_revisions' => 0,
'database_auto_drafts' => 0,
'database_trashed_posts' => 0,
'database_spam_comments' => 0,
'database_trashed_comments' => 0,
'database_expired_transients' => 0,
'database_all_transients' => 0,
'database_optimize_tables' => 0,
'schedule_automatic_cleanup' => 0,
'automatic_cleanup_frequency' => '',
'cache_reject_uri' => array(),
'cache_reject_cookies' => array(),
'cache_reject_ua' => array(),
'cache_query_strings' => array(),
'cache_purge_pages' => array(),
'purge_cron_interval' => 10,
'purge_cron_unit' => 'HOUR_IN_SECONDS',
'exclude_css' => array(),
'exclude_js' => array(),
'exclude_inline_js' => array(),
'async_css' => 0,
'defer_all_js' => 0,
'critical_css' => '',
'remove_unused_css_safelist' => '',
'exclude_defer_js' => array(),
'delay_js' => 0,
'delay_js_exclusions_selected' => array(),
'delay_js_exclusions' => array(),
'delay_js_scripts' => array(),
'lazyload' => 0,
'lazyload_css_bg_img' => 0,
'lazyload_iframes' => 0,
'exclude_lazyload' => array(),
'lazyload_youtube' => 0,
'minify_css' => 0,
'image_dimensions' => 0,
'minify_concatenate_css' => 0,
'minify_css_legacy' => 0,
'minify_js' => 0,
'minify_concatenate_js' => 0,
'minify_js_combine_all' => 0,
'preload_fonts' => array(),
'dns_prefetch' => 0,
'cdn' => 0,
'cdn_cnames' => array(),
'cdn_zone' => array(),
'cdn_reject_files' => array(),
'do_cloudflare' => 0,
'cloudflare_email' => '',
'cloudflare_api_key' => '',
'cloudflare_domain' => '',
'cloudflare_devmode' => 0,
'cloudflare_protocol_rewrite' => 0,
'cloudflare_auto_settings' => 0,
'cloudflare_old_settings' => 0,
'analytics_enabled' => 0,
'google_analytics_cache' => 0,
'facebook_pixel_cache' => 0,
'sucury_waf_cache_sync' => 0,
'cache_logged_user' => 0,
'varnish_auto_purge' => 0,
'cache_webp' => 0,
'cloudflare_zone_id' => '',
'sucury_waf_api_key' => '',
'host_fonts_locally' => 0, // Host Google Fonts Locally.
'delay_js_execution_safe_mode' => 0, // Safe Mode for Delay JavaScript Execution.
);
}
/**
* Method sync_others_data()
*
* Sync the WP Rocket plugin settings.
*
* @param array $information Array containing the sync information.
* @param array $data Array containing the WP Rocekt plugin data to be synced.
*
* @return array $information Array containing the sync information.
*/
public function sync_others_data( $information, $data = array() ) {
if ( isset( $data['syncWPRocketData'] ) && ( 'yes' === $data['syncWPRocketData'] ) ) {
try {
$data = array(
'rocket_boxes' => get_user_meta( $GLOBALS['current_user']->ID, 'rocket_boxes', true ),
'lists_delayjs' => get_option( '_transient_wpr_dynamic_lists_delayjs', array() ),
'lists_delayjs_full_list' => $this->prepare_delayjs_ui_list(),
);
$information['syncWPRocketData'] = $data;
} catch ( MainWP_Exception $e ) {
// ok!
}
}
return $information;
}
/**
* Prepare the list of scripts, plugins and theme for the view.
*
* @return array|array[]
*/
public function prepare_delayjs_ui_list() {
$list = get_transient( 'wpr_dynamic_lists_delayjs' );
if ( empty( $list ) ) {
return array();
}
$full_list = array(
'scripts' => array(
'items' => array(
'analytics' => array(
'title' => __( 'Analytics & Trackers', 'mainwp-child' ),
'items' => array(),
'svg-icon' => 'analytics',
),
'ad_networks' => array(
'title' => __( 'Ad Networks', 'mainwp-child' ),
'items' => array(),
'svg-icon' => 'ad_network',
),
'payment_processors' => array(
'title' => __( 'Payment Processors', 'mainwp-child' ),
'items' => array(),
'svg-icon' => 'payment',
),
'other_services' => array(
'title' => __( 'Other Services', 'mainwp-child' ),
'items' => array(),
'svg-icon' => 'others',
),
),
),
'plugins' => array(
'items' => array(),
),
'themes' => array(
'items' => array(),
),
);
$script_types = array(
'analytics' => 'get_analytics_from_list',
'ad_networks' => 'get_ad_networks_from_list',
'payment_processors' => 'get_payment_processors_from_list',
'other_services' => 'get_other_services_from_list',
);
foreach ( $script_types as $type => $method ) {
$scripts = $this->$method( $list );
foreach ( $scripts as $script_key => $script ) {
$full_list['scripts']['items'][ $type ]['items'][] = array(
'id' => $script_key,
'title' => $script->title,
'icon' => $this->get_icon( $script ),
);
}
}
$active_plugins = $this->get_active_plugins();
$plugins_list = ! empty( $list->plugins ) ? (array) $list->plugins : array();
foreach ( $plugins_list as $plugin_key => $plugin ) {
if ( ! in_array( $plugin->condition, $active_plugins, true ) ) {
continue;
}
$full_list['plugins']['items'][] = array(
'id' => $plugin_key,
'title' => $plugin->title,
'icon' => $this->get_icon( $plugin ),
);
}
$active_theme = $this->get_active_theme();
$themes_list = ! empty( $list->themes ) ? (array) $list->themes : array();
foreach ( $themes_list as $theme_key => $theme ) {
if ( $theme->condition !== $active_theme ) {
continue;
}
$full_list['themes']['items'][] = array(
'id' => $theme_key,
'title' => $theme->title,
'icon' => $this->get_icon( $theme ),
);
}
return $full_list;
}
/**
* Get Analytics scripts from the list.
*
* @param object $lists List of scripts.
* @return array
*/
private function get_analytics_from_list( $lists ) {
return ! empty( $lists->scripts->analytics ) ? (array) $lists->scripts->analytics : array();
}
/**
* Get Ad Networks from the list.
*
* @param object $lists List of scripts.
* @return array
*/
private function get_ad_networks_from_list( $lists ) {
return ! empty( $lists->scripts->ad_networks ) ? (array) $lists->scripts->ad_networks : array();
}
/**
* Get Payment Processors from the list.
*
* @param object $lists List of scripts.
* @return array
*/
private function get_payment_processors_from_list( $lists ) {
return ! empty( $lists->scripts->payment_processors ) ? (array) $lists->scripts->payment_processors : array();
}
/**
* Get Other Services from the list.
*
* @param object $lists List of scripts.
* @return array
*/
private function get_other_services_from_list( $lists ) {
return ! empty( $lists->scripts->other_services ) ? (array) $lists->scripts->other_services : array();
}
/**
* Fetch the icon.
*
* @param object $item item from the list.
* @return string
*/
private function get_icon( $item ) {
if ( empty( $item->icon_url ) ) {
return '';
}
return $item->icon_url;
}
/**
* Get active plugins (list of IDs).
*
* @return array
*/
public function get_active_plugins() {
$plugins = (array) get_option( 'active_plugins', array() );
if ( ! is_multisite() ) {
return $plugins;
}
return array_merge(
$plugins,
array_keys( (array) get_site_option( 'active_sitewide_plugins', array() ) )
);
}
/**
* Get active theme ID.
*
* @return string
*/
public function get_active_theme() {
return $this->get_theme_name( wp_get_theme() );
}
/**
* Get theme name from theme object.
*
* @param WP_Theme $theme Theme to get its name.
*
* @return string
*/
private function get_theme_name( $theme ) {
if ( ! $theme instanceof \WP_Theme ) {
return 'Undefined';
}
$parent = $theme->get_template();
if ( ! empty( $parent ) ) {
return $parent;
}
return $theme->get( 'Name' );
}
/**
* Method remove_notices()
*
* Remove admin notices thrown by the WP Rocket plugin when the plugin is hidden.
*
* @uses MainWP_Child_WP_Rocket::remove_filters_with_method_name() Remove filters with method name.
*/
public function remove_notices() {
$remove_hooks['admin_notices'] = array(
'rocket_bad_deactivations' => 10,
'rocket_warning_plugin_modification' => 10,
'rocket_plugins_to_deactivate' => 10,
'rocket_warning_using_permalinks' => 10,
'rocket_warning_wp_config_permissions' => 10,
'rocket_warning_advanced_cache_permissions' => 10,
'rocket_warning_advanced_cache_not_ours' => 10,
'rocket_warning_htaccess_permissions' => 10,
'rocket_warning_config_dir_permissions' => 10,
'rocket_warning_cache_dir_permissions' => 10,
'rocket_warning_minify_cache_dir_permissions' => 10,
'rocket_thank_you_license' => 10,
'rocket_need_api_key' => 10,
);
foreach ( $remove_hooks as $hook_name => $hooks ) {
foreach ( $hooks as $method => $priority ) {
static::remove_filters_with_method_name( $hook_name, $method, $priority );
}
}
}
/**
* Method remove_filters_with_method_name()
*
* Remove filters with method name.
*
* @param string $hook_name Contains the hook name.
* @param string $method_name Contains the method name.
* @param int $priority Contains the priority value.
*
* @used-by MainWP_Child_WP_Rocket::remove_notices() Remove admin notices thrown by the WP Rocket plugin when the plugin is hidden.
*
* @return bool Return false if filtr is not set.
*/
public static function remove_filters_with_method_name( $hook_name = '', $method_name = '', $priority = 0 ) {
/**
* WordPress filter array.
*
* @global array $wp_filter WordPress filter array.
*/
global $wp_filter;
// Take only filters on right hook name and priority.
if ( ! isset( $wp_filter[ $hook_name ][ $priority ] ) || ! is_array( $wp_filter[ $hook_name ][ $priority ] ) ) {
return false;
}
// Loop on filters registered.
foreach ( (array) $wp_filter[ $hook_name ][ $priority ] as $unique_id => $filter_array ) {
// Test if filter is an array ! (always for class/method).
if ( isset( $filter_array['function'] ) && is_array( $filter_array['function'] ) && is_object( $filter_array['function'][0] ) && get_class( $filter_array['function'][0] ) && $filter_array['function'][1] === $method_name ) {
// Test for WordPress >= 4.7 WP_Hook class.
if ( is_a( $wp_filter[ $hook_name ], 'WP_Hook' ) ) {
unset( $wp_filter[ $hook_name ]->callbacks[ $priority ][ $unique_id ] );
} else {
unset( $wp_filter[ $hook_name ][ $priority ][ $unique_id ] );
}
}
}
return false;
}
/**
* Method wp_before_admin_bar_render()
*
* Remove the WP Rocket admin bar node when the plugin is hidden.
*/
public function wp_before_admin_bar_render() {
/**
* WordPress admin bar array.
*
* @global array $wp_admin_bar WordPress admin bar array.
*/
global $wp_admin_bar;
$nodes = $wp_admin_bar->get_nodes();
if ( is_array( $nodes ) ) {
foreach ( $nodes as $node ) {
$node->id = 'wp-rocket';
if ( 'wp-rocket' === $node->parent || $node->id ) {
$wp_admin_bar->remove_node( $node->id );
}
}
}
}
/**
* Method hide_update_notice()
*
* Remove the WP Rocket plugin update notice when the plugin is hidden.
*
* @param array $slugs Array containing installed plugins slugs.
*
* @return array $slugs Array containing installed plugins slugs.
*/
public function hide_update_notice( $slugs ) {
$slugs[] = 'wp-rocket/wp-rocket.php';
return $slugs;
}
/**
* Method remove_update_nag()
*
* Remove the WP Rocket plugin update notice when the plugin is hidden.
*
* @param object $value Object containing update information.
*
* @return object $value Object containing update information.
*
* @uses \MainWP\Child\MainWP_Helper::is_updates_screen()
*/
public function remove_update_nag( $value ) {
if ( MainWP_Helper::is_dashboard_request() ) {
return $value;
}
if ( ! MainWP_Helper::is_updates_screen() ) {
return $value;
}
if ( isset( $value->response['wp-rocket/wp-rocket.php'] ) ) {
unset( $value->response['wp-rocket/wp-rocket.php'] );
}
return $value;
}
/**
* Method is_activated()
*
* Check if the WP Rocket pulgin is activated.
*
* @return bool If the WP Rocket pulgin is active, return true, if not, return false.
*/
public function is_activated() {
if ( ! $this->is_plugin_installed ) {
return false;
}
return true;
}
/**
* Method remove_menu()
*
* Remove the WP Rocket menu item when the plugin is hidden.
*/
public function remove_menu() {
/**
* WordPress submenu array.
*
* @global array $submenu WordPress submenu array.
*/
global $submenu;
if ( isset( $submenu['options-general.php'] ) ) {
foreach ( $submenu['options-general.php'] as $index => $item ) {
if ( 'wprocket' === $item[2] ) {
unset( $submenu['options-general.php'][ $index ] );
break;
}
}
}
$pos = isset( $_SERVER['REQUEST_URI'] ) ? stripos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'options-general.php?page=wprocket' ) : false;
if ( false !== $pos ) {
wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' );
exit();
}
}
/**
* Method all_plugins()
*
* Remove the WP Rocket plugin from the list of all plugins when the plugin is hidden.
*
* @param array $plugins Array containing all installed plugins.
*
* @return array $plugins Array containing all installed plugins without the WP Rocket.
*/
public function all_plugins( $plugins ) {
foreach ( $plugins as $key => $value ) {
$plugin_slug = basename( $key, '.php' );
if ( 'wp-rocket' === $plugin_slug ) {
unset( $plugins[ $key ] );
}
}
return $plugins;
}
/**
* Method actions()
*
* Fire off certain WP Rocket plugin actions.
*
* @return void
*
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::set_showhide() Hide or unhide the WP Rocket plugin.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::purge_cloudflare() Purge the Cloudflare cache.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::preload_purge_cache_all() Purge all cache.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::generate_critical_css() Generate critical CSS.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::save_settings() Save the plugin settings.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::load_existing_settings() Load existing settings.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::optimize_database() Optimize database tables.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::get_optimize_info() Get the optimization information.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::do_admin_post_rocket_purge_opcache() Do admin post to purge opcache.
* @uses \MainWP\Child\MainWP_Child_WP_Rocket::update_exclusion_list() Update inclusion and exclusion lists.
* @uses \MainWP\Child\MainWP_Helper::write()
*/
public function action() { //phpcs:ignore -- NOSONAR -complex.
// Check if the WP Rocket plugin is installed on the child website.
if ( ! $this->is_plugin_installed ) {
MainWP_Helper::write( array( 'error' => esc_html__( 'Please install WP Rocket plugin on child website', $this->plugin_translate ) ) );
return;
}
// Action to be performed.
$mwp_action = MainWP_System::instance()->validate_params( 'mwp_action' );
// Run specific wprocket method based on the passed action.
$information = array();
if ( ! empty( $mwp_action ) ) {
try {
switch ( $mwp_action ) {
case 'set_showhide':
$information = $this->set_showhide();
break;
case 'purge_cloudflare':
$information = $this->purge_cloudflare();
break;
case 'preload_purge_all':
$information = $this->preload_purge_cache_all();
break;
case 'generate_critical_css':
$information = $this->generate_critical_css();
break;
case 'save_settings':
$information = $this->save_settings();
break;
case 'load_existing_settings':
$information = $this->load_existing_settings();
break;
case 'optimize_database':
$information = $this->optimize_database();
break;
case 'get_optimize_info':
$information = $this->get_optimize_info();
break;
case 'purge_opcache':
$information = $this->do_admin_post_rocket_purge_opcache();
break;
case 'update_exclusion_list':
$information = $this->update_exclusion_list();
break;
case 'clear_priority_elements':
$information = $this->clear_priority_elements();
break;
default:
break;
}
} catch ( MainWP_Exception $e ) {
$information = array( 'error' => $e->getMessage() );
}
}
MainWP_Helper::write( $information );
}
/**
* Method set_showhide()
*
* Hide or unhide the WP Rocket plugin.
*
* @return array Action result.
*
* @used-by \MainWP\Child\MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
* @uses \MainWP\Child\MainWP_Helper::update_option()
*/
public function set_showhide() {
$hide = MainWP_System::instance()->validate_params( 'showhide' );
MainWP_Helper::update_option( 'mainwp_wprocket_hide_plugin', $hide );
$information['result'] = 'SUCCESS';
return $information;
}
/**
* Method do_admin_post_rocket_purge_opcache()
*
* Do admin post to purge opcache.
*
* @used-by MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
*
* @return array Action result.
*/
public function do_admin_post_rocket_purge_opcache() {
if ( function_exists( 'opcache_reset' ) ) {
opcache_reset();
} else {
return array( 'error' => 'The host do not support the function reset opcache.' );
}
return array( 'result' => 'SUCCESS' );
}
/**
* Method purge_cloudflare()
*
* Purge the Cloudflare cache.
*
* @used-by MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
*
* @return array Action result.
*/
public function purge_cloudflare() {
if ( function_exists( 'rocket_purge_cloudflare' ) ) {
rocket_purge_cloudflare();
return array( 'result' => 'SUCCESS' );
} else {
return array( 'error' => 'function_not_exist' );
}
}
/**
* Method require_file_path()
*
* Include necessary files.
*
* @param string $function_name function Name.
* @param string $file_name file Name.
*/
private function require_file_path( $function_name, $file_name ) {
if ( ! function_exists( $function_name ) && defined( 'WP_ROCKET_FUNCTIONS_PATH' ) ) {
require_once WP_ROCKET_FUNCTIONS_PATH . $file_name; // NOSONAR - WP compatible.
}
}
/**
* Method preload_purge_cache_all()
*
* Purge all cache.
*
* @used-by MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
*
* @return array Action result.
*/
public function preload_purge_cache_all() {
if ( function_exists( 'rocket_clean_domain' ) || function_exists( 'rocket_clean_minify' ) || function_exists( 'create_rocket_uniqid' ) ) {
set_transient( 'rocket_clear_cache', 'all', HOUR_IN_SECONDS );
// Require files to make sure the functions are available.
$this->require_file_path( 'get_rocket_i18n_uri', 'i18n.php' );
$this->require_file_path( 'get_rocket_parse_url', 'formatting.php' );
$this->require_file_path( 'create_rocket_uniqid', 'admin.php' );
rocket_clean_domain();
rocket_clean_minify();
if ( function_exists( 'rocket_clean_cache_busting' ) ) {
rocket_clean_cache_busting();
}
if ( ! function_exists( 'rocket_dismiss_boxes' ) && defined( 'WP_ROCKET_ADMIN_PATH' ) ) {
require_once WP_ROCKET_ADMIN_PATH . 'admin.php'; // NOSONAR - WP compatible.
}
include_once ABSPATH . '/wp-admin/includes/template.php'; // NOSONAR -- WP compatible.
$options = get_option( WP_ROCKET_SLUG );
$options['minify_css_key'] = create_rocket_uniqid();
$options['minify_js_key'] = create_rocket_uniqid();
remove_all_filters( 'update_option_' . WP_ROCKET_SLUG );
update_option( WP_ROCKET_SLUG, $options );
rocket_dismiss_box( 'rocket_warning_plugin_modification' );
// call preload cache.
$this->preload_cache();
return array( 'result' => 'SUCCESS' );
} else {
return array( 'error' => 'function_not_exist' );
}
}
/**
* Method preload_cache()
*
* Preload cache.
*
* @return array Action result.
* @throws MainWP_Exception Error message.
*
* @used-by \MainWP\Child\MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
* @uses \MainWP\Child\MainWP_Helper::instance()->check_methods()
* @uses \MainWP\Child\MainWP_Helper::instance()->check_classes_exists()
*/
public function preload_cache() {
MainWP_Helper::instance()->check_functions( array( 'run_rocket_sitemap_preload', 'run_rocket_bot' ) );
$existed = MainWP_Helper::instance()->check_classes_exists( '\WP_Rocket\Engine\Preload\FullProcess', true );
// compatible.
if ( true === $existed ) {
$preload_process = new \WP_Rocket\Engine\Preload\FullProcess();
MainWP_Helper::instance()->check_methods( $preload_process, array( 'is_process_running' ) );
if ( $preload_process->is_process_running() ) {
return array( 'result' => 'RUNNING' );
}
delete_transient( 'rocket_preload_errors' );
run_rocket_bot( 'cache-preload', '' );
run_rocket_sitemap_preload();
return array( 'result' => 'SUCCESS' );
} else {
// Preload cache.
run_rocket_bot();
run_rocket_sitemap_preload();
return array( 'result' => 'SUCCESS' );
}
}
/**
* Method generate_critical_css()
*
* Generate critical CSS.
*
* @return array Action result.
* @throws MainWP_Exception Error message.
*
* @used-by \MainWP\Child\MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
* @uses \MainWP\Child\MainWP_Helper::instance()->check_properties()
* @uses \MainWP\Child\MainWP_Helper::instance()->check_classes_exists()
*/
public function generate_critical_css() {
$old_version = false;
if ( class_exists( '\WP_Rocket\Subscriber\Optimization\Critical_CSS_Subscriber' ) ) { // to compatible with old version.
MainWP_Helper::instance()->check_classes_exists(
array(
'\WP_Rocket\Subscriber\Optimization\Critical_CSS_Subscriber',
'\WP_Rocket\Optimization\CSS\Critical_CSS',
'\WP_Rocket\Optimization\CSS\Critical_CSS_Generation',
'\WP_Rocket\Admin\Options',
'\WP_Rocket\Admin\Options_Data',
)
);
$old_version = true;
} else {
MainWP_Helper::instance()->check_classes_exists(
array(
'\WP_Rocket\Engine\CriticalPath\CriticalCSS',
'\WP_Rocket\Engine\CriticalPath\CriticalCSSGeneration',
'\WP_Rocket\Engine\CriticalPath\ProcessorService',
'\WP_Rocket\Engine\CriticalPath\DataManager',
'\WP_Rocket\Engine\CriticalPath\APIClient',
'\WP_Rocket\Admin\Options',
'\WP_Rocket\Admin\Options_Data',
)
);
MainWP_Helper::instance()->check_functions( array( '\rocket_direct_filesystem', '\rocket_get_constant' ) );
}
if ( $old_version ) {
$critical_css = new \WP_Rocket\Optimization\CSS\Critical_CSS( new \WP_Rocket\Optimization\CSS\Critical_CSS_Generation() );
$options_api = new \WP_Rocket\Admin\Options( 'wp_rocket_' );
$options = new \WP_Rocket\Admin\Options_Data( $options_api->get( 'settings', array() ) );
$sitemap_preload = new \WP_Rocket\Subscriber\Optimization\Critical_CSS_Subscriber( $critical_css, $options );
MainWP_Helper::instance()->check_properties( $sitemap_preload, 'critical_css' );
MainWP_Helper::instance()->check_methods( $sitemap_preload->critical_css, 'process_handler' );
$sitemap_preload->critical_css->process_handler();
} else {
$filesystem = \rocket_direct_filesystem();
$options = new \WP_Rocket\Admin\Options( 'wp_rocket_' );
$options_data = new \WP_Rocket\Admin\Options_Data( $options->get( 'settings', array() ) );
$critical_css_path = \rocket_get_constant( 'WP_ROCKET_CRITICAL_CSS_PATH' ) . get_current_blog_id() . '/';
$cpcss_service = new \WP_Rocket\Engine\CriticalPath\ProcessorService( new \WP_Rocket\Engine\CriticalPath\DataManager( $critical_css_path, $filesystem ), new \WP_Rocket\Engine\CriticalPath\APIClient() );
$critical_css = new \WP_Rocket\Engine\CriticalPath\CriticalCSS( new \WP_Rocket\Engine\CriticalPath\CriticalCSSGeneration( $cpcss_service ), $options_data, $filesystem );
$critical_css->process_handler();
}
return array( 'result' => 'SUCCESS' );
}
/**
* Method save_settings()
*
* Save the plugin settings.
*
* @used-by MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
*
* @return array Action result.
*/
public function save_settings() {
// phpcs:disable WordPress.Security.NonceVerification
$options = isset( $_POST['settings'] ) ? json_decode( base64_decode( wp_unslash( $_POST['settings'] ) ), true ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for http encode compatible..
if ( ! is_array( $options ) || empty( $options ) ) {
return array( 'error' => 'INVALID_OPTIONS' );
}
$old_values = get_option( WP_ROCKET_SLUG );
$defaults_fields = $this->get_rocket_default_options();
foreach ( $old_values as $field => $value ) {
if ( ! isset( $defaults_fields[ $field ] ) ) {
$options[ $field ] = $value;
}
}
update_option( WP_ROCKET_SLUG, $options );
if ( isset( $_POST['do_database_optimization'] ) && ! empty( $_POST['do_database_optimization'] ) ) {
$this->optimize_database();
}
// phpcs:enable
return array( 'result' => 'SUCCESS' );
}
/**
* [Description for update_exclusion_list]
*
* @return array
*/
public function update_exclusion_list() {
// Call cron by rocket update dynamic lists.
wp_schedule_single_event( time() + 10, 'rocket_update_dynamic_lists' );
return array( 'result' => 'SUCCESS' );
}
/**
* Method optimize_database()
*
* Optimize database tables.
*
* @return array Action result
* @throws MainWP_Exception Error message.
*
* @used-by \MainWP\Child\MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
* @uses \MainWP\Child\MainWP_Helper::instance()->check_methods()
* @uses \MainWP\Child\MainWP_Helper::instance()->check_classes_exists()
*/
public function optimize_database() {
MainWP_Helper::instance()->check_classes_exists(
array(
'\WP_Rocket\Admin\Database\Optimization',
'\WP_Rocket\Admin\Database\Optimization_Process',
'\WP_Rocket\Admin\Options',
'\WP_Rocket\Admin\Options_Data',
)
);
$process = new \WP_Rocket\Admin\Database\Optimization_Process();
$optimization = new \WP_Rocket\Admin\Database\Optimization( $process );
MainWP_Helper::instance()->check_methods( $optimization, array( 'process_handler', 'get_options' ) );
$options_api = new \WP_Rocket\Admin\Options( 'wp_rocket_' );
$options = new \WP_Rocket\Admin\Options_Data( $options_api->get( 'settings', array() ) );
$items = array_filter( array_keys( $optimization->get_options() ), array( $options, 'get' ) );
if ( ! empty( $items ) ) {
$optimization->process_handler( $items );
}
$return['result'] = 'SUCCESS';
return $return;
}
/**
* Method get_optimize_info()
*
* Get the optimization information.
*
* @return array Action result and optimization information.
* @throws MainWP_Exception Error message.
*
* @used-by \MainWP\Child\MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
* @uses \MainWP\Child\MainWP_Helper::instance()->check_classes_exists()
* @uses \MainWP\Child\MainWP_Helper::instance()->check_methods()
*/
public function get_optimize_info() {
MainWP_Helper::instance()->check_classes_exists(
array(
'\WP_Rocket\Admin\Database\Optimization',
'\WP_Rocket\Admin\Database\Optimization_Process',
)
);
$process = new \WP_Rocket\Admin\Database\Optimization_Process();
$optimization = new \WP_Rocket\Admin\Database\Optimization( $process );
MainWP_Helper::instance()->check_methods( $optimization, 'count_cleanup_items' );
$information['optimize_info'] = array(
'total_revisions' => $optimization->count_cleanup_items( 'database_revisions' ),
'total_auto_draft' => $optimization->count_cleanup_items( 'database_auto_drafts' ),
'total_trashed_posts' => $optimization->count_cleanup_items( 'database_trashed_posts' ),
'total_spam_comments' => $optimization->count_cleanup_items( 'database_spam_comments' ),
'total_trashed_comments' => $optimization->count_cleanup_items( 'database_trashed_comments' ),
'total_expired_transients' => $optimization->count_cleanup_items( 'database_expired_transients' ),
'total_all_transients' => $optimization->count_cleanup_items( 'database_all_transients' ),
'total_optimize_tables' => $optimization->count_cleanup_items( 'database_optimize_tables' ),
);
$information['result'] = 'SUCCESS';
return $information;
}
/**
* Method load_existing_settings()
*
* Load existing settings.
*
* @used-by MainWP_Child_WP_Rocket::actions() Fire off certain WP Rocket plugin actions.
*
* @return array Action result and settings options.
*/
public function load_existing_settings() {
$options = get_option( WP_ROCKET_SLUG );
return array(
'result' => 'SUCCESS',
'options' => $options,
);
}
/**
* Method clear_priority_elements()
*
* Clear all priority elements.
*
* @return array Status of the action.
*/
public function clear_priority_elements() {
try {
// Check if the function exists.
if ( ! function_exists( 'wpm_apply_filters_typed' ) || ! function_exists( 'rocket_clean_domain' ) || ! function_exists( 'rocket_dismiss_box' ) ) {
return array( 'error' => 'function_not_exist' );
}
// Clear all priority elements.
$clean_filter = wpm_apply_filters_typed( 'array', 'rocket_performance_hints_clean_all', array() );
rocket_clean_domain();
rocket_dismiss_box( 'rocket_warning_plugin_modification' );
set_transient(
'rocket_performance_hints_clear_message',
$clean_filter
);
return array( 'result' => 'SUCCESS' );
} catch ( MainWP_Exception $e ) {
return array( 'error' => $e->getMessage() );
}
}
}