PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.9.0
ووسلام – همگام سازی ووکامرس و باسلام v1.9.0
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.9.0, at uninstall.php

347 lines 9.7 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_media',
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 . 'sync_basalam_uploaded_photo',
80 $wpdb->prefix . 'bsl_payments',
81 $wpdb->prefix . 'bsl_map_options',
82 $wpdb->prefix . 'bsl_uploaded_photo',
83 $wpdb->prefix . 'bsl_payments_old',
84 $wpdb->prefix . 'bsl_map_options_old',
85 $wpdb->prefix . 'bsl_uploaded_photo_old',
86 ];
87
88 foreach ($tables as $table) {
89 if (sync_basalam_table_exists($table)) {
90 $wpdb->query("DROP TABLE IF EXISTS {$table}");
91 }
92 }
93
94 sync_basalam_delete_option_rows_like(
95 [
96 'sync_basalam_%',
97 '_transient_sync_basalam_%',
98 '_transient_timeout_sync_basalam_%',
99 '_site_transient_sync_basalam_%',
100 '_site_transient_timeout_sync_basalam_%',
101 'CreateSingleProduct_%_batch_%',
102 'sync_basalam_update_single_product_%_batch_%',
103 'UpdateSingleProduct_%_batch_%',
104 'sync_basalam_%_batch_%',
105 '_transient_CreateSingleProduct_%_lock',
106 '_transient_timeout_CreateSingleProduct_%_lock',
107 '_transient_UpdateSingleProduct_%_lock',
108 '_transient_timeout_UpdateSingleProduct_%_lock',
109 '_site_transient_CreateSingleProduct_%_process_lock',
110 '_site_transient_timeout_CreateSingleProduct_%_process_lock',
111 '_site_transient_UpdateSingleProduct_%_process_lock',
112 '_site_transient_timeout_UpdateSingleProduct_%_process_lock',
113 ]
114 );
115
116 $wpdb->query(
117 $wpdb->prepare(
118 "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s",
119 'sync_basalam_%'
120 )
121 );
122
123 $wpdb->query(
124 $wpdb->prepare(
125 "DELETE FROM {$wpdb->postmeta}
126 WHERE meta_key LIKE %s
127 OR meta_key LIKE %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 OR meta_key = %s",
134 'sync_basalam_%',
135 '_sync_basalam_%',
136 '_is_sync_basalam_order',
137 '_basalam_order_tracking_code',
138 '_basalam_fee_amount',
139 '_basalam_balance_amount',
140 '_basalam_purchase_count',
141 '_sync_basalam_increase_price_value'
142 )
143 );
144
145 wp_cache_flush();
146 }
147
148 function sync_basalam_clear_wp_cron_events(): void
149 {
150 $known_hooks = sync_basalam_get_known_hooks();
151
152 foreach ($known_hooks as $hook) {
153 wp_clear_scheduled_hook($hook);
154 }
155
156 if (!function_exists('_get_cron_array')) {
157 return;
158 }
159
160 $cron = _get_cron_array();
161 if (!is_array($cron)) {
162 return;
163 }
164
165 foreach (array_keys($cron) as $hook) {
166 $hook = (string) $hook;
167
168 if (sync_basalam_is_related_hook($hook)) {
169 wp_clear_scheduled_hook($hook);
170 }
171 }
172 }
173
174 function sync_basalam_clear_wc_queue_actions(): void
175 {
176 $queue_hooks = [
177 'sync_basalam_plugin_debug',
178 'sync_basalam_fetch_version_detail',
179 ];
180
181 if (function_exists('as_unschedule_all_actions')) {
182 foreach ($queue_hooks as $hook) {
183 as_unschedule_all_actions($hook);
184 as_unschedule_all_actions($hook, [], 'sync-basalam');
185 }
186 }
187
188 if (!function_exists('WC')) {
189 return;
190 }
191
192 $wc = WC();
193 if (!is_object($wc) || !method_exists($wc, 'queue')) {
194 return;
195 }
196
197 $queue = $wc->queue();
198 if (!is_object($queue) || !method_exists($queue, 'cancel_all')) {
199 return;
200 }
201
202 foreach ($queue_hooks as $hook) {
203 $queue->cancel_all($hook);
204 }
205 }
206
207 function sync_basalam_delete_action_scheduler_rows(): void
208 {
209 global $wpdb;
210
211 $actions_table = $wpdb->prefix . 'actionscheduler_actions';
212 $groups_table = $wpdb->prefix . 'actionscheduler_groups';
213
214 if (!sync_basalam_table_exists($actions_table)) {
215 return;
216 }
217
218 $wpdb->query(
219 $wpdb->prepare(
220 "DELETE FROM {$actions_table}
221 WHERE hook LIKE %s
222 OR hook LIKE %s
223 OR hook LIKE %s",
224 'sync_basalam_%',
225 'CreateSingleProduct_%',
226 'UpdateSingleProduct_%'
227 )
228 );
229
230 if (!sync_basalam_table_exists($groups_table)) {
231 return;
232 }
233
234 $group_ids = $wpdb->get_col(
235 $wpdb->prepare(
236 "SELECT group_id FROM {$groups_table} WHERE slug = %s",
237 'sync-basalam'
238 )
239 );
240
241 if (empty($group_ids)) {
242 return;
243 }
244
245 $group_ids = array_map('intval', $group_ids);
246 $group_ids = array_filter($group_ids);
247
248 if (empty($group_ids)) {
249 return;
250 }
251
252 $ids = implode(',', $group_ids);
253
254 $wpdb->query("DELETE FROM {$actions_table} WHERE group_id IN ({$ids})");
255 $wpdb->query("DELETE FROM {$groups_table} WHERE group_id IN ({$ids})");
256 }
257
258 function sync_basalam_cleanup_network_site_transients(): void
259 {
260 global $wpdb;
261
262 if (!is_multisite() || empty($wpdb->sitemeta)) {
263 return;
264 }
265
266 $patterns = [
267 '_site_transient_sync_basalam_%',
268 '_site_transient_timeout_sync_basalam_%',
269 '_site_transient_CreateSingleProduct_%',
270 '_site_transient_timeout_CreateSingleProduct_%',
271 '_site_transient_UpdateSingleProduct_%',
272 '_site_transient_timeout_UpdateSingleProduct_%',
273 ];
274
275 foreach ($patterns as $pattern) {
276 $wpdb->query(
277 $wpdb->prepare(
278 "DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s",
279 $pattern
280 )
281 );
282 }
283 }
284
285 function sync_basalam_delete_option_rows_like(array $patterns): void
286 {
287 global $wpdb;
288
289 foreach ($patterns as $pattern) {
290 $wpdb->query(
291 $wpdb->prepare(
292 "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s",
293 $pattern
294 )
295 );
296 }
297 }
298
299 function sync_basalam_table_exists(string $table_name): bool
300 {
301 global $wpdb;
302
303 $table = $wpdb->get_var(
304 $wpdb->prepare(
305 'SHOW TABLES LIKE %s',
306 $table_name
307 )
308 );
309
310 return $table === $table_name;
311 }
312
313 function sync_basalam_get_known_hooks(): array
314 {
315 $create_identifier = 'CreateSingleProduct_' . substr(md5('SyncBasalam\\Queue\\Tasks\\CreateProduct'), 0, 8);
316 $update_identifier = 'sync_basalam_update_single_product_' . substr(md5('SyncBasalam\\Queue\\Tasks\\UpdateProduct'), 0, 8);
317 $legacy_update_identifier = 'UpdateSingleProduct_' . substr(md5('SyncBasalam\\Queue\\Tasks\\UpdateProduct'), 0, 8);
318
319 return [
320 'sync_basalam_plugin_debug',
321 'sync_basalam_fetch_version_detail',
322 $create_identifier . '_cron',
323 $create_identifier . '_immediate',
324 $update_identifier . '_cron',
325 $update_identifier . '_immediate',
326 $legacy_update_identifier . '_cron',
327 $legacy_update_identifier . '_immediate',
328 ];
329 }
330
331 function sync_basalam_is_related_hook(string $hook): bool
332 {
333 $prefixes = [
334 'sync_basalam_',
335 'CreateSingleProduct_',
336 'UpdateSingleProduct_',
337 ];
338
339 foreach ($prefixes as $prefix) {
340 if (strpos($hook, $prefix) === 0) {
341 return true;
342 }
343 }
344
345 return false;
346 }
347