Files
SIGE-WEB-snapshot/wp-content/mu-plugins/wp-staging-optimizer.php

367 lines
11 KiB
PHP

<?php
/*
* Plugin Name: WP STAGING Optimizer
* Plugin URI: https://wp-staging.com
* Description: Prevents 3rd party plugins from being loaded during WP STAGING specific operations.
*
* This is a must-use standalone plugin -
* Do not use any of these methods in WP STAGING code base as this mu-plugin can be missing!
*
* Do not implement PHP type declarations into this file!
* This can lead to fatal errors due to mixed return results in the used wp core functions.
* See https://github.com/wp-staging/wp-staging-pro/issues/2830
*
* Author: WP STAGING
* Version: 1.5.6
* Author URI: https://wp-staging.com
* Text Domain: wp-staging
*/
// Version number of this mu-plugin. Important for automatic updates
// Important: Update WPSTG_OPTIMIZER_MUVERSION in /bootstrap.php to the same version!
if (!defined('WPSTG_OPTIMIZER_VERSION')) {
define('WPSTG_OPTIMIZER_VERSION', '1.5.6');
}
if (!function_exists('wpstgGetPluginsDir')) {
/** @return string */
function wpstgGetPluginsDir(): string
{
$pluginsDir = '';
if (defined('WP_PLUGIN_DIR')) {
$pluginsDir = trailingslashit(WP_PLUGIN_DIR);
} elseif (defined('WP_CONTENT_DIR')) {
$pluginsDir = trailingslashit(WP_CONTENT_DIR) . 'plugins/';
}
return $pluginsDir;
}
}
if (!function_exists('wpstgIsEnabledOptimizer')) {
/**
* Check if optimizer is enabled
* @return bool
*/
function wpstgIsEnabledOptimizer(): bool
{
$status = (object)get_option('wpstg_settings');
if ($status && isset($status->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 = <<<LOG_ENTRY
/***
* WPSTAGING - Mails are disabled for this Staging site. This e-mail was going to be sent, but was prevented:
***
* To: $to
***
* Subject: $subject
***
* Message: $message
***
* Headers: $headers
***
* Attachments: $attachments
***/
LOG_ENTRY;
error_log($log_entry);
}
return false;
}
} elseif (defined('WPSTG_DEBUG') && WPSTG_DEBUG) {
error_log("WP STAGING: Could not override the wp_mail() function to disable e-mails on staging site, as it was already defined before the optimizer mu-plugin was loaded.");
}
}