PluginProbe
CookieAdmin – Cookie Consent Banner / trunk
CookieAdmin – Cookie Consent Banner vtrunk
1.2.3 1.2.2 1.2.1 1.2.0 1.1.9 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
cookieadmin / includes / admin / scan.php

scan.php in CookieAdmin – Cookie Consent Banner trunk, at includes/admin/scan.php

549 lines 20.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace CookieAdmin\Admin;
4
5 if(!defined('COOKIEADMIN_VERSION') || !defined('ABSPATH')){
6 die('Hacking Attempt');
7 }
8
9 class Scan{
10
11 static function show_cookies(){
12 global $cookieadmin_lang, $cookieadmin_error, $cookieadmin_msg, $wpdb;
13
14 \CookieAdmin\Admin::header_theme(__('Manage Cookies', 'cookieadmin'));
15
16 $cookieadmin_requires_pro = \CookieAdmin\Admin::is_feature_available(1);
17
18 $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
19
20 $categorized = [];
21 $categorized_cookies = [];
22
23
24 $scanned_cookies = $wpdb->get_results("SELECT * FROM {$table_name}");
25
26 foreach($scanned_cookies as $row => $data){
27
28 $expires = 0;
29
30 if(!empty($data->expires) && !empty($data->scan_timestamp)){
31 $expires = strtotime($data->expires);
32 $timestamp = $data->scan_timestamp;
33
34 if(!empty($expires) && ($expires > 0) && !empty($timestamp)){
35 $expires = round(($expires - $timestamp) / 86400);
36 }else{
37 $expires = 0;
38 }
39 }
40
41 if($expires < 1){
42 $exp = __('Session', 'cookieadmin');
43 }else{
44 $exp = $expires . ' '.__('Day(s)', 'cookieadmin');
45 }
46
47 if(empty($data->category)){
48 $data->category = 'Unknown';
49 }
50
51 if(!isset($categorized[$data->category])){
52 $categorized[$data->category] = '';
53 }
54
55 if(empty($data->description)){
56 $data->description = 'Not Available';
57 }
58
59 $patterns = !empty($data->patterns) ? $data->patterns : '';
60 if(!empty($patterns)){
61 $patterns = strtr($patterns, ['[' => '', ']' => '', '"' => '']);
62 }
63
64 $categorized[$data->category] .= '<tr><td>'.esc_html($data->cookie_name).'</td><td>'.esc_html($data->description).'</td><td>'.esc_html($exp).'</td><td> <span class="dashicons dashicons-edit cookieadmin_edit_icon" id="edit_'.esc_attr($data->id).'"></span> <span class="dashicons dashicons-trash cookieadmin_delete_icon" id="delete_'.esc_attr($data->id).'"></span> </td></tr>';
65
66 $categorized_cookies[$data->id]['id'] = $data->id;
67 $categorized_cookies[$data->id]['cookie_name'] = $data->cookie_name;
68 $categorized_cookies[$data->id]['description'] = $data->description;
69 $categorized_cookies[$data->id]['category'] = $data->category;
70 $categorized_cookies[$data->id]['expires'] = $expires;
71 $categorized_cookies[$data->id]['patterns'] = $patterns;
72
73 }
74
75 wp_register_script('cookieadmin_categorized_cookies', '', array('jquery'), COOKIEADMIN_VERSION, true);
76 wp_enqueue_script('cookieadmin_categorized_cookies');
77 wp_localize_script('cookieadmin_categorized_cookies', 'categorized_cookies', $categorized_cookies);
78
79 $no_cookies = '<tr class="cookieadmin-empty-row"><td colspan=4>'.esc_html__('No Cookies Found!', 'cookieadmin').'</td></tr>';
80 $no_cookies_hidden = '<tr class="cookieadmin-empty-row" hidden><td colspan=4>'.esc_html__('No Cookies Found!', 'cookieadmin').'</td></tr>';
81
82 echo '
83 <div class="cookieadmin_consent-wrap">
84 <form action="" method="post">';
85 do_action('cookieadmin_before_scan_results');
86
87 echo '<div class="cookieadmin-card">
88 <div class="cookieadmin-card-header">
89 <div>
90 <span class="cookieadmin-card-title"><span class="dashicons dashicons-list-view"></span> '.esc_html__('Scanned Cookies', 'cookieadmin').'</span>
91 <p class="cookieadmin-desc">'.esc_html__('Scanned cookies will be automatically categorised and displayed here. You can add, edit and delete cookies as per your needs.', 'cookieadmin').'</p>
92 </div>
93 <div class="cookieadmin-toolbar-actions">
94 <input type="button" class="cookieadmin-btn cookieadmin-btn-secondary cookieadmin-add-cookie" value="'.esc_html__('Add Cookie', 'cookieadmin').'" cookieadmin-pro-only="1"></input>
95 '.wp_kses_post($cookieadmin_requires_pro).
96 ( !empty($cookieadmin_requires_pro) ? '
97 <input type="button" class="cookieadmin-btn cookieadmin-btn-primary cookieadmin-scan" value="'.esc_html__('Scan', 'cookieadmin').'"></input> ' : '').'
98 <input type="button" class="cookieadmin-btn cookieadmin-btn-primary cookieadmin-scan" value="'.esc_html__('Full Scan', 'cookieadmin').'" cookieadmin-pro-only="1">
99 '.wp_kses_post($cookieadmin_requires_pro).'
100 </div>
101 </div>
102 <div class="cookieadmin-card-body">
103 <div class="cookieadmin-manager-result">
104 <table class="cookieadmin-table cookieadmin-cookie-categorized">
105 <thead>
106 <tr>
107 <th width="30%">'.esc_html__('Name', 'cookieadmin').'</th>
108 <th width="50%">'.esc_html__('Description', 'cookieadmin').'</th>
109 <th width="10%">'.esc_html__('Expiry', 'cookieadmin').'</th>
110 <th width="10%">'.esc_html__('Action', 'cookieadmin').'</th>
111 </tr>
112 </thead>
113 <tbody id="necessary_tbody">
114 <tr><td colspan=4>'.esc_html__('Necessary Cookies', 'cookieadmin').'</td></tr>
115 '.( !empty($categorized['Necessary']) ? $no_cookies_hidden . wp_kses_post($categorized['Necessary']) : $no_cookies ).'
116 </tbody>
117 <tbody id="functional_tbody">
118 <tr><td colspan=4>'.esc_html__('Functional Cookies', 'cookieadmin').'</td></tr>
119 '.( !empty($categorized['Functional']) ? $no_cookies_hidden . wp_kses_post($categorized['Functional']) : $no_cookies ).'
120 </tbody>
121 <tbody id="analytics_tbody">
122 <tr><td colspan=4>'.esc_html__('Analytical Cookies', 'cookieadmin').'</td></tr>
123 '.( !empty($categorized['Analytics']) ? $no_cookies_hidden . wp_kses_post($categorized['Analytics']) :$no_cookies ).'
124 </tbody>
125 <tbody id="marketing_tbody">
126 <tr><td colspan=4>'.esc_html__('Marketing Cookies', 'cookieadmin').'</td></tr>
127 '.( !empty($categorized['Marketing']) ? $no_cookies_hidden . wp_kses_post($categorized['Marketing']) : $no_cookies ).'
128 </tbody>
129 <tbody id="unknown_tbody">
130 <tr><td colspan=4>'.esc_html__('Unknown Cookies', 'cookieadmin').'</td></tr>
131 '.( !empty($categorized['Unknown']) ? $no_cookies_hidden . wp_kses_post($categorized['Unknown']) : $no_cookies ).'
132 </tbody>
133 </table>
134 </div>
135 </div>
136 </div>';
137
138 wp_nonce_field('cookieadmin_admin_nonce', 'cookieadmin_security');
139
140 echo '
141 </div>
142 </form>
143 <br/>';
144
145 \CookieAdmin\Admin::footer_theme();
146
147 echo '
148 <!-- Modal Overlay -->
149 <div class="cookieadmin_modal-overlay" id="edit-cookie-modal" hidden>
150 <div class="cookieadmin_modal-container">
151 <div class="cookieadmin_modal-header">
152 <h2>'.esc_html__('Edit Cookie', 'cookieadmin').'</h2>
153 <button class="cookieadmin_dialog_modal_close_btn">&times;</button>
154 </div>
155
156 <div class="cookieadmin_modal-body">
157 <div class="cookieadmin_form-group">
158 <label for="cookieadmin-dialog-cookie-category">'.esc_html__('Category', 'cookieadmin').'</label>
159 <select id="cookieadmin-dialog-cookie-category">
160 <option value="" selected>'.esc_html__('Select a category', 'cookieadmin').'</option>
161 <option value="Necessary">'.esc_html__('Necessary', 'cookieadmin').'</option>
162 <option value="Functional">'.esc_html__('Functional', 'cookieadmin').'</option>
163 <option value="Analytics">'.esc_html__('Analytical', 'cookieadmin').'</option>
164 <option value="Marketing">'.esc_html__('Marketing', 'cookieadmin').'</option>
165 <option value="Unknown">'.esc_html__('Unknown', 'cookieadmin').'</option>
166 </select>
167 </div>
168
169 <div class="cookieadmin_form-group">
170 <label for="cookie_id">'.esc_html__('Cookie Name/ID', 'cookieadmin').'</label>
171 <input type="text" id="cookieadmin-dialog-cookie-name" Placeholder="'.esc_html__('Enter Cookie Name or id', 'cookieadmin').'">
172 </div>
173
174 <div class="cookieadmin_form-group">
175 <label for="description">'.esc_html__('Description', 'cookieadmin').'</label>
176 <textarea id="cookieadmin-dialog-cookie-desc" Placeholder="'.esc_html__('Enter Cookie description here', 'cookieadmin').'"></textarea>
177 </div>
178
179 <div class="cookieadmin_form-group">
180 <label for="duration">'.esc_html__('Duration', 'cookieadmin').'</label>
181 <input type="number" min=0 id="cookieadmin-dialog-cookie-duration" Placeholder="'.esc_html__('Set 0 for Session or expiry in days', 'cookieadmin').'">
182 </div>';
183
184 if(empty($cookieadmin_requires_pro)){
185 echo '<div class="cookieadmin_form-group">
186 <label for="patterns">'.esc_html__('Scripts patterns', 'cookieadmin').'</label>
187 <span>'.__('If scripts has "src" attribute then paste the src or add comma separated patterns to match the scripts. Try choosing log patterns to block only targeted script', 'cookieadmin').'</span>
188 <br /><span><strong>'.__('Note: ', 'cookieadmin').'</strong>'.__('Wildcards (*, ?, ^, % etc) are not allowed', 'cookieadmin').'</span>
189 <textarea id="cookieadmin-dialog-cookie-patterns" Placeholder="'.esc_attr__('https://connect.facebook.net/en_US/fbevents.js OR fbq.push, window.facebookSignals', 'cookieadmin').'"></textarea>
190 </div>';
191 }
192 echo '</div>
193 <div class="cookieadmin_modal-footer">
194 <span id="cookieadmin-message"></span>
195 <button class="cookieadmin-btn cookieadmin-btn-primary" id="cookieadmin_dialog_save_btn" form="edit-cookie-form">'.esc_html__('Save', 'cookieadmin').'</button>
196 </div>
197 </div>
198 </div>';
199 }
200
201
202
203 static function scan_cookies_ajax(){
204 global $cookieadmin_error;
205
206 $urls = [];
207 if(!empty($_REQUEST['urls'])){
208 $urls = map_deep(wp_unslash($_REQUEST['urls']), 'sanitize_url');
209 }
210
211 if(cookieadmin_is_pro()){
212 $scanner_info = get_option('cookieadmin_pro_scanner', []);
213
214 if(!empty($scanner_info['last_scan']) && (time() < $scanner_info['last_scan'] + 3600)){
215 wp_send_json([
216 'success' => false,
217 'message' => __('Cookie Scan can be triggered once an hour', 'cookieadmin')
218 ]);
219 }
220 }
221
222 self::scan_cookies($urls);
223
224 if(!empty($cookieadmin_error)){
225 wp_send_json([
226 'success' => false,
227 'message' => $cookieadmin_error]
228 );
229 }
230
231 wp_send_json(['success' => true, 'data' => null]);
232 }
233
234 // Orchestrator function for scanning cookies
235 static function scan_cookies($urls = []){
236 global $cookieadmin_error;
237
238 if(cookieadmin_is_pro()){
239
240 if(!method_exists('\CookieAdminPro\Admin', 'cookieadmin_get_site_urls')){
241 $urls = [home_url()];
242 } else {
243 $urls = \CookieAdminPro\Admin::cookieadmin_get_site_urls($urls);
244 }
245
246 $cookieData = apply_filters('cookieadmin_pro_scan_cookies', $urls);
247
248 //Server side scann - skipped for now - need to discuss.
249 // $cookieData2 = \CookieAdmin\Scanner::start_scan($urls);
250 // $cookieData = array_replace_recursive($cookieData2, $cookieData1);
251
252 if(!empty($cookieadmin_error)){
253 update_option('cookieadmin_scan', [
254 'status' => 3,
255 'success' => false,
256 'message' => $cookieadmin_error,
257 'update' => time()
258 ]);
259 return;
260 }
261
262 if(!empty($cookieData)){
263
264 if(function_exists('cookieadmin_pro_get_remaining_urls')){
265 // Check Remaining urls
266 $remaining_urls = cookieadmin_pro_get_remaining_urls($urls);
267
268 if(!empty($remaining_urls)){
269 //send next batch for scan
270 wp_schedule_single_event(time() + 5, 'cookieadmin_run_auto_scan_batch', [$remaining_urls]);
271 }
272 }
273
274 $res = self::save_raw_scan_results($cookieData);
275 if(function_exists('cookieadmin_pro_update_scan_count')){
276 cookieadmin_pro_update_scan_count($res);
277 }
278
279 self::cookieadmin_auto_configure_cookies();
280 return;
281 }
282
283 }else{
284 $cookieData = \CookieAdmin\Scanner::start_scan();
285 if(!empty($cookieData)){
286 self::save_raw_scan_results($cookieData);
287 return self::cookieadmin_auto_configure_cookies();
288 }
289 }
290 // cookieadmin_r_print($cookieData);
291
292 if(defined('DOING_CRON') && get_transient('cookieadmin_auto_scan_in_progress')){
293 delete_transient('cookieadmin_auto_scan_in_progress');
294 }
295
296 update_option('cookieadmin_scan', [
297 'status' => 3,
298 'success' => false,
299 'message' => __('No Cookies Found', 'cookieadmin'),
300 'update' => time()
301 ]);
302
303 return false;
304 }
305
306 static function save_raw_scan_results(array $found_cookies){
307
308 global $wpdb;
309
310 $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
311
312 if (empty($found_cookies)) {
313 return ['inserted' => 0, 'updated' => 0];
314 }
315
316 // Step 1: Fetch all existing cookie names from our database in one efficient query.
317 $existing_cookies_in_db = $wpdb->get_col("SELECT cookie_name FROM {$table_name}");
318 // Use array_flip for very fast 'isset' lookups instead of slow 'in_array' in a loop.
319 $existing_cookies_lookup = !empty($existing_cookies_in_db) ? array_flip($existing_cookies_in_db) : [];
320
321 $results = ['inserted' => 0, 'updated' => 0];
322
323 // Step 2: Loop through each cookie found by the scanner.
324 foreach ($found_cookies as $cookie_name => $cookie_data) {
325
326 // Step 3: Check if the cookie exists in our DB.
327 if (isset($existing_cookies_lookup[$cookie_name])) {
328 $wpdb->update(
329 $table_name,
330 [
331 'domain' => sanitize_text_field($cookie_data['domain']),
332 'path' => sanitize_text_field($cookie_data['path']),
333 'expires' => !empty($cookie_data['session']) ? 0 : (!empty($cookie_data['expires']) ? $cookie_data['expires'] : null),
334 'samesite' => !empty($cookie_data['samesite']) ? sanitize_text_field($cookie_data['samesite']) : null,
335 'secure' => (int)($cookie_data['secure'] ?? 0),
336 'httponly' => (int)($cookie_data['httponly'] ?? 0),
337 'raw_name' => sanitize_text_field($cookie_name),
338 'scan_timestamp' => time(),
339 ], // Data to update
340 [ 'cookie_name' => $cookie_name ], // WHERE clause
341 ['%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d'], // Format for the data
342 [ '%s' ] // Format for the WHERE clause
343 );
344 $results['updated']++;
345
346 } else {
347
348 if($cookie_name == 'cookieadmin_consent' && empty($cookie_data['expires'])){
349 $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
350 $policy = cookieadmin_load_policy();
351
352 if(!empty($policy) && !empty($policy[$view])){
353 $cookie_exp_days = (int) (!empty($policy[$view]['cookieadmin_days']) ? $policy[$view]['cookieadmin_days'] : 365);
354 $utc_time = gmdate('Y-m-d H:i:s', strtotime('+'.$cookie_exp_days.' days'));
355 } else {
356 $utc_time = gmdate('Y-m-d H:i:s', strtotime('+365 days'));
357 }
358
359 $cookie_data['expires'] = $utc_time;
360 }
361
362 // ------ INSERT a NEW cookie ------
363 $data = [
364 'cookie_name' => sanitize_text_field($cookie_name),
365 'domain' => sanitize_text_field($cookie_data['domain']),
366 'path' => sanitize_text_field($cookie_data['path']),
367 'expires' => !empty($cookie_data['session']) ? 0 : (!empty($cookie_data['expires']) ? $cookie_data['expires'] : null),
368 'samesite' => !empty($cookie_data['samesite']) ? sanitize_text_field($cookie_data['samesite']) : null,
369 'secure' => (int)($cookie_data['secure'] ?? 0),
370 'httponly' => (int)($cookie_data['httponly'] ?? 0),
371 'raw_name' => sanitize_text_field($cookie_name),
372 'scan_timestamp' => time(),
373 ];
374
375 $formats = ['%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%d'];
376
377 if ($wpdb->insert($table_name, $data, $formats)) {
378 $results['inserted']++;
379 } else {
380 //error_log("CookieAdmin: Error inserting cookie data: " . $wpdb->last_error);
381 }
382 }
383 }
384 return $results;
385 }
386
387 static function cookieadmin_auto_configure_cookies(){
388 global $wpdb, $cookieadmin_error;
389
390 $table_name = $wpdb->prefix . 'cookieadmin_cookies';
391 $categorized_cookies = [];
392 $uncategorized_cookies = [];
393
394 $all_cookies = $wpdb->get_results("SELECT id, cookie_name, category FROM {$table_name}");
395
396 foreach($all_cookies as $cookie){
397
398 if(!empty($cookie->category)){
399 $categorized_cookies[$cookie->id] = $cookie->cookie_name;
400 }else{
401 $uncategorized_cookies[] = $cookie->cookie_name;
402 }
403 }
404
405 if(!empty($uncategorized_cookies)){
406
407 $uncategorized_cookies = array_flip($uncategorized_cookies);
408 $categorized_cookies = array_flip($categorized_cookies);
409
410
411 $categorizd_cookies = \CookieAdmin\CookieCategorizer::categorize_cookies($uncategorized_cookies, $categorized_cookies);
412
413 $remove_cookies = !empty($categorizd_cookies['remove_cookies']) ? $categorizd_cookies['remove_cookies'] : [];
414
415 unset($categorizd_cookies['remove_cookies']);
416 if(!empty($remove_cookies)){
417 $placeholders = implode(',', array_fill(0, count($remove_cookies), '%s'));
418 $sql = $wpdb->prepare("DELETE FROM {$table_name} WHERE id IN ({$placeholders})", ...$remove_cookies);
419 $wpdb->query($sql);
420 }
421
422 foreach($categorizd_cookies as $cookie_data){
423
424 $count = $wpdb->update(
425 $table_name,
426 [ 'cookie_name' => $cookie_data['cookie_name'], 'category' => $cookie_data['category'], 'description' => $cookie_data['description'], 'edited' => 1, 'patterns' => $cookie_data['patterns'] ], // Data to update
427 [ 'raw_name' => $cookie_data['raw_name'] ], // WHERE
428 [ '%s', '%s', '%s', '%d', '%s' ], // Format for the data
429 [ '%s' ] // Format for the WHERE clause
430 );
431
432 }
433
434 update_option('cookieadmin_scan', [
435 'status' => 3,
436 'update' => time(),
437 'success' => true,
438 'count' => $count
439 ]);
440
441 $categorized_cookies = $wpdb->get_results("SELECT id, cookie_name, category, expires, scan_timestamp, description FROM {$table_name}");
442
443 delete_option('cookieadmin_first_scan');
444
445 return $categorized_cookies;
446 }
447
448 $cookieadmin_error = $cookieadmin_error . ' ' . __('No new cookies Found!', 'cookieadmin');
449
450 return false;
451 }
452
453
454 static function edit_cookies(){
455 global $wpdb;
456
457 $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
458 $data = null;
459
460 if(empty($_REQUEST['cookie_info'])){
461 wp_send_json(['success' => false,
462 'data' => null,
463 'message' => __('Error : Cookie details missing', 'cookieadmin')]
464 );
465 }
466
467 $cookie_info = map_deep(wp_unslash($_REQUEST['cookie_info']), 'sanitize_text_field');
468 // $scan_timestamp = $wpdb->get_col($wpdb->prepare("SELECT scan_timestamp FROM {$table_name} WHERE id = %d", $cookie_info['id']));
469
470 $scanned_cookies = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$table_name} WHERE id = %d", $cookie_info['id']));
471 $scan_timestamp = !empty($scanned_cookies->scan_timestamp) ? $scanned_cookies->scan_timestamp : 0;
472
473 if(empty($scan_timestamp)){
474 wp_send_json(['success' => false,
475 'data' => null,
476 'message' => __('Error : Invalid cookie record', 'cookieadmin')]
477 );
478 }
479
480 $calculated_expiry_seconds = ($cookie_info['duration'] * 86400) + $scan_timestamp;
481 $calculated_expiry = date('Y-m-d H:i:s', $calculated_expiry_seconds);
482
483 // Update the additional patterns into the saved patterns
484 $patterns = '[]';
485 if(!empty($cookie_info['patterns'])){
486 $script_patterns = explode(',', $cookie_info['patterns']);
487 if(!empty($script_patterns) && is_array($script_patterns)){
488 foreach($script_patterns as $pat){
489 if(strlen(str_replace(['*', '?', '^', '%'], '', $pat)) < strlen($pat)){
490 continue;
491 }
492 // do not ad comma if the saved pattern is empty
493 $comma = ($patterns === '[]') ? '' : ', ';
494 $patterns = str_replace(']', $comma . '"' .(string) trim($pat).'"]', $patterns);
495 }
496 }
497 }else{
498 $patterns = !empty($scanned_cookies->patterns) ? $scanned_cookies->patterns : '[]';
499 }
500
501 $resp = $wpdb->update(
502 $table_name,
503 [ 'cookie_name' => $cookie_info['name'], 'description' => $cookie_info['description'], 'expires' => $calculated_expiry, 'category' => $cookie_info['type'], 'patterns' => $patterns, 'edited' => 1], // Data to update
504 [ 'id' => $cookie_info['id'] ], // WHERE
505 [ '%s', '%s', '%s', '%s', '%s', '%d' ], // Format for the data
506 [ '%d' ] // Format for the WHERE clause
507 );
508
509 if ($wpdb->last_error || $resp === false) {
510 //error_log('DB Error: ' . $wpdb->last_error); // Log it
511 wp_send_json(['success' => false,
512 'data' => null,
513 'message' => __('Cookie updation Failed, Error: ', 'cookieadmin') . esc_html($wpdb->last_error)]);
514 }
515
516 wp_send_json(['success' => true,
517 'data' => $data,
518 'message' => __('Cookie updation successful', 'cookieadmin')]);
519
520 }
521
522 static function delete_cookies(){
523 global $wpdb;
524
525 $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
526
527 if(empty($_REQUEST['cookie_raw_id'])){
528 wp_send_json(['success' => false,
529 'data' => null,
530 'message' => __('Error : Cookie Id missing', 'cookieadmin')]);
531 }
532
533 $cookie_id = (int) sanitize_text_field(wp_unslash($_REQUEST['cookie_raw_id']));
534
535 $resp = $wpdb->delete( $table_name, ['id' => $cookie_id], [ '%s' ] );
536
537 if ($wpdb->last_error || $resp === false) {
538 //error_log('DB Error: ' . $wpdb->last_error); //Log it
539 wp_send_json(['success' => false,
540 'data' => null,
541 'message' => __('Cookie deletion Failed, Error: ', 'cookieadmin') . esc_html($wpdb->last_error)]);
542 }
543
544 wp_send_json(['success' => true,
545 'message' => __('Cookie deletion successful', 'cookieadmin')]);
546 }
547
548 }
549