prefix . 'aftercare_'; foreach ( array( 'vitals_samples', 'ledger_events', 'incidents', 'reports', 'errors' ) as $aftercare_table ) { $wpdb->query( "DROP TABLE IF EXISTS {$aftercare_prefix}{$aftercare_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, PluginCheck.Security.DirectDB.UnescapedDBParameter -- both parts are built from $wpdb->prefix and a hardcoded list; no user input. } delete_option( 'aftercare_settings' ); delete_option( 'aftercare_schema_version' ); delete_option( 'aftercare_cron_last_run' ); delete_option( 'aftercare_plugin_versions' ); delete_option( 'aftercare_rum_buffer' ); delete_option( 'aftercare_onboarding_dismissed' ); delete_option( 'aftercare_lab_last_error' ); delete_option( 'aftercare_lab_last_success' ); delete_option( 'aftercare_lab_pending' ); delete_option( 'aftercare_lab_change_count' ); delete_option( 'aftercare_availability_state' ); delete_option( 'aftercare_availability_loopback' ); // Transients (CrUX caches). $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\\_transient\\_aftercare\\_%' OR option_name LIKE '\\_transient\\_timeout\\_aftercare\\_%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery wp_clear_scheduled_hook( 'aftercare_daily_tasks' ); wp_clear_scheduled_hook( 'aftercare_weekly_digest' ); wp_clear_scheduled_hook( 'aftercare_hourly_tasks' ); wp_unschedule_hook( 'aftercare_lab_url' ); wp_unschedule_hook( 'aftercare_lab_change_check' ); wp_unschedule_hook( 'aftercare_availability_confirm' );