prefix . 'ftcon_form_entries'; $wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange $uploads_table = $wpdb->prefix . 'ftcon_conversion_uploads'; $wpdb->query( "DROP TABLE IF EXISTS {$uploads_table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange // ─── Delete All Plugin Options ────────────────────────────────────── $options = array( 'ftcon_version', 'ftcon_wizard_completed', 'ftcon_wizard_current_step', 'ftcon_enabled_forms', 'ftcon_notification_email', 'ftcon_capture_params', 'ftcon_cleanup_on_deactivate', 'ftcon_conversion_window', 'ftcon_email_frequency', 'ftcon_encryption_key', // Google Ads options. 'ftcon_gads_connected', 'ftcon_gads_access_token', 'ftcon_gads_refresh_token', 'ftcon_gads_token_expiry', 'ftcon_gads_customer_id', 'ftcon_gads_conversion_action_id', // Legacy AI options (from pre-1.0 development / Pro plugin, safe to remove). 'ftcon_ai_auto_mark', 'ftcon_ai_provider', 'ftcon_ai_api_key', 'ftcon_ai_model', 'ftcon_ai_monthly_usage', 'ftcon_ai_usage_reset_date', ); foreach ( $options as $option ) { delete_option( $option ); } // ─── Clear Scheduled Cron Events ──────────────────────────────────── wp_clear_scheduled_hook( 'ftcon_daily_summary' ); wp_clear_scheduled_hook( 'ftcon_weekly_summary' ); wp_clear_scheduled_hook( 'ftcon_monthly_summary' ); wp_clear_scheduled_hook( 'ftcon_retry_failed_uploads' ); // ─── Delete Transients ────────────────────────────────────────────── delete_transient( 'ftcon_activation_redirect' ); delete_transient( 'ftcon_gads_oauth_state' );