PluginProbe
CookieAdmin – Cookie Consent Banner / 1.2.6
CookieAdmin – Cookie Consent Banner v1.2.6
1.2.6 1.2.5 1.2.4 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 All 26 releases
← All changes | includes/admin/dashboard.php +397 -33 1.1.6 → 1.2.6 View file →
@@ -15,42 +15,406 @@
15 15 \CookieAdmin\Admin::header_theme(__('Dashboard', 'cookieadmin'));
16 16
17 17 $view = get_option('cookieadmin_law', 'cookieadmin_gdpr');
18 18
19 - echo '
20 - <div class="cookieadmin_consent-wrap">
21 - <div class="cookieadmin-admin-row">
22 - <div class="cookieadmin-stats-block cookieadmin-is-block-25">
23 - <div class="cookieadmin-stats-name">'.esc_html__('Consent Banner', 'cookieadmin').'</div>
24 - <div class="cookieadmin-stats-number cookieadmin-green">'.esc_html__('Enabled', 'cookieadmin').'</div>
25 - </div>
26 -
27 - <div class="cookieadmin-stats-block cookieadmin-is-block-25">
28 - <div class="cookieadmin-stats-name">'.esc_html__('Consent Type', 'cookieadmin').'&nbsp;
29 - <div class="cookieadmin-block-link"><a href="'.esc_url(admin_url('admin.php?page=cookieadmin-consent')).'">['.esc_html__('Edit', 'cookieadmin').']</a></div>
19 + $stats = array();
20 +
21 + $stats['banner'] = array(
22 + 'icon' => 'yes-alt',
23 + 'icon_color' => 'green',
24 + 'label' => __('Consent Banner', 'cookieadmin'),
25 + 'value' => esc_html__('Enabled', 'cookieadmin'),
26 + 'value_class' => 'cookieadmin-green',
27 + );
28 +
29 + $stats['consent_type'] = array(
30 + 'icon' => 'admin-site',
31 + 'icon_color' => 'blue',
32 + 'label' => __('Consent Type', 'cookieadmin'),
33 + 'value' => ($view == 'cookieadmin_us' ? esc_html__('US State Laws', 'cookieadmin') : ($view == 'cookieadmin_dpdp' ? esc_html__('DPDP Act (India)', 'cookieadmin') : esc_html__('GDPR', 'cookieadmin'))),
34 + 'value_class' => 'cookieadmin-uppercase',
35 + 'edit_url' => admin_url('admin.php?page=cookieadmin-consent'),
36 + );
37 +
38 + $stats['gcm'] = array(
39 + 'icon' => 'google',
40 + 'icon_color' => 'navy',
41 + 'label' => __('Google Consent Mode v2', 'cookieadmin'),
42 + 'value' => (!empty($cookieadmin_settings['google_consent_mode_v2']) ? '<span class="cookieadmin-green">'.esc_html__('Enabled', 'cookieadmin').'</span>' : esc_html__('Disabled', 'cookieadmin')),
43 + 'edit_url' => admin_url('admin.php?page=cookieadmin-settings'),
44 + );
45 +
46 + $stats['auto_scan'] = array(
47 + 'icon' => 'update',
48 + 'icon_color' => 'amber',
49 + 'label' => __('Auto Scan', 'cookieadmin'),
50 + 'value' => (!empty($cookieadmin_settings['cookieadmin_auto_scan']) ? '<span class="cookieadmin-green">'.esc_html__('Enabled', 'cookieadmin').'</span>' : esc_html__('Disabled', 'cookieadmin')),
51 + 'edit_url' => admin_url('admin.php?page=cookieadmin-settings'),
52 + );
53 +
54 + $stats = apply_filters('cookieadmin_dashboard_stats', $stats);
55 +
56 + // Stat cards
57 + echo '<div class="cookieadmin-stats-grid">';
58 + foreach($stats as $stat){
59 + echo '<div class="cookieadmin-stat-card">
60 + <div class="cookieadmin-stat-icon cookieadmin-stat-icon--'.esc_attr($stat['icon_color']).'"><span class="dashicons dashicons-'.esc_attr($stat['icon']).'"></span></div>
61 + <div class="cookieadmin-stat-label">'.esc_html($stat['label']);
62 + if(!empty($stat['edit_url'])){
63 + echo ' <a class="cookieadmin-stat-edit" href="'.esc_url($stat['edit_url']).'">'.esc_html__('Edit', 'cookieadmin').'</a>';
64 + }
65 + echo '</div>
66 + <div class="cookieadmin-stat-value '.(!empty($stat['value_class']) ? esc_attr($stat['value_class']) : '').'">'.wp_kses_post($stat['value']).'</div>
67 + </div>';
68 + }
69 + echo '</div>';
70 +
71 + // ====== DASHBOARD LAYOUT: MAIN 70% + SIDEBAR 30% ======
72 + $checklist = self::get_setup_checklist();
73 + $inventory = self::get_cookie_inventory();
74 +
75 + echo '<div class="cookieadmin-dashboard-grid">';
76 +
77 + // MAIN AREA (~70%)
78 + echo '<div class="cookieadmin-dashboard-main">';
79 +
80 + // Setup Checklist
81 + echo '<div class="cookieadmin-card cookieadmin-mb-16">
82 + <div class="cookieadmin-card-header">
83 + <span class="cookieadmin-card-title"><span class="dashicons dashicons-performance"></span>'.esc_html__('Setup Checklist', 'cookieadmin').'</span>
84 + </div>
85 + <div class="cookieadmin-card-body">
86 + <ol class="cookieadmin-checklist">';
87 + foreach($checklist as $item){
88 + // We should not show the checklist of Pro features if Pro is disabled.
89 + if(isset($item['pro']) && !defined('COOKIEADMIN_PRO_VERSION')){
90 + continue;
91 + }
92 +
93 + $done_class = $item['done'] ? 'cookieadmin-checklist-item--done' : 'cookieadmin-checklist-item--pending';
94 + $icon = $item['done'] ? 'yes' : 'marker';
95 + echo '<li><a href="'.esc_url($item['url']).'" class="'.esc_attr($done_class).'"><span class="dashicons dashicons-'.esc_attr($icon).'"></span> '.esc_html($item['label']).'</a></li>';
96 + }
97 + echo '</ol>
98 + </div>
99 + </div>';
100 +
101 + // Cookie Inventory
102 + echo '<div class="cookieadmin-card cookieadmin-mb-16">
103 + <div class="cookieadmin-card-header">
104 + <span class="cookieadmin-card-title"><span class="dashicons dashicons-chart-pie"></span>'.esc_html__('Cookie Inventory', 'cookieadmin').'</span>
105 + <a href="'.esc_url(admin_url('admin.php?page=cookieadmin-scan-cookies')).'" class="cookieadmin-btn cookieadmin-btn-secondary cookieadmin-btn-sm">'.esc_html__('View All Cookies', 'cookieadmin').'</a>
106 + </div>
107 + <div class="cookieadmin-card-body">';
108 + if(!empty($inventory['total'])){
109 + echo '<div class="cookieadmin-inventory-total"><span class="cookieadmin-inventory-number">'.esc_html($inventory['total']).'</span> <span class="cookieadmin-inventory-label">'.esc_html__('Cookies discovered', 'cookieadmin').'</span></div>';
110 +
111 + $seg_colors = array('necessary' => 'var(--cookieadmin-success)', 'functional' => 'var(--cookieadmin-info)', 'analytics' => 'var(--cookieadmin-warning)', 'marketing' => 'var(--cookieadmin-danger)', 'unknown' => 'var(--cookieadmin-text-soft)');
112 +
113 + echo '<div class="cookieadmin-segment-bar">';
114 + foreach($inventory['categories'] as $cat => $count){
115 + if($count > 0 && !empty($inventory['total'])){
116 + $pct = round(($count / $inventory['total']) * 100, 1);
117 + echo '<div class="cookieadmin-segment" style="width:'.esc_attr($pct).'%;background:'.esc_attr($seg_colors[$cat]).';" title="'.esc_attr(ucfirst($cat)).': '.esc_attr($count).'"></div>';
118 + }
119 + }
120 + echo '</div>';
121 +
122 + echo '<div class="cookieadmin-segment-legend">';
123 + foreach($inventory['categories'] as $cat => $count){
124 + echo '<span class="cookieadmin-legend-item"><span class="cookieadmin-legend-dot" style="background:'.esc_attr($seg_colors[$cat]).';"></span> '.esc_html(ucfirst($cat)).': <strong>'.esc_html($count).'</strong></span>';
125 + }
126 + echo '</div>';
127 + }else{
128 + echo '<p class="cookieadmin-text-muted">'.esc_html__('No cookies discovered yet. Run a scan to get started.', 'cookieadmin').'</p>';
129 + }
130 + if(!empty($inventory['unknown'])){
131 + echo '<div class="cookieadmin-inventory-warning"><span class="dashicons dashicons-warning"></span> '.esc_html__('Some cookies are uncategorized. Run a scan for better compliance.', 'cookieadmin').'</div>';
132 + }
133 + echo '</div>
134 + </div>';
135 +
136 + // Pro main-area widgets (appears inside main, below checklist + inventory)
137 + do_action('cookieadmin_dashboard_main_widgets');
138 +
139 + echo '</div>'; // end main
140 +
141 + // SIDEBAR (~30%)
142 + echo '<div class="cookieadmin-dashboard-sidebar">';
143 +
144 + // Recommended Plugins (free)
145 + self::render_recommended_plugins();
146 +
147 + // Pro sidebar widgets (if any)
148 + do_action('cookieadmin_dashboard_sidebar_widgets');
149 +
150 + echo '</div>'; // end sidebar
151 +
152 + echo '</div>'; // end grid
153 +
154 + \CookieAdmin\Admin::footer_theme();
155 + }
156 +
157 + static function get_setup_checklist(){
158 + global $cookieadmin_settings;
159 +
160 + $policy = cookieadmin_load_policy();
161 + $law = get_option('cookieadmin_law', '');
162 + $scan = get_option('cookieadmin_scan', array());
163 + $cur = !empty($policy[$law]) ? $policy[$law] : array();
164 +
165 + $checklist = array();
166 +
167 + $checklist[] = array(
168 + 'label' => __('Run Cookie Scan', 'cookieadmin'),
169 + 'done' => (!empty($scan['success']) && $scan['success'] === true),
170 + 'url' => admin_url('admin.php?page=cookieadmin-scan-cookies'),
171 + );
172 +
173 + $checklist[] = array(
174 + 'label' => __('Configure Consent Banner', 'cookieadmin'),
175 + 'done' => !empty($cur),
176 + 'url' => admin_url('admin.php?page=cookieadmin-consent'),
177 + );
178 +
179 + $checklist[] = array(
180 + 'label' => __('Set Consent Type', 'cookieadmin'),
181 + 'done' => (!empty($law) && in_array($law, array('cookieadmin_gdpr', 'cookieadmin_us', 'cookieadmin_dpdp'), true)),
182 + 'url' => admin_url('admin.php?page=cookieadmin-consent'),
183 + );
184 +
185 + $checklist[] = array(
186 + 'label' => __('Enable Google Consent Mode v2', 'cookieadmin'),
187 + 'done' => !empty($cookieadmin_settings['google_consent_mode_v2']),
188 + 'url' => admin_url('admin.php?page=cookieadmin-settings'),
189 + 'pro' => true,
190 + );
191 +
192 + $has_links = false;
193 + if(!empty($cur['cookieadmin_privacy_policy']) || !empty($cur['cookieadmin_cookie_policy'])){
194 + $has_links = true;
195 + }
196 + $checklist[] = array(
197 + 'label' => __('Set Privacy / Cookie Policy Links', 'cookieadmin'),
198 + 'done' => $has_links,
199 + 'url' => admin_url('admin.php?page=cookieadmin-consent'),
200 + 'pro' => true,
201 + );
202 +
203 + $checklist[] = array(
204 + 'label' => __('Configure Auto Scan', 'cookieadmin'),
205 + 'done' => !empty($cookieadmin_settings['cookieadmin_auto_scan']),
206 + 'url' => admin_url('admin.php?page=cookieadmin-settings'),
207 + 'pro' => true,
208 + );
209 +
210 + return $checklist;
211 + }
212 +
213 + static function get_cookie_inventory(){
214 + global $wpdb;
215 +
216 + $table_name = esc_sql($wpdb->prefix . 'cookieadmin_cookies');
217 +
218 + if(!\CookieAdmin\Admin::cookieadmin_table_exists($table_name)){
219 + return array('total' => 0, 'categories' => array('necessary' => 0, 'functional' => 0, 'analytics' => 0, 'marketing' => 0, 'unknown' => 0), 'unknown' => 0);
220 + }
221 +
222 + $total = (int) $wpdb->get_var("SELECT COUNT(*) FROM $table_name");
223 +
224 + $categories = array('necessary' => 0, 'functional' => 0, 'analytics' => 0, 'marketing' => 0, 'unknown' => 0);
225 +
226 + $rows = $wpdb->get_results("SELECT category, COUNT(*) AS cnt FROM $table_name GROUP BY category");
227 +
228 + if(!empty($rows)){
229 + foreach($rows as $row){
230 + $cat = strtolower($row->category);
231 + if(array_key_exists($cat, $categories)){
232 + $categories[$cat] = (int) $row->cnt;
233 + }else{
234 + $categories['unknown'] += (int) $row->cnt;
235 + }
236 + }
237 + }
238 +
239 + return array(
240 + 'total' => $total,
241 + 'categories' => $categories,
242 + 'unknown' => $categories['unknown'],
243 + );
244 + }
245 +
246 + static function render_recommended_plugins(){
247 + $plugins = array(
248 + 'loginizer' => array(
249 + 'name' => 'Loginizer',
250 + 'desc' => __('Brute Force Protection & Login Security', 'cookieadmin'),
251 + 'icon' => 'dashicons-shield',
252 + 'wporg_url' => 'https://wordpress.org/plugins/loginizer/',
253 + ),
254 + 'gosmtp' => array(
255 + 'name' => 'GoSMTP',
256 + 'desc' => __('SMTP Mailer for WordPress', 'cookieadmin'),
257 + 'icon' => 'dashicons-email-alt',
258 + 'wporg_url' => 'https://wordpress.org/plugins/gosmtp/',
259 + ),
260 + 'backuply' => array(
261 + 'name' => 'Backuply',
262 + 'desc' => __('Backup & Restore made easy', 'cookieadmin'),
263 + 'icon' => 'dashicons-backup',
264 + 'wporg_url' => 'https://wordpress.org/plugins/backuply/',
265 + ),
266 + 'siteseo' => array(
267 + 'name' => 'SiteSEO',
268 + 'desc' => __('SEO Optimization for WordPress', 'cookieadmin'),
269 + 'icon' => 'dashicons-search',
270 + 'wporg_url' => 'https://wordpress.org/plugins/siteseo/',
271 + ),
272 + );
273 +
274 + echo '<div class="cookieadmin-card cookieadmin-recommended-plugins">
275 + <div class="cookieadmin-card-header">
276 + <span class="cookieadmin-card-title"><span class="dashicons dashicons-admin-plugins"></span>'.esc_html__('Recommended Plugins', 'cookieadmin').'</span>
277 + </div>
278 + <div class="cookieadmin-card-body">';
279 +
280 + foreach($plugins as $slug => $plugin){
281 + $status = self::get_plugin_status($slug);
282 +
283 + echo '<div class="cookieadmin-recommended-plugin" data-slug="'.esc_attr($slug).'">
284 + <div class="cookieadmin-recommended-plugin-info">
285 + <div class="cookieadmin-recommended-plugin-icon"><span class="dashicons '.esc_attr($plugin['icon']).'"></span></div>
286 + <div class="cookieadmin-recommended-plugin-details">
287 + <div class="cookieadmin-recommended-plugin-name">'.esc_html($plugin['name']).'</div>
288 + <div class="cookieadmin-recommended-plugin-desc">'.esc_html($plugin['desc']).'</div>
30 289 </div>
31 - <div class="cookieadmin-stats-number cookieadmin-uppercase">'.(!empty($view) && $view == 'cookieadmin_us' ? esc_html__('US State Laws', 'cookieadmin') : esc_html__('GDPR', 'cookieadmin')).'</div>
32 290 </div>
33 -
34 - <div class="cookieadmin-stats-block cookieadmin-is-block-25">
35 - <div class="cookieadmin-stats-name">'.esc_html__('Google Consent Mode v2', 'cookieadmin').'&nbsp;
36 - <div class="cookieadmin-block-link"><a href="'.esc_url(admin_url('admin.php?page=cookieadmin-settings')).'">['.esc_html__('Edit', 'cookieadmin').']</a></div>
37 - </div>
38 - '.(!empty($cookieadmin_settings['google_consent_mode_v2']) ? '<div class="cookieadmin-stats-number cookieadmin-green">'.esc_html__('Enabled', 'cookieadmin').'</div>' : '<div class="cookieadmin-stats-number">'.esc_html__('Disabled', 'cookieadmin').'</div>').'
39 - </div>
40 -
41 - <div class="cookieadmin-stats-block cookieadmin-is-block-25">
42 - <div class="cookieadmin-stats-name">'.esc_html__('Auto Scan', 'cookieadmin').'&nbsp;
43 - <div class="cookieadmin-block-link"><a href="'.esc_url(admin_url('admin.php?page=cookieadmin-settings')).'">['.esc_html__('Edit', 'cookieadmin').']</a></div>
44 - </div>
45 - '.(!empty($cookieadmin_settings['cookieadmin_auto_scan']) ? '<div class="cookieadmin-stats-number cookieadmin-green">'.esc_html__('Enabled', 'cookieadmin').'</div>' : '<div class="cookieadmin-stats-number">'.esc_html__('Disabled', 'cookieadmin').'</div>').'
46 - </div>
47 -
48 - <div style="width:25%">
49 -
50 - </div>
51 - </div>
291 + <div class="cookieadmin-recommended-plugin-action">
292 + <a href="'.esc_url($plugin['wporg_url']).'" target="_blank" class="cookieadmin-recommended-plugin-link">'.esc_html__('Learn more', 'cookieadmin').'&nbsp;</a>
293 + ';
294 +
295 + if($status === 'active'){
296 + echo '<span class="cookieadmin-badge cookieadmin-success">'.esc_html__('Active', 'cookieadmin').'</span>';
297 + }elseif($status === 'installed'){
298 + echo '<button type="button" class="cookieadmin-btn cookieadmin-btn-secondary cookieadmin-btn-sm cookieadmin-plugin-activate-btn" data-slug="'.esc_attr($slug).'">'.esc_html__('Activate', 'cookieadmin').'</button>';
299 + }else{
300 + echo '<button type="button" class="cookieadmin-btn cookieadmin-btn-primary cookieadmin-btn-sm cookieadmin-plugin-install-btn" data-slug="'.esc_attr($slug).'">'.esc_html__('Install', 'cookieadmin').'</button>';
301 + }
302 +
303 + echo '</div>
304 + </div>';
305 + }
306 +
307 + echo '</div>
52 308 </div>';
309 + }
310 +
311 + static function get_plugin_status($slug){
312 + if(!function_exists('get_plugins')){
313 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
314 + }
53 315
54 - \CookieAdmin\Admin::footer_theme();
316 + $all_plugins = get_plugins();
317 +
318 + foreach($all_plugins as $plugin_path => $plugin_data){
319 + if(strpos($plugin_path, $slug . '/') === 0){
320 + if(is_plugin_active($plugin_path)){
321 + return 'active';
322 + }
323 + return 'installed';
324 + }
325 + }
326 +
327 + return 'not_installed';
55 328 }
56 -}
329 +
330 + static function install_recommended_plugin(){
331 + check_ajax_referer('cookieadmin_admin_js_nonce', 'cookieadmin_security');
332 +
333 + if(!current_user_can('install_plugins')){
334 + wp_send_json_error(array('message' => __('You do not have permission to install plugins.', 'cookieadmin')));
335 + }
336 +
337 + $slug = !empty($_REQUEST['plugin']) ? sanitize_text_field(wp_unslash($_REQUEST['plugin'])) : '';
338 + if(empty($slug)){
339 + wp_send_json_error(array('message' => __('Plugin slug is required.', 'cookieadmin')));
340 + }
341 +
342 + require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
343 + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
344 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
345 +
346 + $api = plugins_api('plugin_information', array('slug' => $slug, 'fields' => array('sections' => false)));
347 + if(is_wp_error($api)){
348 + wp_send_json_error(array('message' => $api->get_error_message()));
349 + }
350 +
351 + $skin_class = class_exists('\Automatic_Upgrader_Skin') ? '\Automatic_Upgrader_Skin' : '\WP_Upgrader_Skin';
352 + $skin = new $skin_class();
353 + $upgrader = new \Plugin_Upgrader($skin);
354 + $result = $upgrader->install($api->download_link);
355 +
356 + if(is_wp_error($result)){
357 + wp_send_json_error(array('message' => $result->get_error_message()));
358 + }
359 + if(!$result){
360 + wp_send_json_error(array('message' => __('Plugin installation failed.', 'cookieadmin')));
361 + }
362 +
363 + $all_plugins = get_plugins();
364 + $installed_plugin = '';
365 + foreach($all_plugins as $path => $data){
366 + if(strpos($path, $slug . '/') === 0){
367 + $installed_plugin = $path;
368 + break;
369 + }
370 + }
371 +
372 + if(empty($installed_plugin)){
373 + wp_send_json_error(array('message' => __('Plugin installed but could not be located for activation.', 'cookieadmin')));
374 + }
375 +
376 + $result = activate_plugin($installed_plugin);
377 + if(is_wp_error($result)){
378 + wp_send_json_error(array('message' => $result->get_error_message()));
379 + }
380 +
381 + wp_send_json_success(array('message' => __('Plugin installed and activated successfully.', 'cookieadmin')));
382 + }
383 +
384 + static function activate_recommended_plugin(){
385 + check_ajax_referer('cookieadmin_admin_js_nonce', 'cookieadmin_security');
386 +
387 + if(!current_user_can('activate_plugins')){
388 + wp_send_json_error(array('message' => __('You do not have permission to activate plugins.', 'cookieadmin')));
389 + }
390 +
391 + $slug = !empty($_REQUEST['plugin']) ? sanitize_text_field(wp_unslash($_REQUEST['plugin'])) : '';
392 + if(empty($slug)){
393 + wp_send_json_error(array('message' => __('Plugin slug is required.', 'cookieadmin')));
394 + }
395 +
396 + if(!function_exists('get_plugins')){
397 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
398 + }
399 +
400 + $all_plugins = get_plugins();
401 + $plugin_path = '';
402 + foreach($all_plugins as $path => $data){
403 + if(strpos($path, $slug . '/') === 0){
404 + $plugin_path = $path;
405 + break;
406 + }
407 + }
408 +
409 + if(empty($plugin_path)){
410 + wp_send_json_error(array('message' => __('Plugin not found.', 'cookieadmin')));
411 + }
412 +
413 + $result = activate_plugin($plugin_path);
414 + if(is_wp_error($result)){
415 + wp_send_json_error(array('message' => $result->get_error_message()));
416 + }
417 +
418 + wp_send_json_success(array('message' => __('Plugin activated successfully.', 'cookieadmin')));
419 + }
420 +}