首页 / 应用软件 / 手把手教程,在WordPress中集成网站Cookie合规性管理与用户隐私同意控件

手把手教程,在WordPress中集成网站Cookie合规性管理与用户隐私同意控件

手把手教程:在WordPress中集成网站Cookie合规性管理与用户隐私同意控件

引言:数字时代的隐私合规挑战

在当今数字化时代,随着全球数据保护法规的不断完善,网站隐私合规性已成为每个网站所有者必须面对的重要课题。从欧盟的《通用数据保护条例》(GDPR)到加州的《消费者隐私法案》(CCPA),再到中国的《个人信息保护法》,全球各地都在加强对用户隐私的保护。对于使用WordPress构建的网站而言,如何有效管理Cookie和获取用户隐私同意,不仅是一项法律义务,更是建立用户信任的关键。

本教程将深入探讨如何通过WordPress代码二次开发,实现专业的Cookie合规性管理与用户隐私同意控件,同时集成常用互联网小工具功能。我们将从基础概念入手,逐步深入到具体实现,为您提供一套完整、实用的解决方案。

第一部分:理解Cookie合规性的基本要求

1.1 什么是Cookie合规性?

Cookie合规性指的是网站在使用Cookie和其他跟踪技术时,必须遵守相关隐私法规的要求。这主要包括:

  • 知情同意原则:在设置非必要Cookie前,必须获得用户的明确同意
  • 透明度原则:清晰告知用户网站使用了哪些Cookie及其目的
  • 控制权原则:允许用户随时撤回同意或调整Cookie偏好
  • 数据最小化原则:只收集实现特定目的所需的最少数据

1.2 主要隐私法规概览

  • GDPR(欧盟通用数据保护条例):适用于处理欧盟公民数据的任何组织,无论其所在地
  • CCPA(加州消费者隐私法案):保护加州居民的个人信息权利
  • PIPL(中国个人信息保护法):规范在中国境内处理个人信息的活动
  • ePrivacy指令:专门规范电子通信隐私,包括Cookie使用

1.3 WordPress网站的特殊考虑

WordPress作为内容管理系统,本身及其插件、主题都可能设置各种Cookie。常见的包括:

  • 会话Cookie(用于用户登录状态)
  • 评论功能Cookie
  • 统计分析Cookie(如Google Analytics)
  • 社交媒体集成Cookie
  • 广告跟踪Cookie

第二部分:规划Cookie合规解决方案

2.1 功能需求分析

一个完整的Cookie合规解决方案应包含以下核心功能:

  1. Cookie横幅/弹出窗口:首次访问时显示,请求用户同意
  2. Cookie偏好中心:允许用户详细管理各类Cookie
  3. 同意记录与证明:存储用户同意状态,以便审计
  4. 脚本加载控制:根据用户同意状态有条件加载第三方脚本
  5. 自动阻止功能:在获得同意前阻止非必要Cookie
  6. 定期重新同意:根据法规要求定期更新用户同意

2.2 技术架构设计

我们将采用模块化设计,创建以下核心组件:

  1. 主控制器类:协调所有功能模块
  2. 前端展示模块:处理横幅和偏好中心的UI
  3. 同意管理模块:存储和管理用户同意状态
  4. 脚本控制模块:根据同意状态控制第三方脚本加载
  5. 设置管理模块:提供后台配置界面
  6. 小工具集成模块:扩展常用互联网工具功能

2.3 数据库设计

我们需要创建数据库表来存储:

  • 用户同意记录
  • Cookie分类和描述
  • 第三方服务配置
  • 同意历史记录

第三部分:环境准备与基础设置

3.1 开发环境搭建

在开始编码前,请确保您已准备好:

  1. 本地WordPress开发环境:可以使用Local by Flywheel、XAMPP或Docker
  2. 代码编辑器:推荐VS Code、PHPStorm或Sublime Text
  3. 浏览器开发者工具:用于调试前端代码
  4. Git版本控制系统:管理代码变更

3.2 创建WordPress插件

我们将创建一个独立的WordPress插件来实现所有功能:

<?php
/**
 * Plugin Name: Advanced Cookie Consent Manager
 * Plugin URI: https://yourwebsite.com/
 * Description: 完整的Cookie合规性与隐私同意管理解决方案
 * Version: 1.0.0
 * Author: Your Name
 * License: GPL v2 or later
 * Text Domain: advanced-cookie-consent
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('ACCM_VERSION', '1.0.0');
define('ACCM_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('ACCM_PLUGIN_URL', plugin_dir_url(__FILE__));
define('ACCM_PLUGIN_BASENAME', plugin_basename(__FILE__));

3.3 插件目录结构

创建以下目录结构:

advanced-cookie-consent/
├── includes/
│   ├── class-main-controller.php
│   ├── class-frontend-ui.php
│   ├── class-consent-manager.php
│   ├── class-script-controller.php
│   ├── class-settings-manager.php
│   └── class-widget-integration.php
├── assets/
│   ├── css/
│   │   ├── frontend.css
│   │   └── admin.css
│   ├── js/
│   │   ├── frontend.js
│   │   └── admin.js
│   └── images/
├── languages/
├── templates/
│   ├── cookie-banner.php
│   └── preference-center.php
└── advanced-cookie-consent.php

第四部分:核心功能实现

4.1 主控制器类实现

<?php
// includes/class-main-controller.php

class ACCM_Main_Controller {
    
    private static $instance = null;
    private $frontend_ui;
    private $consent_manager;
    private $script_controller;
    private $settings_manager;
    private $widget_integration;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        $this->load_dependencies();
        $this->init_hooks();
    }
    
    private function load_dependencies() {
        require_once ACCM_PLUGIN_DIR . 'includes/class-frontend-ui.php';
        require_once ACCM_PLUGIN_DIR . 'includes/class-consent-manager.php';
        require_once ACCM_PLUGIN_DIR . 'includes/class-script-controller.php';
        require_once ACCM_PLUGIN_DIR . 'includes/class-settings-manager.php';
        require_once ACCM_PLUGIN_DIR . 'includes/class-widget-integration.php';
        
        $this->frontend_ui = new ACCM_Frontend_UI();
        $this->consent_manager = new ACCM_Consent_Manager();
        $this->script_controller = new ACCM_Script_Controller();
        $this->settings_manager = new ACCM_Settings_Manager();
        $this->widget_integration = new ACCM_Widget_Integration();
    }
    
    private function init_hooks() {
        // 激活/停用插件钩子
        register_activation_hook(__FILE__, array($this, 'activate_plugin'));
        register_deactivation_hook(__FILE__, array($this, 'deactivate_plugin'));
        
        // 初始化钩子
        add_action('init', array($this, 'init'));
        
        // 管理界面钩子
        add_action('admin_menu', array($this->settings_manager, 'add_admin_menu'));
        add_action('admin_init', array($this->settings_manager, 'register_settings'));
        
        // 前端钩子
        add_action('wp_enqueue_scripts', array($this->frontend_ui, 'enqueue_assets'));
        add_action('wp_footer', array($this->frontend_ui, 'render_cookie_banner'));
        
        // 脚本控制钩子
        add_action('wp_head', array($this->script_controller, 'add_script_control_scripts'), 1);
    }
    
    public function init() {
        // 加载文本域
        load_plugin_textdomain('advanced-cookie-consent', false, dirname(ACCM_PLUGIN_BASENAME) . '/languages');
        
        // 初始化组件
        $this->consent_manager->init();
        $this->widget_integration->init();
    }
    
    public function activate_plugin() {
        // 创建数据库表
        $this->consent_manager->create_tables();
        
        // 设置默认选项
        $this->settings_manager->set_default_options();
        
        // 刷新重写规则
        flush_rewrite_rules();
    }
    
    public function deactivate_plugin() {
        // 清理临时数据
        flush_rewrite_rules();
    }
}

4.2 前端UI与Cookie横幅实现

<?php
// includes/class-frontend-ui.php

class ACCM_Frontend_UI {
    
    private $consent_manager;
    
    public function __construct() {
        $this->consent_manager = ACCM_Consent_Manager::get_instance();
    }
    
    public function enqueue_assets() {
        // 前端样式
        wp_enqueue_style(
            'accm-frontend-style',
            ACCM_PLUGIN_URL . 'assets/css/frontend.css',
            array(),
            ACCM_VERSION
        );
        
        // 前端脚本
        wp_enqueue_script(
            'accm-frontend-script',
            ACCM_PLUGIN_URL . 'assets/js/frontend.js',
            array('jquery'),
            ACCM_VERSION,
            true
        );
        
        // 本地化脚本
        wp_localize_script('accm-frontend-script', 'accm_ajax', array(
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('accm_nonce'),
            'consent_categories' => $this->consent_manager->get_cookie_categories(),
            'strings' => array(
                'saving' => __('保存中...', 'advanced-cookie-consent'),
                'saved' => __('设置已保存', 'advanced-cookie-consent'),
                'error' => __('保存时出错,请重试', 'advanced-cookie-consent')
            )
        ));
    }
    
    public function render_cookie_banner() {
        // 检查是否已获得同意
        if ($this->consent_manager->has_consent()) {
            return;
        }
        
        // 获取设置
        $settings = get_option('accm_settings', array());
        
        // 包含横幅模板
        include ACCM_PLUGIN_DIR . 'templates/cookie-banner.php';
    }
    
    public function render_preference_center() {
        // 获取Cookie分类
        $categories = $this->consent_manager->get_cookie_categories();
        
        // 获取用户当前偏好
        $user_preferences = $this->consent_manager->get_user_preferences();
        
        // 包含偏好中心模板
        include ACCM_PLUGIN_DIR . 'templates/preference-center.php';
    }
}

4.3 Cookie横幅模板

<?php
// templates/cookie-banner.php

$settings = get_option('accm_settings', array());
$banner_title = isset($settings['banner_title']) ? $settings['banner_title'] : __('Cookie设置', 'advanced-cookie-consent');
$banner_text = isset($settings['banner_text']) ? $settings['banner_text'] : __('我们使用Cookie来提升您的浏览体验,提供个性化内容并分析流量。点击"接受"即表示您同意我们使用所有Cookie。', 'advanced-cookie-consent');
$accept_text = isset($settings['accept_text']) ? $settings['accept_text'] : __('接受所有', 'advanced-cookie-consent');
$reject_text = isset($settings['reject_text']) ? $settings['reject_text'] : __('拒绝非必要', 'advanced-cookie-consent');
$preferences_text = isset($settings['preferences_text']) ? $settings['preferences_text'] : __('自定义设置', 'advanced-cookie-consent');
$privacy_policy_url = isset($settings['privacy_policy_url']) ? $settings['privacy_policy_url'] : get_privacy_policy_url();
$privacy_policy_text = isset($settings['privacy_policy_text']) ? $settings['privacy_policy_text'] : __('隐私政策', 'advanced-cookie-consent');
?>

<div id="accm-cookie-banner" class="accm-cookie-banner" style="display: none;">
    <div class="accm-banner-content">
        <div class="accm-banner-text">
            <h3><?php echo esc_html($banner_title); ?></h3>
            <p><?php echo esc_html($banner_text); ?></p>
            <?php if ($privacy_policy_url): ?>
                <p class="accm-privacy-link">
                    <a href="<?php echo esc_url($privacy_policy_url); ?>" target="_blank">
                        <?php echo esc_html($privacy_policy_text); ?>
                    </a>
                </p>
            <?php endif; ?>
        </div>
        <div class="accm-banner-buttons">
            <button type="button" class="accm-btn accm-btn-preferences">
                <?php echo esc_html($preferences_text); ?>
            </button>
            <button type="button" class="accm-btn accm-btn-reject">
                <?php echo esc_html($reject_text); ?>
            </button>
            <button type="button" class="accm-btn accm-btn-accept accm-btn-primary">
                <?php echo esc_html($accept_text); ?>
            </button>
        </div>
    </div>
</div>

<div id="accm-preference-modal" class="accm-modal" style="display: none;">
    <div class="accm-modal-content">
        <div class="accm-modal-header">
            <h3><?php _e('Cookie偏好设置', 'advanced-cookie-consent'); ?></h3>
            <button type="button" class="accm-modal-close">&times;</button>
        </div>
        <div class="accm-modal-body">
            <?php $this->render_preference_center(); ?>
        </div>
        <div class="accm-modal-footer">
            <button type="button" class="accm-btn accm-btn-save-preferences accm-btn-primary">
                <?php _e('保存设置', 'advanced-cookie-consent'); ?>
            </button>
        </div>
    </div>
</div>

4.4 同意管理模块

<?php
// includes/class-consent-manager.php

class ACCM_Consent_Manager {
    
    private static $instance = null;
    private $cookie_name = 'accm_consent';
    private $cookie_expiry = 365; // 天数
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function init() {
        // 处理AJAX请求
        add_action('wp_ajax_accm_save_consent', array($this, 'ajax_save_consent'));
        add_action('wp_ajax_nopriv_accm_save_consent', array($this, 'ajax_save_consent'));
        
        // 检查并处理Cookie同意
        $this->check_consent_cookie();
    }
    
    public function create_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        $table_name = $wpdb->prefix . 'accm_consent_logs';
        
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            consent_id varchar(32) NOT NULL,
            user_id bigint(20) DEFAULT 0,
            user_ip varchar(45) DEFAULT '',
            user_agent text,
            consent_data text NOT NULL,
            consent_date datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            KEY consent_id (consent_id),
            KEY user_id (user_id),
            KEY consent_date (consent_date)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
    
    public function get_cookie_categories() {
        $default_categories = array(
            'necessary' => array(
                'name' => __('必要', 'advanced-cookie-consent'),
                'description' => __('这些Cookie对于网站的基本功能是必需的,无法关闭。', 'advanced-cookie-consent'),
                'required' => true,
                'default' => true
            ),
            'preferences' => array(
                'name' => __('偏好设置', 'advanced-cookie-consent'),
                'description' => __('这些Cookie允许网站记住您的选择和偏好。', 'advanced-cookie-consent'),
                'required' => false,
                'default' => true
            ),
            'analytics' => array(
                'name' => __('统计分析', 'advanced-cookie-consent'),
                'description' => __('这些Cookie帮助我们了解访问者如何与网站互动。', 'advanced-cookie-consent'),
                'required' => false,
                'default' => true
            ),
            'marketing' => array(
                'name' => __('营销', 'advanced-cookie-consent'),
                'description' => __('这些Cookie用于跟踪广告效果和个性化广告。', 'advanced-cookie-consent'),
                'required' => false,
                'default' => false
            )
        );
        
        // 允许通过过滤器添加或修改分类
        return apply_filters('accm_cookie_categories', $default_categories);
    }
    
    public function has_consent($category = '') {
        $consent_data = $this->get_consent_data();
        
        if (empty($consent_data)) {
            return false;
        }
        
        if (empty($category)) {
            return !empty($consent_data);
        }
        
        $categories = $this->get_cookie_categories();
        
        if (!isset($categories[$category])) {
            return false;
        }
        
        // 必要Cookie始终视为已同意

手把手教程:在WordPress中集成网站Cookie合规性管理与用户隐私同意控件(续)

第四部分:核心功能实现(续)

4.4 同意管理模块(续)

<?php
// includes/class-consent-manager.php(续)

        if ($categories[$category]['required']) {
            return true;
        }
        
        return isset($consent_data[$category]) && $consent_data[$category] === true;
    }
    
    private function get_consent_data() {
        static $consent_data = null;
        
        if ($consent_data !== null) {
            return $consent_data;
        }
        
        // 首先检查Cookie
        if (isset($_COOKIE[$this->cookie_name])) {
            $cookie_data = json_decode(stripslashes($_COOKIE[$this->cookie_name]), true);
            if (is_array($cookie_data)) {
                $consent_data = $cookie_data;
                return $consent_data;
            }
        }
        
        // 如果没有Cookie,检查默认设置
        $settings = get_option('accm_settings', array());
        $default_consent = isset($settings['default_consent']) ? $settings['default_consent'] : 'none';
        
        if ($default_consent === 'all') {
            $categories = $this->get_cookie_categories();
            $consent_data = array();
            foreach ($categories as $key => $category) {
                $consent_data[$key] = true;
            }
        } else {
            $consent_data = array();
        }
        
        return $consent_data;
    }
    
    public function get_user_preferences() {
        $consent_data = $this->get_consent_data();
        $categories = $this->get_cookie_categories();
        
        $preferences = array();
        foreach ($categories as $key => $category) {
            $preferences[$key] = array(
                'name' => $category['name'],
                'description' => $category['description'],
                'required' => $category['required'],
                'enabled' => $this->has_consent($key)
            );
        }
        
        return $preferences;
    }
    
    public function ajax_save_consent() {
        // 验证nonce
        if (!check_ajax_referer('accm_nonce', 'nonce', false)) {
            wp_die(json_encode(array(
                'success' => false,
                'message' => __('安全验证失败', 'advanced-cookie-consent')
            )));
        }
        
        // 获取并验证数据
        $consent_data = isset($_POST['consent_data']) ? $_POST['consent_data'] : array();
        
        if (!is_array($consent_data)) {
            wp_die(json_encode(array(
                'success' => false,
                'message' => __('无效的数据格式', 'advanced-cookie-consent')
            )));
        }
        
        // 验证分类
        $categories = $this->get_cookie_categories();
        $validated_data = array();
        
        foreach ($categories as $key => $category) {
            if ($category['required']) {
                $validated_data[$key] = true;
            } else {
                $validated_data[$key] = isset($consent_data[$key]) && $consent_data[$key] === 'true';
            }
        }
        
        // 生成唯一ID
        $consent_id = wp_generate_uuid4();
        
        // 记录同意
        $this->log_consent($consent_id, $validated_data);
        
        // 设置Cookie
        $this->set_consent_cookie($consent_id, $validated_data);
        
        // 返回成功响应
        wp_die(json_encode(array(
            'success' => true,
            'message' => __('设置已保存', 'advanced-cookie-consent'),
            'consent_id' => $consent_id
        )));
    }
    
    private function log_consent($consent_id, $consent_data) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'accm_consent_logs';
        
        $user_id = get_current_user_id();
        $user_ip = $this->get_user_ip();
        $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
        
        $wpdb->insert(
            $table_name,
            array(
                'consent_id' => $consent_id,
                'user_id' => $user_id,
                'user_ip' => $user_ip,
                'user_agent' => $user_agent,
                'consent_data' => json_encode($consent_data)
            ),
            array('%s', '%d', '%s', '%s', '%s')
        );
    }
    
    private function set_consent_cookie($consent_id, $consent_data) {
        $cookie_data = array(
            'consent_id' => $consent_id,
            'categories' => $consent_data,
            'timestamp' => time()
        );
        
        $cookie_value = json_encode($cookie_data);
        
        // 设置Cookie
        setcookie(
            $this->cookie_name,
            $cookie_value,
            time() + ($this->cookie_expiry * DAY_IN_SECONDS),
            COOKIEPATH,
            COOKIE_DOMAIN,
            is_ssl(),
            true // HttpOnly
        );
        
        // 立即在本次请求中可用
        $_COOKIE[$this->cookie_name] = $cookie_value;
    }
    
    private function get_user_ip() {
        $ip = '';
        
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        
        return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : '';
    }
    
    private function check_consent_cookie() {
        // 检查Cookie是否需要更新
        if (isset($_COOKIE[$this->cookie_name])) {
            $cookie_data = json_decode(stripslashes($_COOKIE[$this->cookie_name]), true);
            
            if (is_array($cookie_data) && isset($cookie_data['timestamp'])) {
                $cookie_age = time() - $cookie_data['timestamp'];
                $renewal_period = 365 * DAY_IN_SECONDS; // 一年后重新请求同意
                
                if ($cookie_age > $renewal_period) {
                    // 删除旧Cookie,强制重新同意
                    setcookie(
                        $this->cookie_name,
                        '',
                        time() - 3600,
                        COOKIEPATH,
                        COOKIE_DOMAIN,
                        is_ssl(),
                        true
                    );
                    unset($_COOKIE[$this->cookie_name]);
                }
            }
        }
    }
}

4.5 脚本控制模块

<?php
// includes/class-script-controller.php

class ACCM_Script_Controller {
    
    private $consent_manager;
    private $blocked_scripts = array();
    
    public function __construct() {
        $this->consent_manager = ACCM_Consent_Manager::get_instance();
        
        // 注册脚本控制钩子
        add_action('wp_head', array($this, 'add_script_control_scripts'), 1);
        add_filter('script_loader_tag', array($this, 'filter_script_tags'), 10, 3);
        add_action('wp_footer', array($this, 'load_blocked_scripts'), 99);
    }
    
    public function add_script_control_scripts() {
        // 添加脚本控制逻辑
        ?>
        <script type="text/javascript">
        window.accmScriptControl = {
            categories: <?php echo json_encode($this->consent_manager->get_cookie_categories()); ?>,
            hasConsent: function(category) {
                var consentData = this.getConsentData();
                if (!consentData) return false;
                
                // 必要脚本始终允许
                if (this.categories[category] && this.categories[category].required) {
                    return true;
                }
                
                return consentData.categories && consentData.categories[category] === true;
            },
            getConsentData: function() {
                try {
                    var cookieValue = document.cookie
                        .split('; ')
                        .find(row => row.startsWith('accm_consent='));
                    
                    if (cookieValue) {
                        return JSON.parse(decodeURIComponent(cookieValue.split('=')[1]));
                    }
                } catch(e) {
                    console.error('Error parsing consent cookie:', e);
                }
                return null;
            },
            loadScript: function(src, category, attributes) {
                if (!this.hasConsent(category)) {
                    console.log('Script blocked due to missing consent:', src, 'Category:', category);
                    return false;
                }
                
                var script = document.createElement('script');
                script.src = src;
                
                if (attributes) {
                    for (var attr in attributes) {
                        if (attributes.hasOwnProperty(attr)) {
                            script.setAttribute(attr, attributes[attr]);
                        }
                    }
                }
                
                document.head.appendChild(script);
                return true;
            }
        };
        
        // 重写window.dataLayer.push以延迟Google Tag Manager
        if (typeof window.dataLayer === 'undefined') {
            window.dataLayer = [];
        }
        
        var originalDataLayerPush = window.dataLayer.push;
        window.dataLayer.push = function() {
            if (!accmScriptControl.hasConsent('analytics') && !accmScriptControl.hasConsent('marketing')) {
                console.log('GTM event blocked due to missing consent');
                return;
            }
            return originalDataLayerPush.apply(this, arguments);
        };
        </script>
        <?php
    }
    
    public function filter_script_tags($tag, $handle, $src) {
        // 获取脚本的Cookie类别
        $script_categories = $this->get_script_categories($handle);
        
        if (empty($script_categories)) {
            return $tag;
        }
        
        // 检查是否所有需要的类别都有同意
        $block_script = false;
        foreach ($script_categories as $category) {
            if (!$this->consent_manager->has_consent($category)) {
                $block_script = true;
                break;
            }
        }
        
        if ($block_script) {
            // 存储被阻止的脚本以便稍后加载
            $this->blocked_scripts[] = array(
                'tag' => $tag,
                'handle' => $handle,
                'src' => $src,
                'categories' => $script_categories
            );
            
            // 返回占位符或空字符串
            return "<!-- Script '$handle' blocked due to missing cookie consent -->n";
        }
        
        return $tag;
    }
    
    private function get_script_categories($handle) {
        $script_categories = array(
            'google-analytics' => array('analytics'),
            'gtm4wp' => array('analytics', 'marketing'),
            'facebook-pixel' => array('marketing'),
            'twitter-widgets' => array('marketing', 'preferences'),
            'youtube-embed' => array('preferences'),
            'vimeo-embed' => array('preferences'),
            'google-maps' => array('preferences')
        );
        
        // 允许通过过滤器添加或修改
        $script_categories = apply_filters('accm_script_categories', $script_categories);
        
        return isset($script_categories[$handle]) ? $script_categories[$handle] : array();
    }
    
    public function load_blocked_scripts() {
        if (empty($this->blocked_scripts)) {
            return;
        }
        
        ?>
        <script type="text/javascript">
        document.addEventListener('DOMContentLoaded', function() {
            var blockedScripts = <?php echo json_encode($this->blocked_scripts); ?>;
            
            blockedScripts.forEach(function(scriptInfo) {
                var shouldLoad = true;
                
                scriptInfo.categories.forEach(function(category) {
                    if (!accmScriptControl.hasConsent(category)) {
                        shouldLoad = false;
                    }
                });
                
                if (shouldLoad) {
                    // 创建并插入脚本
                    var script = document.createElement('script');
                    script.src = scriptInfo.src;
                    
                    // 复制原始属性
                    var regex = /(w+)=["']([^"']*)["']/g;
                    var match;
                    while ((match = regex.exec(scriptInfo.tag)) !== null) {
                        if (match[1] !== 'src') {
                            script.setAttribute(match[1], match[2]);
                        }
                    }
                    
                    document.head.appendChild(script);
                    console.log('Previously blocked script loaded:', scriptInfo.handle);
                }
            });
        });
        </script>
        <?php
    }
    
    public function add_third_party_service($service_name, $script_code, $categories) {
        add_action('wp_footer', function() use ($service_name, $script_code, $categories) {
            $can_load = true;
            
            foreach ($categories as $category) {
                if (!$this->consent_manager->has_consent($category)) {
                    $can_load = false;
                    break;
                }
            }
            
            if ($can_load) {
                echo $script_code;
            } else {
                // 存储以便稍后加载
                $this->blocked_scripts[] = array(
                    'tag' => $script_code,
                    'handle' => $service_name,
                    'categories' => $categories
                );
            }
        }, 10);
    }
}

4.6 设置管理模块

<?php
// includes/class-settings-manager.php

class ACCM_Settings_Manager {
    
    private $settings_page;
    private $settings_group = 'accm_settings_group';
    private $settings_section = 'accm_settings_section';
    private $option_name = 'accm_settings';
    
    public function add_admin_menu() {
        $this->settings_page = add_options_page(
            __('Cookie同意设置', 'advanced-cookie-consent'),
            __('Cookie同意', 'advanced-cookie-consent'),
            'manage_options',
            'advanced-cookie-consent',
            array($this, 'render_settings_page')
        );
        
        // 添加设置页面样式和脚本
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
    }
    
    public function enqueue_admin_assets($hook) {
        if ($hook !== $this->settings_page) {
            return;
        }
        
        wp_enqueue_style(
            'accm-admin-style',
            ACCM_PLUGIN_URL . 'assets/css/admin.css',
            array(),
            ACCM_VERSION
        );
        
        wp_enqueue_script(
            'accm-admin-script',
            ACCM_PLUGIN_URL . 'assets/js/admin.js',
            array('jquery', 'wp-color-picker'),
            ACCM_VERSION,
            true
        );
        
        // 启用颜色选择器
        wp_enqueue_style('wp-color-picker');
    }
    
    public function register_settings() {
        register_setting(
            $this->settings_group,
            $this->option_name,
            array($this, 'sanitize_settings')
        );
        
        add_settings_section(
            $this->settings_section,
            __('基本设置', 'advanced-cookie-consent'),
            array($this, 'render_section_header'),
            'advanced-cookie-consent'
        );
        
        // 添加设置字段
        $this->add_settings_fields();
    }
    
    private function add_settings_fields() {
        $fields = array(
            array(
                'id' => 'banner_title',
                'title' => __('横幅标题', 'advanced-cookie-consent'),
                'callback' => 'render_text_field',
                'args' => array(
                    'description' => __('Cookie横幅的标题', 'advanced-cookie-consent'),
                    'default' => __('Cookie设置', 'advanced-cookie-consent')
                )
            ),
            array(
                'id' => 'banner_text',
                'title' => __('横幅文本', 'advanced-cookie-consent'),
                'callback' => 'render_textarea_field',
                'args' => array(
                    'description' => __('Cookie横幅的主要说明文本', 'advanced-cookie-consent'),
                    'default' => __('我们使用Cookie来提升您的浏览体验,提供个性化内容并分析流量。点击"接受"即表示您同意我们使用所有Cookie。', 'advanced-cookie-consent'),
                    'rows' => 4
                )
            ),
            array(
                'id' => 'banner_position',
                'title' => __('横幅位置', 'advanced-cookie-consent'),
                'callback' => 'render_select_field',
                'args' => array(
                    'description' => __('选择Cookie横幅的显示位置', 'advanced-cookie-consent'),
                    'options' => array(
                        'bottom' => __('底部', 'advanced-cookie-consent'),
                        'top' => __('顶部', 'advanced-cookie-consent'),
                        'bottom-left' => __('左下角', 'advanced-cookie-consent'),
                        'bottom-right' => __('右下角', 'advanced-cookie-consent')
                    ),
                    'default' => 'bottom'
                )
            ),
            array(
                'id' => 'banner_style',
                'title' => __('横幅样式', 'advanced-cookie-consent'),
                'callback' => 'render_select_field',
                'args' => array(
                    'description' => __('选择Cookie横幅的视觉样式', 'advanced-cookie-consent'),
                    'options' => array(
                        'light' => __('浅色', 'advanced-cookie-consent'),
                        'dark' => __('深色', 'advanced-cookie-consent'),
                        'minimal' => __('极简', 'advanced-cookie-consent')
                    ),
                    'default' => 'light'
                )
            ),
            array(
                'id' => 'primary_color',
                'title' => __('主色调', 'advanced-cookie-consent'),
                'callback' => 'render_color_field',
                'args' => array(
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5306.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部