PluginProbe
CookieAdmin – Cookie Consent Banner / 1.2.2
CookieAdmin – Cookie Consent Banner v1.2.2
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
← All changes | includes/admin/dashboard.php +397 -33 1.1.51.2.2 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') : 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'), 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 +}