PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.3.26
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.3.26
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.26, at database/DBMigrator.php

474 lines 25.0 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 if (!Schema::hasColumn('fee_total', 'fct_orders')) {
188 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
189 $wpdb->query($wpdb->prepare(
190 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
191 "ALTER TABLE %i ADD COLUMN `fee_total` BIGINT NOT NULL DEFAULT '0' AFTER `shipping_total`",
192 $ordersTable
193 ));
194 }
195
196 // check if scheduled_at is exist or not
197 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
198 $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));
199 if (!$isReceiptNumberMigrated) {
200 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
201 $wpdb->query($wpdb->prepare(
202 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
203 "ALTER TABLE %i ADD COLUMN `receipt_number` BIGINT NULL AFTER `parent_id`",
204 $ordersTable
205 ));
206 }
207
208 /**
209 * Changing fct_meta.key to fct_meta.meta_key
210 */
211 if (Schema::hasColumn('discount_total', 'fct_orders')) {
212 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
213 $wpdb->query($wpdb->prepare(
214 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
215 "ALTER TABLE %i CHANGE `discount_total` `manual_discount_total` BIGINT NOT NULL DEFAULT '0'",
216 $ordersTable
217 ));
218 }
219
220 /**
221 * Changing fct_meta.key to fct_meta.meta_key
222 */
223 if (Schema::hasColumn('key', 'fct_meta')) {
224 $table_name = $wpdb->prefix . 'fct_meta';
225 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
226 $wpdb->query($wpdb->prepare(
227 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
228 "ALTER TABLE %i CHANGE `key` `meta_key` VARCHAR(192)",
229 $table_name
230 ));
231 }
232
233 /**
234 * Changing fct_meta.value to fct_meta.meta_value
235 */
236 if (Schema::hasColumn('value', 'fct_meta')) {
237 $table_name = $wpdb->prefix . 'fct_meta';
238 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
239 $wpdb->query($wpdb->prepare(
240 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
241 "ALTER TABLE %i CHANGE `value` `meta_value` LONGTEXT",
242 $table_name
243 ));
244 }
245
246 /**
247 * Changing fct_order_meta.key to fct_order_meta.meta_key and fct_order_meta.value to fct_order_meta.meta_value
248 */
249 if (Schema::hasColumn('key', 'fct_order_meta')) {
250 $table_name = $wpdb->prefix . 'fct_order_meta';
251 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
252 $wpdb->query($wpdb->prepare(
253 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
254 "ALTER TABLE %i CHANGE `key` `meta_key` VARCHAR(192)",
255 $table_name
256 ));
257 }
258 /**
259 * Changing fct_meta.key to fct_meta.meta_key and fct_meta.value to fct_meta.meta_value
260 */
261 if (Schema::hasColumn('value', 'fct_order_meta')) {
262 $table_name = $wpdb->prefix . 'fct_order_meta';
263 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
264 $wpdb->query($wpdb->prepare(
265 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
266 "ALTER TABLE %i CHANGE `value` `meta_value` LONGTEXT",
267 $table_name
268 ));
269 }
270
271 /**
272 * adding ltv column to fct_customers table
273 */
274 if (!Schema::hasColumn('ltv', 'fct_customers')) {
275 $table_name = $wpdb->prefix . 'fct_customers';
276 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
277 $wpdb->query($wpdb->prepare(
278 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
279 "ALTER TABLE %i ADD COLUMN `ltv` BIGINT NOT NULL DEFAULT '0' AFTER `purchase_count`",
280 $table_name
281 ));
282 }
283
284 /**
285 * adding states column to fct_shipping_methods table
286 */
287 if (!Schema::hasColumn('states', 'fct_shipping_methods')) {
288 $table_name = $wpdb->prefix . 'fct_shipping_methods';
289 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
290 $wpdb->query($wpdb->prepare(
291 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
292 "ALTER TABLE %i ADD COLUMN `states` LONGTEXT NULL AFTER `is_enabled`",
293 $table_name
294 ));
295 }
296
297 /**
298 * modify states column to json in fct_shipping_methods table
299 */
300 if (Schema::hasColumn('states', 'fct_shipping_methods')) {
301 $table_name = $wpdb->prefix . 'fct_shipping_methods';
302 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
303 $wpdb->query($wpdb->prepare(
304 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
305 "ALTER TABLE %i MODIFY COLUMN `states` JSON NULL",
306 $table_name
307 ));
308 }
309
310 /**
311 * Changing fct_shipping_zones.regions to fct_shipping_zones.region
312 */
313 if (Schema::hasColumn('regions', 'fct_shipping_zones')) {
314 $table_name = $wpdb->prefix . 'fct_shipping_zones';
315 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
316 $wpdb->query($wpdb->prepare(
317 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
318 "ALTER TABLE %i CHANGE `regions` `region` VARCHAR(192) NOT NULL",
319 $table_name
320 ));
321 }
322
323 /**
324 * adding uuid column to fct_subscriptions table
325 */
326
327 if (!Schema::hasColumn('uuid', 'fct_subscriptions')) {
328 $table_name = $wpdb->prefix . 'fct_subscriptions';
329 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
330 $wpdb->query($wpdb->prepare(
331 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
332 "ALTER TABLE %i ADD COLUMN `uuid` VARCHAR(100) NOT NULL AFTER `id`",
333 $table_name
334 ));
335 }
336
337 if (Schema::hasColumn('initial_amount', 'fct_subscriptions')) {
338 $table_name = $wpdb->prefix . 'fct_subscriptions';
339 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
340 $wpdb->query($wpdb->prepare(
341 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
342 "ALTER TABLE %i CHANGE `initial_amount` `signup_fee` BIGINT UNSIGNED NOT NULL DEFAULT 0",
343 $table_name
344 ));
345 }
346
347 SubscriptionsMigrator::backfillEmptyUuids();
348
349 if (!Schema::hasColumn('meta', 'fct_order_addresses')) {
350 $table_name = $wpdb->prefix . 'fct_order_addresses';
351 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
352 $wpdb->query($wpdb->prepare(
353 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
354 "ALTER TABLE %i ADD COLUMN `meta` JSON DEFAULT NULL AFTER `country`",
355 $table_name
356 ));
357 }
358
359 if (!Schema::hasColumn('meta', 'fct_customer_addresses')) {
360 $table_name = $wpdb->prefix . 'fct_customer_addresses';
361 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
362 $wpdb->query($wpdb->prepare(
363 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
364 "ALTER TABLE %i ADD COLUMN `meta` JSON DEFAULT NULL AFTER `country`",
365 $table_name
366 ));
367 }
368
369 if (!Schema::hasColumn('meta', 'fct_order_tax_rate')) {
370 $table_name = $wpdb->prefix . 'fct_order_tax_rate';
371 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
372 $wpdb->query($wpdb->prepare(
373 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
374 "ALTER TABLE %i ADD COLUMN `meta` JSON",
375 $table_name
376 ));
377 }
378
379 if (!Schema::hasColumn('filed_at', 'fct_order_tax_rate')) {
380 $table_name = $wpdb->prefix . 'fct_order_tax_rate';
381 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
382 $wpdb->query($wpdb->prepare(
383 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
384 "ALTER TABLE %i ADD COLUMN `filed_at` DATETIME NULL AFTER `meta`",
385 $table_name
386 ));
387 }
388
389 if (Schema::hasColumn('categories', 'fct_tax_classes') && !Schema::hasColumn('meta', 'fct_tax_classes')) {
390 $table_name = $wpdb->prefix . 'fct_tax_classes';
391 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
392 $wpdb->query($wpdb->prepare(
393 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
394 "ALTER TABLE %i CHANGE `categories` `meta` JSON",
395 $table_name
396 ));
397 }
398
399 if (!Schema::hasColumn('meta', 'fct_tax_classes')) {
400 $table_name = $wpdb->prefix . 'fct_tax_classes';
401 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
402 $wpdb->query($wpdb->prepare(
403 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
404 "ALTER TABLE %i ADD COLUMN `meta` JSON",
405 $table_name
406 ));
407 }
408
409 if (!Schema::hasColumn('description', 'fct_tax_classes')) {
410 $table_name = $wpdb->prefix . 'fct_tax_classes';
411 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
412 $wpdb->query($wpdb->prepare(
413 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
414 "ALTER TABLE %i ADD COLUMN `description` LONGTEXT NULL AFTER `title`",
415 $table_name
416 ));
417 }
418
419 if (!Schema::hasColumn('group', 'fct_tax_rates')) {
420 $table_name = $wpdb->prefix . 'fct_tax_rates';
421 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
422 $wpdb->query($wpdb->prepare(
423 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
424 "ALTER TABLE %i ADD COLUMN `group` VARCHAR(45) NULL AFTER `name`",
425 $table_name
426 ));
427 }
428
429 if (!Schema::hasColumn('meta', 'fct_shipping_methods')) {
430 $table_name = $wpdb->prefix . 'fct_shipping_methods';
431 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
432 $wpdb->query($wpdb->prepare(
433 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
434 "ALTER TABLE %i ADD COLUMN `meta` JSON NULL AFTER `order`",
435 $table_name
436 ));
437
438 }
439
440 // Shipping schema upgrades — also run here so plugin updates
441 // without deactivation/reactivation still apply new columns
442 \FluentCart\Database\Migrations\ShippingZonesMigrator::migrated();
443 \FluentCart\Database\Migrations\ShippingClassesMigrator::migrated();
444
445 }
446 }
447
448 public static function migrateDown($network_wide = false)
449 {
450 /**
451 * @var $migrator Migrator
452 */
453 foreach (self::$migrators as $migrator) {
454 $migrator::dropTable();
455 }
456
457 Product::query()->where('post_type', '=', FluentProducts::CPT_NAME)->delete();
458
459 //Migrate Down The Licenses
460 if (class_exists(License::class)) {
461 License::query()->truncate();
462 LicenseActivation::query()->truncate();
463 LicenseSite::query()->truncate();
464 LicenseMeta::query()->truncate();
465 }
466 }
467
468 public static function refresh($network_wide = false)
469 {
470 static::migrateDown($network_wide);
471 static::migrateUp($network_wide);
472 }
473 }
474