prefix . 'cfep_fields'; // Check if columns already exist // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter $columns = $wpdb->get_results("DESCRIBE {$table_name}"); $column_names = array_column($columns, 'Field'); $has_is_default = in_array('is_default', $column_names); $has_can_delete = in_array('can_delete', $column_names); $queries = array(); // Add is_default column if (!$has_is_default) { $queries[] = "ALTER TABLE {$table_name} ADD COLUMN is_default TINYINT(1) DEFAULT 0 AFTER enabled"; } // Add can_delete column if (!$has_can_delete) { $queries[] = "ALTER TABLE {$table_name} ADD COLUMN can_delete TINYINT(1) DEFAULT 1 AFTER is_default"; } // Run queries if (!empty($queries)) { foreach ($queries as $query) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, PluginCheck.Security.DirectDB.UnescapedDBParameter $wpdb->query($query); } return array( 'success' => true, 'message' => 'Database migrated successfully', 'queries_run' => count($queries) ); } return array( 'success' => true, 'message' => 'Columns already exist', 'queries_run' => 0 ); } /** * Verify migration */ public static function verify() { global $wpdb; $table_name = $wpdb->prefix . 'cfep_fields'; // Get table structure // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter $columns = $wpdb->get_results("DESCRIBE {$table_name}"); $column_names = array_column($columns, 'Field'); $has_is_default = in_array('is_default', $column_names); $has_can_delete = in_array('can_delete', $column_names); return array( 'is_default' => $has_is_default, 'can_delete' => $has_can_delete, 'complete' => $has_is_default && $has_can_delete ); } /** * Rollback migration (for testing) */ public static function rollback() { global $wpdb; $table_name = $wpdb->prefix . 'cfep_fields'; $queries = array( "ALTER TABLE {$table_name} DROP COLUMN IF EXISTS is_default", "ALTER TABLE {$table_name} DROP COLUMN IF EXISTS can_delete" ); foreach ($queries as $query) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, PluginCheck.Security.DirectDB.UnescapedDBParameter $wpdb->query($query); } return array( 'success' => true, 'message' => 'Migration rolled back' ); } }