From eabd1480eae77de9e943bb20ec9acefe6df80363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lys=C3=BD?= Date: Fri, 26 Nov 2021 09:56:10 +0100 Subject: [PATCH] Add migration for new format purchased product filter [MAILPOET-3954] --- lib/Config/Migrator.php | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index ce4ed8fafd..949666371f 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -7,6 +7,7 @@ use MailPoet\Entities\FormEntity; use MailPoet\Models\Newsletter; use MailPoet\Models\Subscriber; use MailPoet\Segments\DynamicSegments\Filters\UserRole; +use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct; use MailPoet\Settings\SettingsController; use MailPoet\Util\Helpers; @@ -73,6 +74,7 @@ class Migrator { $this->fixScheduledTasksSubscribersTimestampColumns(); $this->removeDeprecatedStatisticsIndexes(); $this->migrateSerializedFilterDataToNewColumns(); + $this->migratePurchasedProductDynamicFilters(); return $output; } @@ -730,4 +732,44 @@ class Migrator { return true; } + + private function migratePurchasedProductDynamicFilters(): bool { + global $wpdb; + // skip the migration if the DB version is higher than 3.74.2 or is not set (a new install) + if (version_compare($this->settings->get('db_version', '3.74.2'), '3.74.1', '>')) { + return false; + } + + $dynamicSegmentFiltersTable = "{$this->prefix}dynamic_segment_filters"; + $filterType = DynamicSegmentFilterData::TYPE_WOOCOMMERCE; + $action = WooCommerceProduct::ACTION_PRODUCT; + $dynamicSegmentFilters = $wpdb->get_results(" + SELECT `id`, `filter_data`, `filter_type`, `action` + FROM {$dynamicSegmentFiltersTable} + WHERE `filter_type` = '{$filterType}' + AND `action` = '{$action}' + ", ARRAY_A); + + foreach ($dynamicSegmentFilters as $dynamicSegmentFilter) { + $filterData = unserialize($dynamicSegmentFilter['filter_data']); + if (!isset($filterData['product_ids'])) { + $filterData['product_ids'] = []; + } + + if (isset($filterData['product_id']) && !in_array($filterData['product_id'], $filterData['product_ids'])) { + $filterData['product_ids'][] = $filterData['product_id']; + unset($filterData['product_id']); + } + + if (!isset($filterData['operator'])) { + $filterData['operator'] = DynamicSegmentFilterData::OPERATOR_ANY; + } + + $wpdb->update($dynamicSegmentFiltersTable, [ + 'filter_data' => serialize($filterData), + ], ['id' => $dynamicSegmentFilter['id']]); + } + + return true; + } }