PluginProbe
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder / 3.6.0
Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder v3.6.0
3.6.0 3.5.0 trunk 1.0.10 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.6.1 1.0.7 1.0.8 1.0.9 1.1 1.1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 All 110 releases
buttonizer-multifunctional-button / app / Api / Settings / MigrateToStandalone.php

MigrateToStandalone.php in Buttonizer – Floating Menus, Sticky Buttons, & Popup Builder 3.6.0, at app/Api/Settings/MigrateToStandalone.php

336 lines 12.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 * SOFTWARE LICENSE INFORMATION
4 *
5 * Copyright (c) 2017 Buttonizer, all rights reserved.
6 *
7 * This file is part of Buttonizer
8 *
9 * For detailed information regarding to the licensing of
10 * this software, please review the license.txt or visit:
11 * https://buttonizer.pro/license/
12 */
13
14 namespace Buttonizer\Api\Settings;
15
16 use Buttonizer\Core\Utils\ApiRequest;
17 use Buttonizer\Core\Utils\Account;
18 use Buttonizer\Core\Utils\PermissionCheck;
19 use Buttonizer\Core\Utils\Settings;
20
21 /**
22 * Migration API
23 *
24 * @endpoint /wp-json/buttonizer/migrate
25 * @methods POST
26 */
27 class MigrateToStandalone
28 {
29 /**
30 * Register route
31 */
32 public function registerRoute()
33 {
34 register_rest_route('buttonizer', '/migrate', [
35 [
36 'methods' => ['POST'],
37 'args' => [
38 'siteId' => [
39 'required' => false,
40 'type' => "string"
41 ],
42 'authorization' => [
43 'required' => false,
44 'type' => "string"
45 ],
46 'nonce' => [
47 'validate_callback' => function ($value) {
48 return wp_verify_nonce($value, 'wp_rest');
49 },
50 'required' => true
51 ],
52 ],
53 'callback' => [$this, 'migrate'],
54 'permission_callback' => function () {
55 return PermissionCheck::hasPermission(true); // Only Admins/Super admins can migrate
56 }
57 ]
58 ]);
59 }
60
61 /**
62 * Start migrating
63 */
64 public function migrate($request)
65 {
66 // Migrate data before uploading to standalone
67 if (Settings::getSetting("migration_version") !== BUTTONIZER_LAST_MIGRATION) {
68 (new \Buttonizer\Legacy\Utils\Update())->selfMigrate(Settings::getSetting("migration_version"));
69 }
70
71 // Connect Site ID
72 $siteId = $request->get_param('siteId');
73
74 // Connect Authorization key
75 $authorization = $request->get_param('authorization');
76
77 // Data
78 $args = array(
79 "siteId" => $siteId,
80 "authorization" => $authorization,
81 "platform" => "wordpress",
82 "requestToken" => true,
83 );
84
85 // Connect Authorization key
86 $shouldMigrate = $request->get_param('shouldMigrate');
87
88 if ($shouldMigrate) {
89 $args["migrationData"] = $this->getData();
90 }
91
92 // Sync data
93 $result = ApiRequest::post("/auth/tokens/create-token", $args, [], false);
94
95 // Handle errors
96 if (is_a($result, 'WP_Error')) {
97 return $result;
98 }
99
100 // Make sure access token is available
101 if (!$result->token) {
102 return new \WP_Error('buttonizer_no_token', 'Missing connection token in response', [
103 'status' => 500
104 ]);
105 }
106
107 // Make a backup
108 self::makeBackup();
109
110 // Save site connection token
111 ApiRequest::saveApiToken($result->token);
112
113 // Get pre-migration settings
114 $originalCanSendErrors = Settings::getSetting("can_send_errors", false);
115 $originalUserPermissions = Settings::getSetting("permissions", false);
116 $originalAdminBarSetting = Settings::getSetting("admin_top_bar_show_button", true);
117 $originalGoogleAnalyticsEnabled = Settings::getSetting("google_analytics_enabled", false);
118 $originalGoogleAnalytics = Settings::getSetting("google_analytics", null);
119
120 // Save new settings
121 Settings::empty();
122 Settings::setSetting("force_legacy", false);
123 Settings::setSetting("finished_setup", true);
124 Settings::setSetting("has_migrated", true);
125 Settings::setSetting("can_send_errors", $originalCanSendErrors);
126 Settings::setSetting("admin_top_bar_show_button", $originalAdminBarSetting);
127 Settings::setSetting("installed_at", new \DateTime('now'));
128 Settings::setSetting("last_synced_at", new \DateTime('now'));
129 Settings::setSetting("site_id", $siteId);
130 Settings::setSetting("include_page_data", isset($result->account->site->licensed) && $result->account->site->licensed);
131
132 // Migrate Google Analytics setting
133 if ($originalGoogleAnalyticsEnabled && $originalGoogleAnalytics) {
134 Settings::setSetting("google_analytics", $originalGoogleAnalytics);
135 }
136
137 // Migrate plugin permissions
138 if ($originalUserPermissions) {
139 Settings::setSetting("permissions", $originalUserPermissions);
140 }
141
142 Settings::saveUpdatedSettings();
143
144 // Sync account settings
145 Account::syncToDatabase($result->account);
146
147 return [
148 'status' => 'success',
149 'data' => Account::getData()
150 ];
151 }
152
153 /**
154 * Talk to the Buttonizer API and start migrating data
155 */
156 private function getData()
157 {
158 // Register settings
159 register_setting('buttonizer', 'buttonizer_buttons', [
160 'type' => 'array',
161 'sanitize_callback' => function ($value) {
162 return is_array($value) ? $value : [];
163 }
164 ]);
165 register_setting('buttonizer', 'buttonizer_buttons_published', [
166 'type' => 'array',
167 'sanitize_callback' => function ($value) {
168 return is_array($value) ? $value : [];
169 }
170 ]);
171 register_setting('buttonizer', 'buttonizer_rules', [
172 'type' => 'array',
173 'sanitize_callback' => function ($value) {
174 return is_array($value) ? $value : [];
175 }
176 ]);
177 register_setting('buttonizer', 'buttonizer_rules_published', [
178 'type' => 'array',
179 'sanitize_callback' => function ($value) {
180 return is_array($value) ? $value : [];
181 }
182 ]);
183 register_setting('buttonizer', 'buttonizer_schedules', [
184 'type' => 'array',
185 'sanitize_callback' => function ($value) {
186 return is_array($value) ? $value : [];
187 }
188 ]);
189 register_setting('buttonizer', 'buttonizer_schedules_published', [
190 'type' => 'array',
191 'sanitize_callback' => function ($value) {
192 return is_array($value) ? $value : [];
193 }
194 ]);
195 register_setting('buttonizer', 'buttonizer_has_changes', [
196 'type' => 'boolean',
197 'sanitize_callback' => 'rest_sanitize_boolean'
198 ]);
199
200 // Check if the user has changes
201 // If that's not the case we'll skip these to
202 // prevent sending lot's of unnecessary data
203 $hasChanges = get_option("buttonizer_has_changes", false);
204
205 return json_encode([
206 'settings' => Settings::getSettings(),
207 // Migrate groups & buttons
208 "groups" => get_option("buttonizer_buttons", []),
209 "groups_published" => $hasChanges ? get_option("buttonizer_buttons_published", []) : null,
210
211 // Migrate time schedules (if exists)
212 "time_schedules" => get_option("buttonizer_schedules", []),
213 "time_schedules_published" => $hasChanges ? get_option("buttonizer_schedules_published", []) : null,
214
215 // Migrate time schedules (if exists)
216 "page_rules" => get_option("buttonizer_rules", []),
217 "page_rules_published" => $hasChanges ? get_option("buttonizer_rules_published", []) : null,
218 ]);
219 }
220
221 /**
222 * Clean-up pre-3.0 data
223 *
224 * But we'll keep it, because stuff can go wrong and we don't like that :)
225 */
226 private static function makeBackup(): void
227 {
228 // Register special backup settings
229 register_setting('buttonizer', 'buttonizer_buttons_backup_30', [
230 'type' => 'array',
231 'sanitize_callback' => function ($value) {
232 return is_array($value) ? $value : [];
233 }
234 ]);
235 register_setting('buttonizer', 'buttonizer_buttons_published_backup_30', [
236 'type' => 'array',
237 'sanitize_callback' => function ($value) {
238 return is_array($value) ? $value : [];
239 }
240 ]);
241 register_setting('buttonizer', 'buttonizer_has_changes_backup_30', [
242 'type' => 'boolean',
243 'sanitize_callback' => 'rest_sanitize_boolean'
244 ]);
245 register_setting('buttonizer', 'buttonizer_rules_backup_30', [
246 'type' => 'array',
247 'sanitize_callback' => function ($value) {
248 return is_array($value) ? $value : [];
249 }
250 ]);
251 register_setting('buttonizer', 'buttonizer_rules_published_backup_30', [
252 'type' => 'array',
253 'sanitize_callback' => function ($value) {
254 return is_array($value) ? $value : [];
255 }
256 ]);
257 register_setting('buttonizer', 'buttonizer_schedules_backup_30', [
258 'type' => 'array',
259 'sanitize_callback' => function ($value) {
260 return is_array($value) ? $value : [];
261 }
262 ]);
263 register_setting('buttonizer', 'buttonizer_schedules_published_backup_30', [
264 'type' => 'array',
265 'sanitize_callback' => function ($value) {
266 return is_array($value) ? $value : [];
267 }
268 ]);
269 register_setting('buttonizer', 'buttonizer_settings_backup_30', [
270 'type' => 'array',
271 'sanitize_callback' => function ($value) {
272 return is_array($value) ? $value : [];
273 }
274 ]);
275
276 // Save restorable data
277 update_option('buttonizer_buttons_backup_30', get_option('buttonizer_buttons'));
278 update_option('buttonizer_buttons_published_backup_30', get_option('buttonizer_buttons_published'));
279 update_option('buttonizer_has_changes_backup_30', get_option('buttonizer_has_changes'));
280 update_option('buttonizer_rules_backup_30', get_option('buttonizer_rules'));
281 update_option('buttonizer_rules_published_backup_30', get_option('buttonizer_rules_published'));
282 update_option('buttonizer_schedules_backup_30', get_option('buttonizer_schedules'));
283 update_option('buttonizer_schedules_published_backup_30', get_option('buttonizer_schedules_published'));
284 update_option('buttonizer_settings_backup_30', get_option('buttonizer_settings'));
285
286 // Delete old options
287 delete_option('buttonizer_buttons');
288 delete_option("buttonizer_buttons_published");
289 delete_option("buttonizer_has_changes");
290 delete_option("buttonizer_rules");
291 delete_option("buttonizer_rules_published");
292 delete_option("buttonizer_schedules");
293 delete_option("buttonizer_schedules_published");
294 }
295
296 /**
297 * Remove deprecated code
298 */
299 public static function getReadyForMigration()
300 {
301 register_setting('buttonizer', 'buttonizer_buttons', [
302 'type' => 'array',
303 'sanitize_callback' => function ($value) {
304 return is_array($value) ? $value : [];
305 }
306 ]);
307 $groups = get_option("buttonizer_buttons", []);
308
309 // Don't do anything
310 if (count($groups) === 0) {
311 return null;
312 }
313
314 $migrationSteps = "";
315
316 foreach ($groups as $buttonGroup) {
317 if (!isset($buttonGroup['buttons'])) continue;
318
319 foreach ($buttonGroup['buttons'] as $button) {
320 if (isset($button['type']) && $button['type'] === "javascript_pro" && isset($button['action']) && $button['action'] !== "") {
321 $migrationSteps .=
322 'window.addEventListener("buttonizer_button_clicked", event => {
323 if(event.detail.button_id === "' . $button['id'] . '") {
324 ' . rawurldecode($button['action']) . '
325 }
326 });
327
328 ';
329 }
330 }
331 }
332
333 return $migrationSteps !== "" ? $migrationSteps : null;
334 }
335 }
336