Files
att-consent/includes/class-att-consent.php
Steve Hanlon 4adda0ded7 Add consent reopener: floating widget + anchor link trigger
Allow visitors to reopen the cookie preferences modal after making
their choice via a configurable floating button (bottom-right or
right-side vertical) or any anchor link with href="#att-cc-preferences".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 06:13:55 +00:00

182 lines
4.6 KiB
PHP

<?php
/**
* Main plugin class.
*
* @package ATT_Consent
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class ATT_Consent {
/**
* Singleton instance.
*
* @var ATT_Consent|null
*/
private static $instance = null;
/**
* Default settings.
*
* @var array
*/
private static $defaults = array(
// General.
'tracking_mode' => 'gtag',
'ga4_measurement_id' => '',
'gtm_container_id' => '',
'consent_mode' => 'advanced',
'banner_position' => 'bottom',
'consent_expiry' => 365,
'floating_widget' => 'bottom-right',
'floating_widget_label' => 'Cookie Settings',
// Appearance.
'banner_bg_color' => '#1a1a2e',
'banner_text_color' => '#ffffff',
'btn_accept_bg' => '#4CAF50',
'btn_accept_text' => '#ffffff',
'btn_reject_bg' => '#555555',
'btn_reject_text' => '#ffffff',
'btn_preferences_bg' => 'transparent',
'btn_preferences_text' => '#ffffff',
// Text / Labels.
'banner_heading' => 'We value your privacy',
'banner_message' => 'We use cookies to enhance your browsing experience, serve personalised content, and analyse our traffic. By clicking "Accept All", you consent to our use of cookies.',
'btn_accept_label' => 'Accept All',
'btn_reject_label' => 'Reject All',
'btn_preferences_label' => 'Manage Preferences',
'btn_save_label' => 'Save Preferences',
// Category descriptions.
'cat_necessary_desc' => 'These cookies are essential for the website to function and cannot be switched off.',
'cat_functional_desc' => 'These cookies enable personalised features and functionality.',
'cat_analytics_desc' => 'These cookies help us understand how visitors interact with our website.',
'cat_marketing_desc' => 'These cookies are used to deliver advertisements relevant to you.',
// Advanced.
'url_passthrough' => true,
'ads_data_redaction' => true,
'wait_for_update' => 500,
);
/**
* Get singleton instance.
*
* @return ATT_Consent
*/
public static function get_instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor.
*/
private function __construct() {
add_action( 'init', array( $this, 'load_textdomain' ) );
$this->load_dependencies();
}
/**
* Load plugin text domain.
*/
public function load_textdomain() {
load_plugin_textdomain( 'att-consent', false, dirname( ATT_CC_PLUGIN_BASENAME ) . '/languages' );
}
/**
* Load required files.
*/
private function load_dependencies() {
require_once ATT_CC_PLUGIN_DIR . 'includes/class-scripts-manager.php';
require_once ATT_CC_PLUGIN_DIR . 'includes/class-consent-api.php';
if ( is_admin() ) {
require_once ATT_CC_PLUGIN_DIR . 'includes/class-admin.php';
new ATT_Consent_Admin();
}
if ( ! is_admin() || wp_doing_ajax() ) {
require_once ATT_CC_PLUGIN_DIR . 'includes/class-frontend.php';
new ATT_Consent_Frontend();
}
new ATT_Consent_API();
}
/**
* Plugin activation.
*/
public static function activate() {
self::create_scripts_table();
// Set defaults if no settings exist yet.
if ( false === get_option( 'att_consent_settings' ) ) {
update_option( 'att_consent_settings', self::$defaults );
}
}
/**
* Plugin deactivation.
*/
public static function deactivate() {
// No-op. Cleanup happens in uninstall.php.
}
/**
* Create the custom scripts table.
*/
private static function create_scripts_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'att_cc_scripts';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(200) NOT NULL DEFAULT '',
snippet longtext NOT NULL,
category varchar(50) NOT NULL DEFAULT 'analytics',
placement varchar(20) NOT NULL DEFAULT 'head',
status varchar(20) NOT NULL DEFAULT 'active',
priority int(11) NOT NULL DEFAULT 10,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY category (category),
KEY status (status)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
update_option( 'att_cc_db_version', ATT_CC_VERSION );
}
/**
* Get plugin settings merged with defaults.
*
* @return array
*/
public static function get_settings() {
$settings = get_option( 'att_consent_settings', array() );
return wp_parse_args( $settings, self::$defaults );
}
/**
* Get default settings.
*
* @return array
*/
public static function get_defaults() {
return self::$defaults;
}
}