Données & désinstallation. * * Les artefacts système (règles .htaccess retirées, fichiers temporaires) sont * TOUJOURS nettoyés : les laisser pourrait casser le site après désinstallation. * */ // Si ce fichier n'est pas appelé par WordPress, on arrête. if (!defined('WP_UNINSTALL_PLUGIN')) { exit; } // === SUPPRESSION DES DONNÉES : opt-in uniquement === $mgenius_settings = get_option('mgenius_settings', array()); $mgenius_purge = is_array($mgenius_settings) && !empty($mgenius_settings['purge_data_on_uninstall']); // Regles .htaccess retirees pendant une maintenance et pas encore // remises (fichier non inscriptible a la desactivation) : derniere tentative // avant toute purge. En cas d'echec, leur copie est gardee, jamais jetee. $mgenius_keep = array(); if ( get_option( 'mgenius_htaccess_original' ) || get_option( 'mgenius_htaccess_saved' ) ) { if ( ! class_exists( 'MGENIUS_Main' ) ) { require_once __DIR__ . '/includes/class-main.php'; } if ( ! MGENIUS_Main::restore_htaccess_blocks() ) { $mgenius_keep = array( 'mgenius_htaccess_original', 'mgenius_htaccess_saved' ); } } if ($mgenius_purge) { global $wpdb; // Short « mg_ » names are deleted only when they are this plugin's // (same rule as the migration): another extension may use them. if ( ! class_exists( 'MGENIUS_Settings' ) ) { require_once __DIR__ . '/includes/class-settings.php'; } if ( ! class_exists( 'MGENIUS_Main' ) ) { require_once __DIR__ . '/includes/class-main.php'; } $mgenius_legacy_ours = MGENIUS_Main::is_legacy_data_ours(); // La suppression se fait sur une liste explicite : un LIKE 'mg_%' // emporterait aussi les options d'un autre plugin utilisant le meme // prefixe court. Liste tenue a partir des appels reels a get_option() / // update_option() du code. $mgenius_options = array( 'mgenius_access_logs', 'mgenius_access_tokens', 'mgenius_active_theme', 'mgenius_auto_ended', 'mgenius_blacklist_logs', 'mgenius_cache_check', 'mgenius_cache_saved_states', 'mgenius_custom_bg_migrated', 'mgenius_db_version', 'mgenius_diagnostic_results', 'mgenius_guard_purged', 'mgenius_health_baseline', 'mgenius_health_last_result', 'mgenius_htaccess_saved', 'mgenius_htaccess_original', 'mgenius_init_purged', 'mgenius_notification_emails', 'mgenius_notifications', 'mgenius_remote_config', 'mgenius_settings', 'mgenius_stats', 'mgenius_stats_visits', 'mgenius_support_sent', 'mgenius_theme_snapshot', 'mgenius_visit_stats', 'mgenius_visitor_token', 'mgenius_wizard_completed', // Avertissements d'ecriture et verrou de transition. 'mgenius_cache_warnings', 'mgenius_lock_transition', 'mgenius_legacy_prefix', // Options laissees par des versions anterieures (modules retires, // presets renommes). Nettoyees pour ne pas // abandonner d'enregistrements orphelins apres mise a jour. 'mgenius_license_valid', 'mgenius_license_key', 'mgenius_custom_presets', 'mgenius_anthropic_key', 'mgenius_remote_logs', 'mgenius_monitoring_events', 'mgenius_monitoring_status', 'mgenius_monitoring_last_notification', 'mgenius_last_release_sync', 'mgenius_download_count', 'mgenius_dashboard_widget', 'mgenius_diag_probe', 'mgenius_salt', ); // Anciennes options a prefixe court, conservees ici au cas ou // la migration n'aurait pas tourne (site desactive avant la mise a jour), // et options des modules retires (certaines contiennent des secrets). if ( $mgenius_legacy_ours ) { $mgenius_options = array_merge( $mgenius_options, array( 'mg_settings', 'mg_access_logs', 'mg_access_tokens', 'mg_active_theme', 'mg_blacklist_logs', 'mg_cache_saved_states', 'mg_custom_bg_migrated', 'mg_custom_presets', 'mg_diagnostic_results', 'mg_health_baseline', 'mg_health_last_result', 'mg_notification_emails', 'mg_notifications', 'mg_salt', 'mg_stats', 'mg_stats_visits', 'mg_support_sent', 'mg_theme_snapshot', 'mg_visit_stats', 'mg_wizard_completed', ), MGENIUS_Main::legacy_orphan_options() ); } foreach ( array_diff( $mgenius_options, $mgenius_keep ) as $mgenius_option ) { delete_option( $mgenius_option ); } // Bannieres de diagnostic : la cle est suffixee dynamiquement par // l'identifiant du controle, donc la liste ne peut pas etre exhaustive. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall cleanup $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'mgenius\\_diag\\_banner\\_dismissed\\_%'" ); if ( $mgenius_legacy_ours ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall cleanup $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'mg\\_diag\\_banner\\_dismissed\\_%'" ); } // Motifs echappes : dans LIKE, « _ » vaut n'importe quel // caractere. L'ancien motif '_transient_mg_%' visait aussi les transients // d'autres extensions. Seul le prefixe propre au plugin est supprime. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall cleanup $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_mgenius_' ) . '%', $wpdb->esc_like( '_transient_timeout_mgenius_' ) . '%' ) ); } // === TACHES PROGRAMMEES (toujours) === wp_clear_scheduled_hook('mgenius_post_exit_check'); // === ACCES AUX FICHIERS === // Acces direct confirme seulement. Sans lui, WP_Filesystem() sans // identifiants laissait un objet non connecte (erreurs fatales sur is_dir() et // exists()), et remplacait celui que WordPress venait de connecter avec les // identifiants saisis pour la suppression. global $wp_filesystem; if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $mgenius_fs = ( 'direct' === get_filesystem_method() ) && WP_Filesystem() && is_object( $wp_filesystem ); // Purge demandee : les animations Lottie televersees partent aussi. if ( $mgenius_purge && $mgenius_fs ) { $mgenius_uploads = wp_upload_dir( null, false ); $mgenius_up_dir = trailingslashit( $mgenius_uploads['basedir'] ) . '1001web-maintenance-launch-pages'; if ( $wp_filesystem->is_dir( $mgenius_up_dir ) ) { $wp_filesystem->rmdir( $mgenius_up_dir, true ); } } // Fichier .htaccess lu par Apache (WordPress dans son propre dossier) : // ses fichiers temporaires sont nettoyes ci-dessous. if ( ! class_exists( 'MGENIUS_Main' ) ) { require_once __DIR__ . '/includes/class-main.php'; } $mgenius_htaccess = MGENIUS_Main::htaccess_file(); // === FICHIERS TEMPORAIRES (toujours) === // Restes d'une ecriture interrompue du .htaccess (PHP arrete entre // l'ecriture et le renommage). foreach ( array_unique( array( WP_CONTENT_DIR, dirname( $mgenius_htaccess ) ) ) as $mgenius_dir ) { foreach ( array( '/.htmgenius-*.tmp', '/*.mgenius-*.tmp', '/.*.mgenius-*.tmp' ) as $mgenius_pattern ) { $mgenius_tmp_files = glob( $mgenius_dir . $mgenius_pattern ); foreach ( is_array( $mgenius_tmp_files ) ? $mgenius_tmp_files : array() as $mgenius_tmp_file ) { wp_delete_file( $mgenius_tmp_file ); } } } // Les cookies côté serveur ne peuvent pas être nettoyés ici : ils expireront naturellement.