PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.8.6
ووسلام – همگام سازی ووکامرس و باسلام v1.8.6
1.10.19 1.10.20 1.10.18 1.10.17 1.10.15 1.10.14 1.10.13 1.10.12 1.10.10 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.2 1.9.1 1.9.0 1.8.8 1.8.5 1.8.6 All 53 releases
sync-basalam / uninstall.php

uninstall.php in ووسلام – همگام سازی ووکامرس و باسلام 1.8.6, at uninstall.php

346 lines 9.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Sync Basalam Uninstall
5 *
6 * Default uninstall:
7 * - Removes runtime jobs/queues/cron markers so no background process remains.
8 *
9 * Full data wipe:
10 * - Define SYNC_BASALAM_REMOVE_ALL_DATA as true in wp-config.php before uninstall.
11 * - Removes plugin tables, options, usermeta, and postmeta.
12 */
13
14 defined('WP_UNINSTALL_PLUGIN') || exit;
15
16 $sync_basalam_remove_all_data = defined('SYNC_BASALAM_REMOVE_ALL_DATA') && true === SYNC_BASALAM_REMOVE_ALL_DATA;
17
18 sync_basalam_uninstall_site($sync_basalam_remove_all_data);
19
20 function sync_basalam_uninstall_site(bool $remove_all_data): void
21 {
22 sync_basalam_cleanup_runtime_data();
23
24 if ($remove_all_data) {
25 sync_basalam_remove_all_plugin_data();
26 }
27 }
28
29 function sync_basalam_cleanup_runtime_data(): void
30 {
31 global $wpdb;
32
33 sync_basalam_clear_wp_cron_events();
34 sync_basalam_clear_wc_queue_actions();
35 sync_basalam_delete_action_scheduler_rows();
36
37 $job_manager_table = $wpdb->prefix . 'sync_basalam_job_manager';
38 if (sync_basalam_table_exists($job_manager_table)) {
39 $wpdb->query("DELETE FROM {$job_manager_table}");
40 }
41
42 sync_basalam_delete_option_rows_like(
43 [
44 'sync_basalam_%_last_run',
45 'sync_basalam_last_creatable_product_id',
46 'CreateSingleProduct_%_batch_%',
47 'sync_basalam_update_single_product_%_batch_%',
48 'UpdateSingleProduct_%_batch_%',
49 'sync_basalam_%_batch_%',
50 '_transient_sync_basalam_%_lock',
51 '_transient_timeout_sync_basalam_%_lock',
52 '_transient_CreateSingleProduct_%_lock',
53 '_transient_timeout_CreateSingleProduct_%_lock',
54 '_transient_UpdateSingleProduct_%_lock',
55 '_transient_timeout_UpdateSingleProduct_%_lock',
56 '_site_transient_sync_basalam_%_process_lock',
57 '_site_transient_timeout_sync_basalam_%_process_lock',
58 '_site_transient_CreateSingleProduct_%_process_lock',
59 '_site_transient_timeout_CreateSingleProduct_%_process_lock',
60 '_site_transient_UpdateSingleProduct_%_process_lock',
61 '_site_transient_timeout_UpdateSingleProduct_%_process_lock',
62 ]
63 );
64 }
65
66 function sync_basalam_remove_all_plugin_data(): void
67 {
68 global $wpdb;
69
70 $tables = [
71 $wpdb->prefix . 'sync_basalam_payments',
72 $wpdb->prefix . 'sync_basalam_map_options',
73 $wpdb->prefix . 'sync_basalam_uploaded_photo',
74 $wpdb->prefix . 'sync_basalam_debug_logs',
75 $wpdb->prefix . 'sync_basalam_discount_tasks',
76 $wpdb->prefix . 'sync_basalam_category_mappings',
77 $wpdb->prefix . 'sync_basalam_job_manager',
78 // Legacy tables from older naming/migrations.
79 $wpdb->prefix . 'bsl_payments',
80 $wpdb->prefix . 'bsl_map_options',
81 $wpdb->prefix . 'bsl_uploaded_photo',
82 $wpdb->prefix . 'bsl_payments_old',
83 $wpdb->prefix . 'bsl_map_options_old',
84 $wpdb->prefix . 'bsl_uploaded_photo_old',
85 ];
86
87 foreach ($tables as $table) {
88 if (sync_basalam_table_exists($table)) {
89 $wpdb->query("DROP TABLE IF EXISTS {$table}");
90 }
91 }
92
93 sync_basalam_delete_option_rows_like(
94 [
95 'sync_basalam_%',
96 '_transient_sync_basalam_%',
97 '_transient_timeout_sync_basalam_%',
98 '_site_transient_sync_basalam_%',
99 '_site_transient_timeout_sync_basalam_%',
100 'CreateSingleProduct_%_batch_%',
101 'sync_basalam_update_single_product_%_batch_%',
102 'UpdateSingleProduct_%_batch_%',
103 'sync_basalam_%_batch_%',
104 '_transient_CreateSingleProduct_%_lock',
105 '_transient_timeout_CreateSingleProduct_%_lock',
106 '_transient_UpdateSingleProduct_%_lock',
107 '_transient_timeout_UpdateSingleProduct_%_lock',
108 '_site_transient_CreateSingleProduct_%_process_lock',
109 '_site_transient_timeout_CreateSingleProduct_%_process_lock',
110 '_site_transient_UpdateSingleProduct_%_process_lock',
111 '_site_transient_timeout_UpdateSingleProduct_%_process_lock',
112 ]
113 );
114
115 $wpdb->query(
116 $wpdb->prepare(
117 "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s",
118 'sync_basalam_%'
119 )
120 );
121
122 $wpdb->query(
123 $wpdb->prepare(
124 "DELETE FROM {$wpdb->postmeta}
125 WHERE meta_key LIKE %s
126 OR meta_key LIKE %s
127 OR meta_key = %s
128 OR meta_key = %s
129 OR meta_key = %s
130 OR meta_key = %s
131 OR meta_key = %s
132 OR meta_key = %s",
133 'sync_basalam_%',
134 '_sync_basalam_%',
135 '_is_sync_basalam_order',
136 '_basalam_order_tracking_code',
137 '_basalam_fee_amount',
138 '_basalam_balance_amount',
139 '_basalam_purchase_count',
140 '_sync_basalam_increase_price_value'
141 )
142 );
143
144 wp_cache_flush();
145 }
146
147 function sync_basalam_clear_wp_cron_events(): void
148 {
149 $known_hooks = sync_basalam_get_known_hooks();
150
151 foreach ($known_hooks as $hook) {
152 wp_clear_scheduled_hook($hook);
153 }
154
155 if (!function_exists('_get_cron_array')) {
156 return;
157 }
158
159 $cron = _get_cron_array();
160 if (!is_array($cron)) {
161 return;
162 }
163
164 foreach (array_keys($cron) as $hook) {
165 $hook = (string) $hook;
166
167 if (sync_basalam_is_related_hook($hook)) {
168 wp_clear_scheduled_hook($hook);
169 }
170 }
171 }
172
173 function sync_basalam_clear_wc_queue_actions(): void
174 {
175 $queue_hooks = [
176 'sync_basalam_plugin_debug',
177 'sync_basalam_fetch_version_detail',
178 ];
179
180 if (function_exists('as_unschedule_all_actions')) {
181 foreach ($queue_hooks as $hook) {
182 as_unschedule_all_actions($hook);
183 as_unschedule_all_actions($hook, [], 'sync-basalam');
184 }
185 }
186
187 if (!function_exists('WC')) {
188 return;
189 }
190
191 $wc = WC();
192 if (!is_object($wc) || !method_exists($wc, 'queue')) {
193 return;
194 }
195
196 $queue = $wc->queue();
197 if (!is_object($queue) || !method_exists($queue, 'cancel_all')) {
198 return;
199 }
200
201 foreach ($queue_hooks as $hook) {
202 $queue->cancel_all($hook);
203 }
204 }
205
206 function sync_basalam_delete_action_scheduler_rows(): void
207 {
208 global $wpdb;
209
210 $actions_table = $wpdb->prefix . 'actionscheduler_actions';
211 $groups_table = $wpdb->prefix . 'actionscheduler_groups';
212
213 if (!sync_basalam_table_exists($actions_table)) {
214 return;
215 }
216
217 $wpdb->query(
218 $wpdb->prepare(
219 "DELETE FROM {$actions_table}
220 WHERE hook LIKE %s
221 OR hook LIKE %s
222 OR hook LIKE %s",
223 'sync_basalam_%',
224 'CreateSingleProduct_%',
225 'UpdateSingleProduct_%'
226 )
227 );
228
229 if (!sync_basalam_table_exists($groups_table)) {
230 return;
231 }
232
233 $group_ids = $wpdb->get_col(
234 $wpdb->prepare(
235 "SELECT group_id FROM {$groups_table} WHERE slug = %s",
236 'sync-basalam'
237 )
238 );
239
240 if (empty($group_ids)) {
241 return;
242 }
243
244 $group_ids = array_map('intval', $group_ids);
245 $group_ids = array_filter($group_ids);
246
247 if (empty($group_ids)) {
248 return;
249 }
250
251 $ids = implode(',', $group_ids);
252
253 $wpdb->query("DELETE FROM {$actions_table} WHERE group_id IN ({$ids})");
254 $wpdb->query("DELETE FROM {$groups_table} WHERE group_id IN ({$ids})");
255 }
256
257 function sync_basalam_cleanup_network_site_transients(): void
258 {
259 global $wpdb;
260
261 if (!is_multisite() || empty($wpdb->sitemeta)) {
262 return;
263 }
264
265 $patterns = [
266 '_site_transient_sync_basalam_%',
267 '_site_transient_timeout_sync_basalam_%',
268 '_site_transient_CreateSingleProduct_%',
269 '_site_transient_timeout_CreateSingleProduct_%',
270 '_site_transient_UpdateSingleProduct_%',
271 '_site_transient_timeout_UpdateSingleProduct_%',
272 ];
273
274 foreach ($patterns as $pattern) {
275 $wpdb->query(
276 $wpdb->prepare(
277 "DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s",
278 $pattern
279 )
280 );
281 }
282 }
283
284 function sync_basalam_delete_option_rows_like(array $patterns): void
285 {
286 global $wpdb;
287
288 foreach ($patterns as $pattern) {
289 $wpdb->query(
290 $wpdb->prepare(
291 "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s",
292 $pattern
293 )
294 );
295 }
296 }
297
298 function sync_basalam_table_exists(string $table_name): bool
299 {
300 global $wpdb;
301
302 $table = $wpdb->get_var(
303 $wpdb->prepare(
304 'SHOW TABLES LIKE %s',
305 $table_name
306 )
307 );
308
309 return $table === $table_name;
310 }
311
312 function sync_basalam_get_known_hooks(): array
313 {
314 $create_identifier = 'CreateSingleProduct_' . substr(md5('SyncBasalam\\Queue\\Tasks\\CreateProduct'), 0, 8);
315 $update_identifier = 'sync_basalam_update_single_product_' . substr(md5('SyncBasalam\\Queue\\Tasks\\UpdateProduct'), 0, 8);
316 $legacy_update_identifier = 'UpdateSingleProduct_' . substr(md5('SyncBasalam\\Queue\\Tasks\\UpdateProduct'), 0, 8);
317
318 return [
319 'sync_basalam_plugin_debug',
320 'sync_basalam_fetch_version_detail',
321 $create_identifier . '_cron',
322 $create_identifier . '_immediate',
323 $update_identifier . '_cron',
324 $update_identifier . '_immediate',
325 $legacy_update_identifier . '_cron',
326 $legacy_update_identifier . '_immediate',
327 ];
328 }
329
330 function sync_basalam_is_related_hook(string $hook): bool
331 {
332 $prefixes = [
333 'sync_basalam_',
334 'CreateSingleProduct_',
335 'UpdateSingleProduct_',
336 ];
337
338 foreach ($prefixes as $prefix) {
339 if (strpos($hook, $prefix) === 0) {
340 return true;
341 }
342 }
343
344 return false;
345 }
346