Connect::is_connected(), 'isUrlMismatch' => ! Connect::get_connect()->utils()->is_valid_home_url(), 'wpRestNonce' => wp_create_nonce( 'wp_rest' ), 'restRoot' => rest_url(), 'pluginEnv' => self::get_plugin_env(), 'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, 'appSlug' => Config::PLUGIN_SLUG, 'appVersion' => COOKIEZ_VERSION, 'wpVersion' => get_bloginfo( 'version' ), 'isRTL' => is_rtl(), 'dateFormat' => get_option( 'date_format', 'F j, Y' ), 'timeFormat' => get_option( 'time_format', 'g:i a' ), 'translations' => Utils::get_translations(), 'isElementorOne' => self::is_elementor_one(), 'hasElementorOneSubscription' => self::has_elementor_one_subscription(), 'settings' => Settings::get( Settings::COOKIEZ_SETTINGS ), 'maxmindLicenseKey' => Maxmind_Settings::masked(), 'content' => Settings::get( Settings::COOKIEZ_CONTENT ), 'planData' => get_option( Settings::PLAN_DATA ), 'planScope' => get_option( Settings::PLAN_SCOPE ), 'isElementorActive' => defined( 'ELEMENTOR_VERSION' ), 'isElementorProActive' => defined( 'ELEMENTOR_PRO_VERSION' ), 'integrations' => [ 'wpConsentApiActive' => Integration_Detect::is_wp_consent_api_active(), 'siteKitActive' => Integration_Detect::is_site_kit_active(), 'siteKitConsentMode' => Integration_Detect::is_site_kit_consent_mode_enabled(), 'delegateGcmToSiteKit' => Integration_Detect::should_delegate_gcm_to_site_kit(), 'wpConsentApiInstallUrl' => admin_url( 'plugin-install.php?s=wp-consent-api&tab=search&type=term' ), 'wpConsentApiLearnMoreUrl' => self::WP_CONSENT_API_LEARN_MORE_URL, ], ]; $settings_data = apply_filters( 'cookiez/settings/data', $settings_data ); wp_localize_script( 'settings', 'cookiezSettingsData', $settings_data ); } /** * Check if cookie consent is connected to elementor one * @return bool */ public static function is_elementor_one(): bool { return Connect::get_connect()->get_config( 'app_type' ) !== Config::APP_TYPE; } /** * Check if user generally has an active Elementor One subscription, * @return bool */ public static function has_elementor_one_subscription(): bool { $one_facade = \ElementorOne\Admin\Helpers\Utils::get_one_connect(); return $one_facade && $one_facade->utils()->is_connected(); } /** * Get all plugin settings data * @return array * @throws Throwable */ public static function get_plugin_settings(): array { $content = Settings::get( Settings::COOKIEZ_CONTENT ); return array_merge( [ 'isDevelopment' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, 'siteUrl' => wp_parse_url( get_site_url(), PHP_URL_HOST ), 'settings' => Settings::get( Settings::COOKIEZ_SETTINGS ), 'maxmindLicenseKey' => Maxmind_Settings::masked(), ], is_array( $content ) ? $content : [] ); } public static function routes_list(): array { return [ 'Get_Settings', 'Update_Settings', 'Get_Consent_Logs', 'Export_Consent_Logs', ]; } /** * @throws Exception */ public function on_connect(): void { if ( ! Connect::is_connected() ) { return; } self::register_site_with_data(); } /** * Fetch and save plan data on Elementor One app_cookie connection. * @return void */ public function on_app_cookie_connected(): void { if ( ! Connect::is_connected() ) { return; } $plan_data = get_option( Settings::PLAN_DATA ); $response = Utils::get_api_client()->make_request( 'POST', 'sites/info' ); self::save_plan_data( $response ); } /** * On disconnect * @return void */ public function on_disconnect() { delete_option( Settings::SUBSCRIPTION_ID ); } /** * Register or update site data for One connect * @throws Exception */ public function on_migration_run() { if ( ! Connect::is_connected() ) { return; } $client_id = Settings::get( Settings::CLIENT_ID ); if ( $client_id ) { try { $migration_response = Utils::get_api_client()->make_request( 'POST', 'site/migration', [ 'old_client_id' => $client_id ], ); self::save_plan_data( $migration_response ); $old_options = [ 'cookiez_client_secret', 'cookiez_home_url', 'cookiez_access_token', 'cookiez_token_id', 'cookiez_refresh_token', 'cookiez_user_access_token', 'cookiez_owner_user_id', Settings::SUBSCRIPTION_ID, Settings::CLIENT_ID, ]; foreach ( $old_options as $option ) { delete_option( $option ); } } catch ( Throwable $t ) { Logger::error( esc_html( $t->getMessage() ) ); } } else { $this->on_connect(); } } /** * Register the website and save the plan data. * @return void */ public static function register_site_with_data(): void { $register_response = Utils::get_api_client()->make_request( 'POST', 'site/register' ); if ( is_wp_error( $register_response ) ) { Logger::error( esc_html( $register_response->get_error_message() ) ); } else { self::save_plan_data( $register_response ); if ( isset( $register_response->scopes ) ) { Settings::set( Settings::PLAN_SCOPE, $register_response->scopes ); } } } /** * Refresh the plan data if the refresh transient has expired. * @return void */ public static function refresh_plan_data(): void { if ( ! Connect::is_connected() ) { return; } if ( self::get_plan_data_refresh_transient() ) { return; } $plan_data = get_option( Settings::PLAN_DATA ); if ( empty( $plan_data->public_api_key ) ) { Logger::error( 'Cannot refresh the plan data. No public API key found.' ); self::register_site_with_data(); return; } $response = Utils::get_api_client()->make_request( 'POST', 'site/info' ); self::save_plan_data( $response ); } public static function set_plan_data_refresh_transient(): void { set_transient( Settings::PLAN_DATA_REFRESH_TRANSIENT, true, MINUTE_IN_SECONDS * 15 ); } public static function get_plan_data_refresh_transient(): bool { return get_transient( Settings::PLAN_DATA_REFRESH_TRANSIENT ); } public static function delete_plan_data_refresh_transient(): bool { return delete_transient( Settings::PLAN_DATA_REFRESH_TRANSIENT ); } /** * Save plan data to plan_data option * @param $register_response * * @return void */ public static function save_plan_data( $register_response ): void { if ( $register_response && ! is_wp_error( $register_response ) ) { $decoded_response = $register_response; update_option( Settings::SUBSCRIPTION_ID, $decoded_response->plan->subscription_id ); update_option( Settings::PLAN_DATA, $decoded_response ); update_option( Settings::IS_VALID_PLAN_DATA, true ); self::set_plan_data_refresh_transient(); } else { Logger::error( $register_response instanceof WP_Error ? esc_html( $register_response->get_error_message() ) : $register_response ); update_option( Settings::IS_VALID_PLAN_DATA, false ); } } /** * Get upgrade link with UTM parameters * * @param string $campaign Campaign identifier for tracking. * @return string */ public static function get_upgrade_link( string $campaign ): string { $subscription_id = get_option( Settings::SUBSCRIPTION_ID ); if ( $subscription_id ) { return add_query_arg( [ 'utm_source' => $campaign . '-upgrade', 'utm_medium' => 'wp-dash', 'subscription_id' => $subscription_id, ], 'https://go.elementor.com/' . $campaign ); } return add_query_arg( [ 'utm_source' => $campaign . '-upgrade', 'utm_medium' => 'wp-dash', ], 'https://go.elementor.com/' . $campaign ); } /** * Cookie consent quota usage percentage (cookie_consents only). * * @return float Percent used (0–100+), or 0 if unavailable. */ public static function get_consent_quota_usage_percent(): float { $plan_data = get_option( Settings::PLAN_DATA ); if ( ! $plan_data || ! isset( $plan_data->quota->cookie_consents ) ) { return 0; } $consents = $plan_data->quota->cookie_consents; if ( ! isset( $consents->allowed, $consents->used ) || $consents->allowed <= 0 ) { return 0; } return round( $consents->used / $consents->allowed * 100, 2 ); } /** * Register quota notices with the notice manager. * * @param Notices $notice_manager The notice manager instance. * @return void */ public function register_notices( Notices $notice_manager ): void { if ( self::is_elementor_one() ) { $this->register_one_notices( $notice_manager ); return; } if ( ! Connect::is_connected() && ! get_option( Settings::PLAN_DATA ) ) { return; } $notices = [ 'Quota_80', 'Quota_100', 'Site_Kit_Wp_Consent_Api', ]; foreach ( $notices as $notice ) { $class_name = 'Cookiez\Modules\Settings\Notices\\' . $notice; $notice_manager->register_notice( new $class_name() ); } } /** * Register quota notices with the notice manager. * * @param Notices $notice_manager The notice manager instance. * @return void */ public function register_one_notices( Notices $notice_manager ): void { if ( ! self::is_elementor_one() ) { return; } $notices = [ 'Site_Kit_Wp_Consent_Api', ]; foreach ( $notices as $notice ) { $class_name = 'Cookiez\Modules\Settings\Notices\\' . $notice; $notice_manager->register_notice( new $class_name() ); } } public function __construct() { $this->register_components(); $this->register_routes(); add_action( 'admin_menu', [ $this, 'register_page' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_action( 'elementor_one/' . Config::APP_PREFIX . '_connected', [ $this, 'on_connect' ] ); add_action( 'elementor_one/' . Config::APP_PREFIX . '_disconnected', [ $this, 'on_disconnect' ] ); add_action( 'elementor_one/' . Config::APP_PREFIX . '_migration_run', [ $this, 'on_migration_run' ] ); add_action( 'elementor_one/' . Config::APP_TYPE . '_connected', [ $this, 'on_app_cookie_connected' ] ); add_action( 'cookiez_register_notices', [ $this, 'register_notices' ] ); } }