prefix . 'abilityguard_log', $wpdb->prefix . 'abilityguard_log_meta', $wpdb->prefix . 'abilityguard_snapshots', $wpdb->prefix . 'abilityguard_approvals', $wpdb->prefix . 'abilityguard_approval_stages', ); foreach ( $tables as $table ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); } delete_option( 'abilityguard_db_version' ); delete_option( 'abilityguard_last_pruned' ); delete_option( 'abilityguard_last_pruned_count' ); } /** * Best-effort purge of the FileBlobStore staging directory under * uploads/. Shared across the whole install - purge once, not per * subsite. Failures here are non-fatal. */ function abilityguard_uninstall_purge_staging(): void { $uploads = wp_upload_dir( null, false ); $basedir = is_array( $uploads ) && ! empty( $uploads['basedir'] ) && is_string( $uploads['basedir'] ) ? $uploads['basedir'] : ''; if ( '' === $basedir ) { return; } $dir = trailingslashit( $basedir ) . 'abilityguard-mcp'; if ( ! is_dir( $dir ) ) { return; } $entries = scandir( $dir ); if ( false === $entries ) { return; } foreach ( $entries as $entry ) { if ( '.' === $entry || '..' === $entry ) { continue; } // phpcs:ignore WordPress.WP.AlternativeFunctions.unlink_unlink, WordPress.PHP.NoSilencedErrors.Discouraged @unlink( trailingslashit( $dir ) . $entry ); } // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- best-effort uninstall, WP_Filesystem unavailable post-deactivation. @rmdir( $dir ); } if ( is_multisite() && function_exists( 'get_sites' ) ) { // Walk every subsite in every network. Plugin deletion means uninstall; // orphan tables on subsites the operator may not even remember about // would just rot in the database. $abilityguard_site_ids = get_sites( array( 'fields' => 'ids', 'number' => 0, ) ); if ( is_array( $abilityguard_site_ids ) ) { foreach ( $abilityguard_site_ids as $abilityguard_site_id ) { switch_to_blog( (int) $abilityguard_site_id ); abilityguard_uninstall_single_site(); restore_current_blog(); } } } else { abilityguard_uninstall_single_site(); } abilityguard_uninstall_purge_staging();