prefix . 'aipsc_logs'; $aipsc_scans_table = $wpdb->prefix . 'aipsc_scan_history'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $aipsc_logs_table ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $aipsc_scans_table ) ); // Clear scheduled cron events. wp_clear_scheduled_hook( 'aipatch_daily_scan' ); wp_clear_scheduled_hook( 'aipatch_log_cleanup' ); // Clean up transients (login protection). // Note: We cannot enumerate all transients, but the main ones expire naturally. // We clean known patterns if possible. $aipsc_options_table = $wpdb->options; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE option_name LIKE %s OR option_name LIKE %s', $aipsc_options_table, '_transient_aipatch_%', '_transient_timeout_aipatch_%' ) );