=' ) ) { return; } // Run migration self::run_migration(); // Update migration status update_option( self::MIGRATION_STATUS_KEY, array( 'version' => self::MIGRATION_VERSION, 'completed' => current_time( 'mysql' ), ) ); } /** * Run the migration process. */ private static function run_migration() { // Migrate options from PascalCase to snake_case self::migrate_options(); // Log migration completion if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { error_log( 'AI Answer Toolkit: Migration to v' . self::MIGRATION_VERSION . ' completed successfully.' ); } } /** * Migrate options from PascalCase to snake_case. */ private static function migrate_options() { $option_mappings = array( // API Keys 'AI_Answer_Toolkit_api_key' => 'ai_answer_toolkit_api_key', 'AI_Answer_Toolkit_openai_api_key' => 'ai_answer_toolkit_openai_api_key', // Webhook Settings 'AI_Answer_Toolkit_webhook_enabled' => 'ai_answer_toolkit_webhook_enabled', 'AI_Answer_Toolkit_webhook_url' => 'ai_answer_toolkit_webhook_url', 'AI_Answer_Toolkit_webhook_api_key' => 'ai_answer_toolkit_webhook_api_key', // Export Settings 'AI_Answer_Toolkit_last_export' => 'ai_answer_toolkit_last_export', 'AI_Answer_Toolkit_last_export_file' => 'ai_answer_toolkit_last_export_file', ); foreach ( $option_mappings as $old_name => $new_name ) { $old_value = get_option( $old_name, null ); // Only migrate if old option exists and new option doesn't if ( null !== $old_value && false === get_option( $new_name, false ) ) { // Copy to new option name add_option( $new_name, $old_value ); // Delete old option delete_option( $old_name ); if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { error_log( sprintf( 'AI Answer Toolkit: Migrated option %s to %s', $old_name, $new_name ) ); } } } } /** * Rollback migration (for testing purposes only). * DO NOT USE IN PRODUCTION. */ public static function rollback_migration() { if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } $option_mappings = array( 'ai_answer_toolkit_api_key' => 'AI_Answer_Toolkit_api_key', 'ai_answer_toolkit_openai_api_key' => 'AI_Answer_Toolkit_openai_api_key', 'ai_answer_toolkit_webhook_enabled' => 'AI_Answer_Toolkit_webhook_enabled', 'ai_answer_toolkit_webhook_url' => 'AI_Answer_Toolkit_webhook_url', 'ai_answer_toolkit_webhook_api_key' => 'AI_Answer_Toolkit_webhook_api_key', 'ai_answer_toolkit_last_export' => 'AI_Answer_Toolkit_last_export', 'ai_answer_toolkit_last_export_file' => 'AI_Answer_Toolkit_last_export_file', ); foreach ( $option_mappings as $new_name => $old_name ) { $new_value = get_option( $new_name, null ); if ( null !== $new_value ) { add_option( $old_name, $new_value ); delete_option( $new_name ); } } delete_option( self::MIGRATION_STATUS_KEY ); } } // Initialize migration AI_Answer_Toolkit_Migration::init();