PluginProbe
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.3.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.3.3
4.7.2 4.7.1 4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 All 281 releases
surecart / app / src / Database / ThemeMigrationService.php
ThemeMigrationService.php
108 lines 2.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SureCart\Database;
4
5 use SureCart\Models\Brand;
6
7 /**
8 * One-time migration: moves surecart_theme WP option to brand.theme on the API.
9 * Also copies brand.color and brand.logo to dark fields for existing dark mode users.
10 */
11 class ThemeMigrationService extends GeneralMigration {
12
13 /**
14 * Unique key to track this specific migration.
15 *
16 * @var string
17 */
18 protected $migration_key = 'surecart_theme_to_brand_migration';
19
20 /**
21 * Whether to prevent marking migration as complete (e.g. on API failure).
22 *
23 * @var bool
24 */
25 private $prevent_complete = false;
26
27 /**
28 * Run the migration.
29 *
30 * @return void
31 */
32 protected function run() {
33 $wp_theme = get_option( 'surecart_theme', 'light' );
34
35 // Only migrate if the user had explicitly set dark theme.
36 if ( 'dark' !== $wp_theme ) {
37 return;
38 }
39
40 // Safety: stop retrying after 3 failed attempts.
41 // Keep prevent_complete true so the migration stays pending
42 // and the WP option fallback in ThemeService::mode() remains active.
43 $attempts = (int) get_transient( 'sc_theme_migration_attempts' );
44 if ( $attempts >= 3 ) {
45 $this->prevent_complete = true;
46 return;
47 }
48 set_transient( 'sc_theme_migration_attempts', $attempts + 1, HOUR_IN_SECONDS );
49
50 // Check if account/brand is available.
51 $brand = \SureCart::account()->brand;
52 if ( empty( $brand ) || is_wp_error( $brand ) ) {
53 // API unreachable — prevent complete() so it retries next load.
54 $this->prevent_complete = true;
55 return;
56 }
57
58 // Build the update data.
59 $update_data = [];
60
61 // Set theme to dark if not already set on the API.
62 if ( 'dark' !== ( $brand->theme ?? 'light' ) ) {
63 $update_data['theme'] = 'dark';
64 }
65
66 // Copy existing brand color to dark_color if dark_color is not already set.
67 if ( ! empty( $brand->color ) && empty( $brand->dark_color ) ) {
68 $update_data['dark_color'] = $brand->color;
69 }
70
71 // Copy existing logo to dark_logo if dark_logo is not already set.
72 if ( ! empty( $brand->logo->id ) && empty( $brand->dark_logo->id ) ) {
73 $update_data['dark_logo'] = $brand->logo->id;
74 }
75
76 // Nothing to update — already fully migrated.
77 if ( empty( $update_data ) ) {
78 delete_option( 'surecart_theme' );
79 delete_transient( 'sc_theme_migration_attempts' );
80 return;
81 }
82
83 $result = Brand::update( $update_data );
84
85 if ( is_wp_error( $result ) ) {
86 // API call failed — prevent complete() so it retries next load.
87 $this->prevent_complete = true;
88 return;
89 }
90
91 // Clean up the old WP option and retry transient now that it's migrated to the API.
92 delete_option( 'surecart_theme' );
93 delete_transient( 'sc_theme_migration_attempts' );
94 }
95
96 /**
97 * Only mark complete if the migration actually succeeded.
98 *
99 * @return void
100 */
101 public function complete() {
102 if ( $this->prevent_complete ) {
103 return;
104 }
105 parent::complete();
106 }
107 }
108