* @link https://www.fireplugins.com * @copyright Copyright © 2026 FirePlugins All Rights Reserved * @license GNU GPLv3 or later */ namespace FireBox\Core\UsageTracking; if (!defined('ABSPATH')) { exit; // Exit if accessed directly. } class UsageTracking { private $settings = []; private $pluginData = []; public function __construct() { $this->settings = get_option('firebox_settings', []); $this->pluginData = new PluginData(); } public function getData() { global $wpdb; $theme_data = wp_get_theme(); $database_version = $wpdb->db_version(); $onboarding_status = $this->getOnboardingStatus(); $payload = [ // Generic Data 'url' => home_url(), 'email' => get_option('admin_email'), 'php_version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, 'wp_version' => get_bloginfo('version'), 'database_type' => $this->getDatabaseType($database_version), 'database_driver' => $this->getDatabaseDriver(), 'database_version' => $database_version, 'server_version' => isset($_SERVER['SERVER_SOFTWARE']) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE'])) : '', 'is_debug' => defined('WP_DEBUG') && WP_DEBUG, 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'is_network_activated' => $this->is_active_for_network(), 'is_wpcom' => defined('IS_WPCOM') && IS_WPCOM, 'is_wpcom_vip' => (defined('WPCOM_IS_VIP_ENV') && WPCOM_IS_VIP_ENV) || (function_exists('wpcom_is_vip') && wpcom_is_vip()), 'is_wp_cache' => defined('WP_CACHE') && WP_CACHE, 'sites_count' => $this->get_sites_total(), 'active_plugins' => $this->get_active_plugins(), 'theme_name' => $theme_data->get('Name'), 'theme_version' => $theme_data->get('Version'), 'locale' => get_locale(), 'timezone_offset' => wp_timezone_string(), // FireBox Specific Data 'firebox_version' => FBOX_VERSION, 'firebox_license_key' => get_option('firebox_license_key', ''), 'firebox_license_type' => FBOX_LICENSE_TYPE, 'firebox_license_plan' => FBOX_LICENSE_PLAN, 'firebox_license_status' => get_option('firebox_license_status', ''), 'firebox_onboarding_status' => $onboarding_status, 'firebox_onboarding_completed' => $onboarding_status !== '', 'firebox_onboarding_skipped' => $onboarding_status === \FireBox\Core\Admin\Includes\Onboarding::ONBOARDING_STATUS_SKIPPED, 'firebox_is_pro' => FBOX_LICENSE_TYPE === 'pro', 'firebox_connected_integrations' => $this->getConnectedIntegrations(), 'firebox_views' => $this->pluginData->getViews(), 'firebox_dimensions' => $this->pluginData->getDimensionsData(), 'firebox_campaigns_published' => $this->pluginData->getCampaigns('publish'), 'firebox_campaigns_draft' => $this->pluginData->getCampaigns('draft'), 'firebox_campaigns_trash' => $this->pluginData->getCampaigns('trash'), 'firebox_ttf_draft_sec' => $this->pluginData->getTimeToFirstCampaignDraft(), 'firebox_ttf_publish_sec' => $this->pluginData->getTimeToFirstCampaignPublish(), 'firebox_submissions' => $this->pluginData->getSubmissions(), 'firebox_view_through_revenue' => $this->pluginData->getViewThroughRevenue(), 'firebox_click_through_revenue' => $this->pluginData->getClickThroughRevenue(), 'firebox_classic_campaigns' => $this->pluginData->getTotalsBySetting('mode', 'popup'), 'firebox_mode_slide_in' => $this->pluginData->getTotalsBySetting('mode', 'slide-in'), 'firebox_mode_fullscreen' => $this->pluginData->getTotalsBySetting('mode', 'fullscreen'), 'firebox_mode_stickybar' => $this->pluginData->getTotalsBySetting('mode', 'stickybar'), 'firebox_pageslide_campaigns' => $this->pluginData->getTotalsBySetting('mode', 'pageslide'), 'firebox_mode_floating' => $this->pluginData->getTotalsBySetting('mode', 'floating'), 'firebox_mode_sidebar' => $this->pluginData->getTotalsBySetting('mode', 'sidebar'), 'firebox_embed_campaigns' => $this->pluginData->getTotalsBySetting('mode', 'embed'), 'firebox_campaigns_pageload' => $this->pluginData->getTotalsBySetting('triggermethod', 'pageload'), 'firebox_campaigns_scroll_depth' => $this->pluginData->getTotalsBySetting('triggermethod', 'pageheight'), 'firebox_campaigns_element_visibility' => $this->pluginData->getTotalsBySetting('triggermethod', 'element'), 'firebox_campaigns_exit_intent' => $this->pluginData->getTotalsBySetting('triggermethod', 'userleave'), 'firebox_campaigns_click' => $this->pluginData->getTotalsBySetting('triggermethod', 'onclick'), 'firebox_campaigns_external_link_click' => $this->pluginData->getTotalsBySetting('triggermethod', 'onexternallink'), 'firebox_campaigns_hover' => $this->pluginData->getTotalsBySetting('triggermethod', 'elementHover'), 'firebox_campaigns_adblock_detect' => $this->pluginData->getTotalsBySetting('triggermethod', 'onAdBlockDetect'), 'firebox_campaigns_idle' => $this->pluginData->getTotalsBySetting('triggermethod', 'onIdle'), 'firebox_campaigns_floating_button' => $this->pluginData->getTotalsBySetting('triggermethod', 'floatingbutton'), 'firebox_campaigns_manual' => $this->pluginData->getTotalsBySetting('triggermethod', 'ondemand'), 'firebox_show_frequency_always' => $this->pluginData->getTotalsBySetting('assign_impressions_param_type', 'always'), 'firebox_show_frequency_session' => $this->pluginData->getTotalsBySetting('assign_impressions_param_type', 'session'), 'firebox_show_frequency_day' => $this->pluginData->getTotalsBySetting('assign_impressions_param_type', 'day'), 'firebox_show_frequency_week' => $this->pluginData->getTotalsBySetting('assign_impressions_param_type', 'week'), 'firebox_show_frequency_custom' => $this->pluginData->getTotalsBySetting('assign_impressions_param_type', 'custom'), 'firebox_cookie_never' => $this->pluginData->getTotalsBySetting('assign_cookietype', 'never'), 'firebox_cookie_ever' => $this->pluginData->getTotalsBySetting('assign_cookietype', 'ever'), 'firebox_cookie_session' => $this->pluginData->getTotalsBySetting('assign_cookietype', 'session'), 'firebox_cookie_custom' => $this->pluginData->getTotalsBySetting('assign_cookietype', 'custom'), 'firebox_auto_close' => $this->pluginData->getTotalsBySetting('box_auto_close', 'boolean'), 'firebox_auto_focus' => $this->pluginData->getTotalsBySetting('autofocus', 'boolean'), 'firebox_close_with_esc' => $this->pluginData->getTotalsBySetting('close_on_esc', 'boolean'), 'firebox_display_conditions_all' => $this->pluginData->getTotalsBySetting('display_conditions_type', 'all'), 'firebox_display_conditions_mirror' => $this->pluginData->getTotalsBySetting('display_conditions_type', 'mirror'), 'firebox_display_conditions_custom' => $this->pluginData->getTotalsBySetting('display_conditions_type', 'custom'), 'firebox_campaigns_with_sound' => $this->pluginData->getTotalsBySetting('opening_sound.source', 'cond:not:none'), 'firebox_cond_date' => $this->pluginData->getTotalsByCondition('Date\Date'), 'firebox_cond_day_of_week' => $this->pluginData->getTotalsByCondition('Date\Day'), 'firebox_cond_month' => $this->pluginData->getTotalsByCondition('Date\Month'), 'firebox_cond_time' => $this->pluginData->getTotalsByCondition('Date\Time'), 'firebox_cond_user' => $this->pluginData->getTotalsByCondition('WP\UserID'), 'firebox_cond_menu' => $this->pluginData->getTotalsByCondition('WP\Menu'), 'firebox_cond_user_group' => $this->pluginData->getTotalsByCondition('WP\UserGroup'), 'firebox_cond_post' => $this->pluginData->getTotalsByCondition('WP\Posts'), 'firebox_cond_page' => $this->pluginData->getTotalsByCondition('WP\Pages'), 'firebox_cond_post_tag' => $this->pluginData->getTotalsByCondition('WP\Tags'), 'firebox_cond_post_category' => $this->pluginData->getTotalsByCondition('WP\Categories'), 'firebox_cond_cpt' => $this->pluginData->getTotalsByCondition('WP\CustomPostTypes'), 'firebox_cond_homepage' => $this->pluginData->getTotalsByCondition('WP\Homepage'), 'firebox_cond_device' => $this->pluginData->getTotalsByCondition('Device'), 'firebox_cond_browser' => $this->pluginData->getTotalsByCondition('Browser'), 'firebox_cond_os' => $this->pluginData->getTotalsByCondition('OS'), 'firebox_cond_city' => $this->pluginData->getTotalsByCondition('Geo\City'), 'firebox_cond_country' => $this->pluginData->getTotalsByCondition('Geo\Country'), 'firebox_cond_region' => $this->pluginData->getTotalsByCondition('Geo\Region'), 'firebox_cond_continent' => $this->pluginData->getTotalsByCondition('Geo\Continent'), 'firebox_cond_fb_view_campaign' => $this->pluginData->getTotalsByCondition('FireBox\Popup'), 'firebox_cond_fb_submitted_form' => $this->pluginData->getTotalsByCondition('FireBox\Form'), 'firebox_cond_edd_products_in_cart' => $this->pluginData->getTotalsByCondition('EDD\CartContainsProducts'), 'firebox_cond_edd_cart_items_count' => $this->pluginData->getTotalsByCondition('EDD\CartContainsXProducts'), 'firebox_cond_edd_amount_in_cart' => $this->pluginData->getTotalsByCondition('EDD\CartValue'), 'firebox_cond_edd_current_product' => $this->pluginData->getTotalsByCondition('EDD\Product'), 'firebox_cond_edd_purchased_product' => $this->pluginData->getTotalsByCondition('EDD\PurchasedProduct'), 'firebox_cond_edd_last_purchased_date' => $this->pluginData->getTotalsByCondition('EDD\LastPurchaseDate'), 'firebox_cond_edd_current_product_price' => $this->pluginData->getTotalsByCondition('EDD\CurrentProductPrice'), 'firebox_cond_edd_total_spend' => $this->pluginData->getTotalsByCondition('EDD\TotalSpend'), 'firebox_cond_edd_current_product_category' => $this->pluginData->getTotalsByCondition('EDD\Category'), 'firebox_cond_edd_category' => $this->pluginData->getTotalsByCondition('EDD\CategoryView'), 'firebox_cond_woo_products_in_cart' => $this->pluginData->getTotalsByCondition('WooCommerce\CartContainsProducts'), 'firebox_cond_woo_cart_items_count' => $this->pluginData->getTotalsByCondition('WooCommerce\CartContainsXProducts'), 'firebox_cond_woo_amount_in_cart' => $this->pluginData->getTotalsByCondition('WooCommerce\CartValue'), 'firebox_cond_woo_current_product' => $this->pluginData->getTotalsByCondition('WooCommerce\Product'), 'firebox_cond_woo_purchased_product' => $this->pluginData->getTotalsByCondition('WooCommerce\PurchasedProduct'), 'firebox_cond_woo_last_purchased_date' => $this->pluginData->getTotalsByCondition('WooCommerce\LastPurchaseDate'), 'firebox_cond_woo_current_product_price' => $this->pluginData->getTotalsByCondition('WooCommerce\CurrentProductPrice'), 'firebox_cond_woo_total_spend' => $this->pluginData->getTotalsByCondition('WooCommerce\TotalSpend'), 'firebox_cond_woo_current_product_category' => $this->pluginData->getTotalsByCondition('WooCommerce\Category'), 'firebox_cond_woo_category' => $this->pluginData->getTotalsByCondition('WooCommerce\CategoryView'), 'firebox_cond_url' => $this->pluginData->getTotalsByCondition('URL'), 'firebox_cond_referrer' => $this->pluginData->getTotalsByCondition('Referrer'), 'firebox_cond_ip' => $this->pluginData->getTotalsByCondition('IP'), 'firebox_cond_pageviews' => $this->pluginData->getTotalsByCondition('Pageviews'), 'firebox_cond_cookies' => $this->pluginData->getTotalsByCondition('Cookie'), 'firebox_cond_php' => $this->pluginData->getTotalsByCondition('PHP'), 'firebox_cond_wpml_language' => $this->pluginData->getTotalsByCondition('Language'), 'firebox_cond_timeonsite' => $this->pluginData->getTotalsByCondition('TimeOnSite'), 'firebox_cond_new_returning_visitor' => $this->pluginData->getTotalsByCondition('NewReturningVisitor'), 'firebox_actions' => $this->pluginData->getTotalsBySetting('actions', 'cond:not:emptyArray'), 'firebox_php_scripts_on_before' => $this->pluginData->getTotalsBySetting('phpscripts.beforerender', 'cond:not:empty'), 'firebox_php_scripts_on_after' => $this->pluginData->getTotalsBySetting('phpscripts.afterrender', 'cond:not:empty'), 'firebox_php_scripts_on_open' => $this->pluginData->getTotalsBySetting('phpscripts.open', 'cond:not:empty'), 'firebox_php_scripts_on_close' => $this->pluginData->getTotalsBySetting('phpscripts.close', 'cond:not:empty'), 'firebox_php_scripts_on_form_success' => $this->pluginData->getTotalsBySetting('phpscripts.formsuccess', 'cond:not:empty'), 'firebox_custom_css' => $this->pluginData->getTotalsBySetting('customcss', 'cond:not:empty'), 'firebox_custom_javascript' => $this->pluginData->getTotalsBySetting('customcode', 'cond:not:empty'), 'firebox_test_mode' => $this->pluginData->getTotalsBySetting('testmode', 'boolean'), 'firebox_prevent_page_scrollling' => $this->pluginData->getTotalsBySetting('preventpagescroll', 'boolean'), 'firebox_settings' => $this->getSettings() ]; return $payload; } private function getDatabaseType($database_version = '') { $database_version = strtolower(trim((string) $database_version)); $database_driver = strtolower((string) $this->getDatabaseDriver()); if (strpos($database_version, 'mariadb') !== false || strpos($database_driver, 'mariadb') !== false) { return 'MariaDB'; } if ( strpos($database_driver, 'mysql') !== false || strpos($database_driver, 'mysqli') !== false || strpos($database_driver, 'pdo_mysql') !== false || strpos($database_driver, 'pdo\\mysql') !== false ) { return 'MySQL'; } if ($database_version !== '') { return 'MySQL'; } return 'Unknown'; } private function getDatabaseDriver() { global $wpdb; if (is_object($wpdb->dbh)) { // mysqli or PDO $extension = get_class($wpdb->dbh); } else { // Unknown sql extension $extension = null; } return $extension; } private function getSettings() { $excluded_keys = [ 'api_key', 'geo_license_key', 'license_key', 'cloudflare_turnstile_site_key', 'cloudflare_turnstile_secret_key', 'recaptcha_v2_checkbox_site_key', 'recaptcha_v2_checkbox_secret_key', 'recaptcha_v2_invisible_site_key', 'recaptcha_v2_invisible_secret_key', 'recaptcha_v3_site_key', 'recaptcha_v3_secret_key', 'hcaptcha_site_key', 'hcaptcha_secret_key', 'openai_api_key', 'stripe_test_secret_key', 'stripe_test_publishable_key', 'stripe_live_secret_key', 'stripe_live_publishable_key', 'stripe_webhooks_secret_test', 'stripe_webhooks_secret_live', 'stripe_webhooks_id_test', 'stripe_webhooks_id_live', ]; $excluded_keys = array_merge( $excluded_keys, \FireBox\Core\Helpers\Integrations::getSettingsKeys() ); return array_diff_key( $this->settings, array_flip($excluded_keys) ); } /** * Returns currently connected integrations. * * @return array */ private function getConnectedIntegrations() { $connected_integrations = []; $integrations = \FireBox\Core\Helpers\Integrations::getSettingsManagedIntegrations(); if (!is_array($integrations)) { return $connected_integrations; } foreach ($integrations as $integration) { if (!is_array($integration) || empty($integration['slug']) || empty($integration['connected'])) { continue; } $connected_integrations[] = (string) $integration['slug']; } return $connected_integrations; } /** * Determines whether the plugin is active for the entire network. * * @return bool */ private function is_active_for_network() { // Stop if not multisite if (!is_multisite()) { return false; } // Get all active plugins $plugins = get_site_option('active_sitewide_plugins'); // Stop if the plugin is active for the entire network if (isset($plugins[plugin_basename(FBOX_PLUGIN_BASE_FILE)])) { return true; } return false; } /** * Total number of sites. * * @return int */ private function get_sites_total() { return function_exists('get_blog_count') ? (int) get_blog_count() : 1; } /** * Get the list of active plugins. * * @return array */ private function get_active_plugins() { if (!function_exists('get_plugins')) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $active = is_multisite() ? array_merge(get_option('active_plugins', []), array_flip(get_site_option('active_sitewide_plugins', []))) : get_option('active_plugins', []); $plugins = array_intersect_key(get_plugins(), array_flip($active)); return array_map( static function ($plugin) { if (isset($plugin['Version'])) { return $plugin['Version']; } return 'Not Set'; }, $plugins ); } /** * Return the User Agent used in the API request. * * @return string */ public function get_user_agent() { return 'FireBox/' . FBOX_VERSION . '; ' . get_bloginfo('url'); } /** * Returns onboarding status (completed|skipped|empty). * * @return string */ private function getOnboardingStatus() { $status = strtolower(trim((string) get_option('firebox_onboarding_completed', ''))); if ($status === '') { return ''; } if ($status === \FireBox\Core\Admin\Includes\Onboarding::ONBOARDING_STATUS_SKIPPED) { return \FireBox\Core\Admin\Includes\Onboarding::ONBOARDING_STATUS_SKIPPED; } // Treat any non-empty legacy value (e.g. version numbers) as completed. return \FireBox\Core\Admin\Includes\Onboarding::ONBOARDING_STATUS_COMPLETED; } }