optimizer) && $status->optimizer == 1) { return true; } return false; } } if (!function_exists('wpstgIsExcludedPlugin')) { /** * Check if a plugin should be excluded from the optimizer and still running during wp staging requests * @param string $plugin * @return bool */ function wpstgIsExcludedPlugin(string $plugin): bool { $excludedPlugins = get_option('wpstg_optimizer_excluded', []); // Check for custom excluded plugins foreach ($excludedPlugins as $excludedPlugin) { if (strpos($plugin, $excludedPlugin) !== false) { return true; } } return false; } } if (!function_exists('wpstgExcludePlugins')) { /** * Remove all plugins except wp-staging and wp-staging-pro from blog-active plugins * * @param array $plugins numerically keyed array of plugin names (index=>name) * * @return array */ function wpstgExcludePlugins($plugins) { if (!is_array($plugins) || empty($plugins)) { return []; } if (!wpstgIsOptimizerRequest()) { return $plugins; } foreach ($plugins as $key => $plugin) { // Default filter. Must be at the beginning or wp staging plugin will be filtered and killed if (strpos($plugin, 'wp-staging') !== false || wpstgIsExcludedPlugin($plugin)) { continue; } unset($plugins[$key]); } return $plugins; } add_filter('option_active_plugins', 'wpstgExcludePlugins'); } if (!function_exists('wpstgExcludeSitePlugins')) { /** * Remove all plugins except wp-staging and wp-staging-pro from network-active plugins * * @param array $plugins array of plugins keyed by name (name=>timestamp pairs) * * @return array */ function wpstgExcludeSitePlugins($plugins) { if (!is_array($plugins) || empty($plugins)) { return []; } if (!wpstgIsOptimizerRequest()) { return $plugins; } foreach ($plugins as $plugin => $timestamp) { // Default filter. Must be at the beginning or wp staging plugin will be filtered and killed if (strpos($plugin, 'wp-staging') !== false || wpstgIsExcludedPlugin($plugin)) { continue; } unset($plugins[$plugin]); } return $plugins; } if (is_multisite()) { add_filter('site_option_active_sitewide_plugins', 'wpstgExcludeSitePlugins'); } } if (!function_exists('wpstgDisableTheme')) { /** * * Disables the active theme during WP Staging AJAX requests * * * @param string $dir * * @return string */ function wpstgDisableTheme($dir) { $enableTheme = apply_filters('wpstg_optimizer_enable_theme', false); if (wpstgIsOptimizerRequest() && $enableTheme === false) { $wpstgRootPro = wpstgGetPluginsDir() . 'wp-staging-pro'; $wpstgRoot = wpstgGetPluginsDir() . 'wp-staging'; $file = DIRECTORY_SEPARATOR . 'Backend' . DIRECTORY_SEPARATOR . 'Optimizer' . DIRECTORY_SEPARATOR . 'blank-theme' . DIRECTORY_SEPARATOR . 'functions.php'; $theme = DIRECTORY_SEPARATOR . 'Backend' . DIRECTORY_SEPARATOR . 'Optimizer' . DIRECTORY_SEPARATOR . 'blank-theme'; if (file_exists($wpstgRoot . $file)) { return $wpstgRoot . $theme; } elseif (file_exists($wpstgRootPro . $file)) { return $wpstgRootPro . $theme; } else { return ''; } } return $dir; } add_filter('stylesheet_directory', 'wpstgDisableTheme'); add_filter('template_directory', 'wpstgDisableTheme'); } if (!function_exists('wpstgIsOptimizerRequest')) { /** * Should the current request be processed by optimizer? * * For WP STAGING requests that require other plugins to be active, use raw_wpstg_{actionName} * * @return bool */ function wpstgIsOptimizerRequest(): bool { if (!wpstgIsEnabledOptimizer()) { return false; } if ( defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['action']) && strpos(sanitize_text_field($_REQUEST['action']), 'wpstg_send_report') === false && strpos(sanitize_text_field($_REQUEST['action']), 'wpstg') === 0 ) { return true; } return false; } } if (!function_exists('wpstgTgmpaCompatibility')) { /** * Remove TGM Plugin Activation 'force_activation' admin_init action hook if present. * * This is to stop excluded plugins being deactivated after a migration, when a theme uses TGMPA to require a plugin to be always active. */ function wpstgTgmpaCompatibility() { $isFunctionRemoved = false; // run on wpstg page if (isset($_GET['page']) && $_GET['page'] == 'wpstg_clone') { $isFunctionRemoved = true; } // run on wpstg ajax requests if (defined('DOING_AJAX') && DOING_AJAX && isset($_POST['action']) && strpos(sanitize_text_field($_POST['action']), 'wpstg') !== false) { $isFunctionRemoved = true; } if ($isFunctionRemoved) { global $wp_filter; $adminInitFunctions = $wp_filter['admin_init']; foreach ($adminInitFunctions as $priority => $functions) { if (!isset($wp_filter['admin_init'][$priority])) { continue; } foreach ($functions as $key => $function) { if (!isset($wp_filter['admin_init'][$priority][$key])) { continue; } // searching for function this way as can't rely on the calling class being named TGM_Plugin_Activation if (strpos($key, 'force_activation') !== false) { unset($wp_filter['admin_init'][$priority][$key]); return; } } } } } add_action('admin_init', 'wpstgTgmpaCompatibility', 1); } if (!function_exists('wpstgIsStaging')) { /** * @return bool True if it is staging site. False otherwise. */ function wpstgIsStaging(): bool { if (defined('WPSTAGING_DEV_SITE') && WPSTAGING_DEV_SITE === true) { return true; } if (get_option("wpstg_is_staging_site") === "true") { return true; } if (file_exists(ABSPATH . '.wp-staging')) { return true; } return false; } } if (!function_exists('wpstgGetCloneSettings')) { /** * Get the value of the given option in clone settings, * If no option given return all clone settings * * @param string|null $option * @return mixed */ function wpstgGetCloneSettings(string $option = null) { $settings = get_option('wpstg_clone_settings', null); // Return settings if no options given if ($option === null) { return $settings; } // Early Bail: if settings is null or if settings isn't object if ($settings === null || !is_object($settings)) { return null; } // Early bail if given option not exists if (!property_exists($settings, $option)) { return null; } return $settings->{$option}; } } /** * Disable all outgoing e-mails on Staging site * Will check against both the old and new logic of storing emails disabled option */ if (wpstgIsStaging() && (((bool)get_option("wpstg_emails_disabled") === true) || (wpstgGetCloneSettings('wpstg_emails_disabled')))) { if (!function_exists('wp_mail')) { /** * @param array|string $to * @param string $subject * @param string $message * @param array|string $headers * @param array|string $attachments * * @return bool */ function wp_mail($to, $subject, $message, $headers = '', $attachments = []) { if (defined('WPSTG_DEBUG') && WPSTG_DEBUG) { // Safely cast everything to string $to = is_string($to) ? $to : wp_json_encode($to); $subject = is_string($subject) ? $subject : wp_json_encode($subject); $message = is_string($message) ? $message : wp_json_encode($message); $headers = is_string($headers) ? $headers : wp_json_encode($headers); $attachments = is_string($attachments) ? $attachments : wp_json_encode($attachments); $log_entry = <<