PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.3.20
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.3.20
1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk All 48 releases
fluent-cart / database / DBMigrator.php

DBMigrator.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.3.20, at database/DBMigrator.php

466 lines 24.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\Database;
4
5 use FluentCart\App\CPT\FluentProducts;
6 use FluentCart\App\Models\Product;
7
8 require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
9
10 use FluentCart\Database\Migrations\AttributeGroupsMigrator;
11 use FluentCart\Database\Migrations\AttributeObjectRelationsMigrator;
12 use FluentCart\Database\Migrations\AttributeTermsMigrator;
13 use FluentCart\Database\Migrations\CartMigrator;
14 use FluentCart\Database\Migrations\CustomersMigrator;
15 use FluentCart\Database\Migrations\MetaMigrator;
16 use FluentCart\Database\Migrations\Migrator;
17 use FluentCart\Database\Migrations\OrderMetaMigrator;
18 use FluentCart\Database\Migrations\OrdersMigrator;
19 use FluentCart\Database\Migrations\OrdersItemsMigrator;
20 use FluentCart\Database\Migrations\OrderTransactionsMigrator;
21 use FluentCart\Database\Migrations\ProductDetailsMigrator;
22 use FluentCart\Database\Migrations\ProductDownloadsMigrator;
23 use FluentCart\Database\Migrations\ProductMetaMigrator;
24 use FluentCart\Database\Migrations\ProductVariationMigrator;
25 use FluentCart\Database\Migrations\ScheduledActionsMigrator;
26 use FluentCart\Database\Migrations\ShippingClassesMigrator;
27 use FluentCart\Database\Migrations\SubscriptionMetaMigrator;
28 use FluentCart\Database\Migrations\SubscriptionsMigrator;
29 use FluentCart\Database\Migrations\TaxClassesMigrator;
30 use FluentCart\Database\Migrations\TaxRatesMigrator;
31 use FluentCart\Database\Migrations\OrderTaxRateMigrator;
32 use FluentCart\Database\Migrations\CouponsMigrator;
33 use FluentCart\Database\Migrations\CustomerAddressesMigrator;
34 use FluentCart\Database\Migrations\CustomerMetaMigrator;
35 use FluentCart\Database\Migrations\OrderAddressesMigrator;
36 use FluentCart\Database\Migrations\OrderDownloadPermissionsMigrator;
37 use FluentCart\Database\Migrations\OrderOperationsMigrator;
38 use FluentCart\Database\Migrations\AppliedCouponsMigrator;
39 use FluentCart\Database\Migrations\LabelMigrator;
40 use FluentCart\Database\Migrations\LabelRelationshipsMigrator;
41 use FluentCart\Database\Migrations\ActivityMigrator;
42 use FluentCart\Database\Migrations\WebhookLogger;
43 use FluentCart\Framework\Database\Schema;
44 use FluentCartPro\App\Modules\Licensing\Models\License;
45 use FluentCartPro\App\Modules\Licensing\Models\LicenseActivation;
46 use FluentCartPro\App\Modules\Licensing\Models\LicenseMeta;
47 use FluentCartPro\App\Modules\Licensing\Models\LicenseSite;
48 use FluentCart\Database\Migrations\ShippingZonesMigrator;
49 use FluentCart\Database\Migrations\ShippingMethodsMigrator;
50 use FluentCart\Database\Migrations\RetentionSnapshotsMigrator;
51
52 class DBMigrator
53 {
54 private static array $migrators = [
55 MetaMigrator::class,
56 AttributeGroupsMigrator::class,
57 AttributeObjectRelationsMigrator::class,
58 AttributeTermsMigrator::class,
59 CartMigrator::class,
60 CouponsMigrator::class,
61 CustomerAddressesMigrator::class,
62 CustomerMetaMigrator::class,
63 CustomersMigrator::class,
64 OrderAddressesMigrator::class,
65 OrderDownloadPermissionsMigrator::class,
66 OrderMetaMigrator::class,
67 OrderOperationsMigrator::class,
68 OrdersItemsMigrator::class,
69 OrdersMigrator::class,
70 OrderTaxRateMigrator::class,
71 OrderTransactionsMigrator::class,
72 ProductDetailsMigrator::class,
73 ProductDownloadsMigrator::class,
74 ProductMetaMigrator::class,
75 SubscriptionMetaMigrator::class,
76 SubscriptionsMigrator::class,
77 TaxClassesMigrator::class,
78 TaxRatesMigrator::class,
79 ProductVariationMigrator::class,
80 AppliedCouponsMigrator::class,
81 LabelMigrator::class,
82 LabelRelationshipsMigrator::class,
83 ActivityMigrator::class,
84 WebhookLogger::class,
85 ShippingZonesMigrator::class,
86 ShippingMethodsMigrator::class,
87 ShippingClassesMigrator::class,
88 ScheduledActionsMigrator::class,
89 RetentionSnapshotsMigrator::class
90 ];
91
92 public static function migrateUp($network_wide = false)
93 {
94 global $wpdb;
95 if ($network_wide) {
96 // Retrieve all site IDs from this network (WordPress >= 4.6 provides easy to use functions for that).
97 if (function_exists('get_sites') && function_exists('get_current_network_id')) {
98 $site_ids = get_sites(array('fields' => 'ids', 'network_id' => get_current_network_id()));
99 } else {
100 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
101 $site_ids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs WHERE site_id = $wpdb->siteid;");
102 }
103 // Install the plugin for all these sites.
104 foreach ($site_ids as $site_id) {
105 switch_to_blog($site_id);
106 self::run_migrate();
107 restore_current_blog();
108 }
109 } else {
110 self::run_migrate();
111 }
112 }
113
114 public static function run_migrate()
115 {
116 self::migrate();
117 self::maybeMigrateDBChanges();
118 update_option('_fluent_cart_db_version', FLUENTCART_DB_VERSION, 'no');
119 }
120
121 public static function migrate()
122 {
123 /**
124 * @var $migrator Migrator
125 */
126 foreach (self::$migrators as $migrator) {
127 $migrator::migrate();
128 }
129 }
130
131 public static function maybeMigrateDBChanges()
132 {
133
134 /*
135 * TODO We will remove this after final release
136 */
137 $currentDBVersion = get_option('_fluent_cart_db_version');
138
139 if (!$currentDBVersion || version_compare($currentDBVersion, FLUENTCART_DB_VERSION, '<')) {
140
141 update_option('_fluent_cart_db_version', FLUENTCART_DB_VERSION, 'no');
142
143 // let's check the orders table sequence number
144 global $wpdb;
145
146 // Product Meta unique index removal
147 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
148 $hasProductMetaUnqIndex = $wpdb->get_col($wpdb->prepare("SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND INDEX_NAME='" . $wpdb->prefix . "fct_pm__comp_unq' AND TABLE_NAME=%s", $wpdb->prefix . 'fct_product_meta'));
149 if ($hasProductMetaUnqIndex) {
150
151 $table_name = $wpdb->prefix . 'fct_product_meta';
152 $index_name = 'fct_pm__comp_unq';
153
154 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
155 $wpdb->query(
156 $wpdb->prepare(
157 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
158 "ALTER TABLE %i DROP INDEX %i",
159 $table_name,
160 $index_name
161 ));
162
163 }
164
165 if (!Schema::hasColumn('tax_behavior', 'fct_orders')) {
166 $table_name = $wpdb->prefix . 'fct_orders';
167 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
168 $wpdb->query($wpdb->prepare(
169 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
170 "ALTER TABLE %i ADD COLUMN `tax_behavior` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 => no_tax, 1 => exclusive, 2 => inclusive' AFTER `rate`",
171 $table_name
172 ));
173 }
174
175 if (!Schema::hasColumn('slug', 'fct_tax_classes')) {
176 $table_name = $wpdb->prefix . 'fct_tax_classes';
177 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
178 $wpdb->query($wpdb->prepare(
179 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
180 "ALTER TABLE %i ADD COLUMN `slug` VARCHAR(100) NULL AFTER `title`",
181 $table_name
182 ));
183 }
184
185 $ordersTable = $wpdb->prefix . 'fct_orders';
186
187 // check if scheduled_at is exist or not
188 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
189 $isReceiptNumberMigrated = $wpdb->get_col($wpdb->prepare("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND COLUMN_NAME='receipt_number' AND TABLE_NAME=%s", $ordersTable));
190 if (!$isReceiptNumberMigrated) {
191 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
192 $wpdb->query($wpdb->prepare(
193 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
194 "ALTER TABLE %i ADD COLUMN `receipt_number` BIGINT NULL AFTER `parent_id`",
195 $ordersTable
196 ));
197 }
198
199 /**
200 * Changing fct_meta.key to fct_meta.meta_key
201 */
202 if (Schema::hasColumn('discount_total', 'fct_orders')) {
203 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
204 $wpdb->query($wpdb->prepare(
205 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
206 "ALTER TABLE %i CHANGE `discount_total` `manual_discount_total` BIGINT NOT NULL DEFAULT '0'",
207 $ordersTable
208 ));
209 }
210
211 /**
212 * Changing fct_meta.key to fct_meta.meta_key
213 */
214 if (Schema::hasColumn('key', 'fct_meta')) {
215 $table_name = $wpdb->prefix . 'fct_meta';
216 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
217 $wpdb->query($wpdb->prepare(
218 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
219 "ALTER TABLE %i CHANGE `key` `meta_key` VARCHAR(192)",
220 $table_name
221 ));
222 }
223
224 /**
225 * Changing fct_meta.value to fct_meta.meta_value
226 */
227 if (Schema::hasColumn('value', 'fct_meta')) {
228 $table_name = $wpdb->prefix . 'fct_meta';
229 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
230 $wpdb->query($wpdb->prepare(
231 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
232 "ALTER TABLE %i CHANGE `value` `meta_value` LONGTEXT",
233 $table_name
234 ));
235 }
236
237 /**
238 * Changing fct_order_meta.key to fct_order_meta.meta_key and fct_order_meta.value to fct_order_meta.meta_value
239 */
240 if (Schema::hasColumn('key', 'fct_order_meta')) {
241 $table_name = $wpdb->prefix . 'fct_order_meta';
242 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
243 $wpdb->query($wpdb->prepare(
244 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
245 "ALTER TABLE %i CHANGE `key` `meta_key` VARCHAR(192)",
246 $table_name
247 ));
248 }
249 /**
250 * Changing fct_meta.key to fct_meta.meta_key and fct_meta.value to fct_meta.meta_value
251 */
252 if (Schema::hasColumn('value', 'fct_order_meta')) {
253 $table_name = $wpdb->prefix . 'fct_order_meta';
254 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
255 $wpdb->query($wpdb->prepare(
256 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
257 "ALTER TABLE %i CHANGE `value` `meta_value` LONGTEXT",
258 $table_name
259 ));
260 }
261
262 /**
263 * adding ltv column to fct_customers table
264 */
265 if (!Schema::hasColumn('ltv', 'fct_customers')) {
266 $table_name = $wpdb->prefix . 'fct_customers';
267 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
268 $wpdb->query($wpdb->prepare(
269 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
270 "ALTER TABLE %i ADD COLUMN `ltv` BIGINT NOT NULL DEFAULT '0' AFTER `purchase_count`",
271 $table_name
272 ));
273 }
274
275 /**
276 * adding states column to fct_shipping_methods table
277 */
278 if (!Schema::hasColumn('states', 'fct_shipping_methods')) {
279 $table_name = $wpdb->prefix . 'fct_shipping_methods';
280 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
281 $wpdb->query($wpdb->prepare(
282 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
283 "ALTER TABLE %i ADD COLUMN `states` LONGTEXT NULL AFTER `is_enabled`",
284 $table_name
285 ));
286 }
287
288 /**
289 * modify states column to json in fct_shipping_methods table
290 */
291 if (Schema::hasColumn('states', 'fct_shipping_methods')) {
292 $table_name = $wpdb->prefix . 'fct_shipping_methods';
293 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
294 $wpdb->query($wpdb->prepare(
295 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
296 "ALTER TABLE %i MODIFY COLUMN `states` JSON NULL",
297 $table_name
298 ));
299 }
300
301 /**
302 * Changing fct_shipping_zones.regions to fct_shipping_zones.region
303 */
304 if (Schema::hasColumn('regions', 'fct_shipping_zones')) {
305 $table_name = $wpdb->prefix . 'fct_shipping_zones';
306 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
307 $wpdb->query($wpdb->prepare(
308 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
309 "ALTER TABLE %i CHANGE `regions` `region` VARCHAR(192) NOT NULL",
310 $table_name
311 ));
312 }
313
314 /**
315 * adding uuid column to fct_subscriptions table
316 */
317
318 if (!Schema::hasColumn('uuid', 'fct_subscriptions')) {
319 $table_name = $wpdb->prefix . 'fct_subscriptions';
320 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
321 $wpdb->query($wpdb->prepare(
322 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
323 "ALTER TABLE %i ADD COLUMN `uuid` VARCHAR(100) NOT NULL AFTER `id`",
324 $table_name
325 ));
326 }
327
328 if (Schema::hasColumn('initial_amount', 'fct_subscriptions')) {
329 $table_name = $wpdb->prefix . 'fct_subscriptions';
330 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
331 $wpdb->query($wpdb->prepare(
332 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
333 "ALTER TABLE %i CHANGE `initial_amount` `signup_fee` BIGINT UNSIGNED NOT NULL DEFAULT 0",
334 $table_name
335 ));
336 }
337
338 SubscriptionsMigrator::backfillEmptyUuids();
339
340 if (!Schema::hasColumn('meta', 'fct_order_addresses')) {
341 $table_name = $wpdb->prefix . 'fct_order_addresses';
342 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
343 $wpdb->query($wpdb->prepare(
344 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
345 "ALTER TABLE %i ADD COLUMN `meta` JSON DEFAULT NULL AFTER `country`",
346 $table_name
347 ));
348 }
349
350 if (!Schema::hasColumn('meta', 'fct_customer_addresses')) {
351 $table_name = $wpdb->prefix . 'fct_customer_addresses';
352 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
353 $wpdb->query($wpdb->prepare(
354 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
355 "ALTER TABLE %i ADD COLUMN `meta` JSON DEFAULT NULL AFTER `country`",
356 $table_name
357 ));
358 }
359
360 if (!Schema::hasColumn('meta', 'fct_order_tax_rate')) {
361 $table_name = $wpdb->prefix . 'fct_order_tax_rate';
362 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
363 $wpdb->query($wpdb->prepare(
364 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
365 "ALTER TABLE %i ADD COLUMN `meta` JSON",
366 $table_name
367 ));
368 }
369
370 if (!Schema::hasColumn('filed_at', 'fct_order_tax_rate')) {
371 $table_name = $wpdb->prefix . 'fct_order_tax_rate';
372 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
373 $wpdb->query($wpdb->prepare(
374 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
375 "ALTER TABLE %i ADD COLUMN `filed_at` DATETIME NULL AFTER `meta`",
376 $table_name
377 ));
378 }
379
380 if (Schema::hasColumn('categories', 'fct_tax_classes') && !Schema::hasColumn('meta', 'fct_tax_classes')) {
381 $table_name = $wpdb->prefix . 'fct_tax_classes';
382 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
383 $wpdb->query($wpdb->prepare(
384 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
385 "ALTER TABLE %i CHANGE `categories` `meta` JSON",
386 $table_name
387 ));
388 }
389
390 if (!Schema::hasColumn('meta', 'fct_tax_classes')) {
391 $table_name = $wpdb->prefix . 'fct_tax_classes';
392 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
393 $wpdb->query($wpdb->prepare(
394 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
395 "ALTER TABLE %i ADD COLUMN `meta` JSON",
396 $table_name
397 ));
398 }
399
400 if (!Schema::hasColumn('description', 'fct_tax_classes')) {
401 $table_name = $wpdb->prefix . 'fct_tax_classes';
402 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
403 $wpdb->query($wpdb->prepare(
404 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
405 "ALTER TABLE %i ADD COLUMN `description` LONGTEXT NULL AFTER `title`",
406 $table_name
407 ));
408 }
409
410 if (!Schema::hasColumn('group', 'fct_tax_rates')) {
411 $table_name = $wpdb->prefix . 'fct_tax_rates';
412 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
413 $wpdb->query($wpdb->prepare(
414 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
415 "ALTER TABLE %i ADD COLUMN `group` VARCHAR(45) NULL AFTER `name`",
416 $table_name
417 ));
418 }
419
420 if (!Schema::hasColumn('meta', 'fct_shipping_methods')) {
421 $table_name = $wpdb->prefix . 'fct_shipping_methods';
422 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
423 $wpdb->query($wpdb->prepare(
424 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
425 "ALTER TABLE %i ADD COLUMN `meta` JSON NULL AFTER `order`",
426 $table_name
427 ));
428
429 }
430
431 // Shipping schema upgrades — also run here so plugin updates
432 // without deactivation/reactivation still apply new columns
433 \FluentCart\Database\Migrations\ShippingZonesMigrator::migrated();
434 \FluentCart\Database\Migrations\ShippingClassesMigrator::migrated();
435 \FluentCart\Database\Migrations\ProductVariationMigrator::migrated();
436
437 }
438 }
439
440 public static function migrateDown($network_wide = false)
441 {
442 /**
443 * @var $migrator Migrator
444 */
445 foreach (self::$migrators as $migrator) {
446 $migrator::dropTable();
447 }
448
449 Product::query()->where('post_type', '=', FluentProducts::CPT_NAME)->delete();
450
451 //Migrate Down The Licenses
452 if (class_exists(License::class)) {
453 License::query()->truncate();
454 LicenseActivation::query()->truncate();
455 LicenseSite::query()->truncate();
456 LicenseMeta::query()->truncate();
457 }
458 }
459
460 public static function refresh($network_wide = false)
461 {
462 static::migrateDown($network_wide);
463 static::migrateUp($network_wide);
464 }
465 }
466