get_var($wpdb->prepare("SELECT option_value FROM {$wpdb->options} WHERE option_name = %s LIMIT 1", 'mgenius_settings')); $settings = is_string($row) ? maybe_unserialize($row) : null; if (empty($settings) || !is_array($settings) || empty($settings['maintenance_enabled'])) return; // Constantes standard lues par les plugins de cache : leur nom est impose. // phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedConstantFound if (!defined('DONOTCACHEPAGE')) define('DONOTCACHEPAGE', true); if (!defined('DONOTCACHEOBJECT')) define('DONOTCACHEOBJECT', true); if (!defined('DONOTCACHEDB')) define('DONOTCACHEDB', true); // phpcs:enable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedConstantFound // Purge au plus une fois par minute (avant : a chaque visite, // y compris « X-LiteSpeed-Purge: * » qui videait tout le cache LiteSpeed). // Rien ne se remet en cache entre deux purges : DONOTCACHEPAGE est pose. $mgenius_purge_now = !get_transient('mgenius_guard_purged'); if ($mgenius_purge_now) { set_transient('mgenius_guard_purged', 1, 60); } if (!headers_sent()) { header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); header('X-LiteSpeed-Cache-Control: no-cache'); if ($mgenius_purge_now) { header('X-LiteSpeed-Purge: *'); } } $cache_dirs = $mgenius_purge_now ? [ WP_CONTENT_DIR . '/cache/all/', WP_CONTENT_DIR . '/cache/wpfc-minified/', WP_CONTENT_DIR . '/cache/wpfc-mobile-cache/', WP_CONTENT_DIR . '/cache/wp-rocket/', WP_CONTENT_DIR . '/cache/supercache/', WP_CONTENT_DIR . '/cache/cache-enabler/', WP_CONTENT_DIR . '/cache/seraphinite-accelerator/', WP_CONTENT_DIR . '/cache/wpo-cache/', WP_CONTENT_DIR . '/litespeed/cssjs/', WP_CONTENT_DIR . '/litespeed/page/', ] : []; // W3 Total Cache (Disk: Enhanced) : sous-dossiers seulement, // le .htaccess propre a W3TC reste en place. // glob() peut renvoyer false : jamais de chemin vide ou « / ». $pe_dirs = $mgenius_purge_now ? glob(WP_CONTENT_DIR . '/cache/page_enhanced/*', GLOB_ONLYDIR) : []; if (is_array($pe_dirs)) { foreach ($pe_dirs as $pe_dir) { if (is_string($pe_dir) && '' !== $pe_dir && 0 === strpos($pe_dir, WP_CONTENT_DIR . '/cache/page_enhanced/')) { $cache_dirs[] = $pe_dir . '/'; } } } $mgenius_cache_root = wp_normalize_path(WP_CONTENT_DIR . '/'); foreach ($cache_dirs as $dir) { // Garde-fou : uniquement des dossiers de cache sous wp-content. if (!is_string($dir) || 0 !== strpos(wp_normalize_path($dir), $mgenius_cache_root) || wp_normalize_path($dir) === $mgenius_cache_root) { continue; } if (!is_dir($dir) || is_link(rtrim($dir, '/'))) { continue; } // Fichiers et liens seulement : un lien est supprime lui- // meme, jamais sa cible. Dossier supprime par une requete concurrente // ou illisible : on passe, sans erreur fatale. Les dossiers vides // restent en place : ils ne servent aucune page. try { $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD ); foreach ($it as $f) { if ($f->isLink() || !$f->isDir()) { wp_delete_file($f->getPathname()); } } } catch (Exception $e) { continue; } } // Le .htaccess et WP Fastest Cache sont geres par // MGENIUS_Main::init(), sous le verrou de transition et sur l'etat relu en // base : plus d'ecriture concurrente avec la sortie de maintenance. // Suspension reelle de WP Rocket. // add_filter() plutot qu'une ecriture en base : rien n'est modifie chez le // plugin tiers, donc rien n'est a restaurer et aucune configuration // utilisateur ne peut etre perdue si la maintenance est interrompue. add_filter('do_rocket_generate_caching_files', '__return_false'); if ($mgenius_purge_now && function_exists('wp_cache_clear_cache')) { wp_cache_clear_cache(); } // Aucun reglage d'un plugin de cache n'est ecrit ici : ceux que la // maintenance suspend sont sauvegardes et restaures par // MGENIUS_Main::disable_cache_plugins() et restore_cache_plugins(). } }