PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
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 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / Database / ThemeMigrationService.php
surecart / app / src / Database Last commit date
Tables 1 year ago GeneralMigration.php 1 year ago MigrationsServiceProvider.php 3 months ago ProductPageMigrationService.php 1 year ago RewriteRulesMigrationService.php 1 year ago Table.php 3 years ago ThemeMigrationService.php 3 months ago UpdateMigrationServiceProvider.php 3 weeks ago UserMetaMigrationsService.php 3 years ago VersionMigration.php 1 year ago WebhookMigrationsService.php 1 year ago
ThemeMigrationService.php
108 lines
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