add_cap( $cap ); } $role = get_role( 'administrator' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } $role = get_role( 'editor' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } $role = get_role( 'author' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); } */ function reactpress_enqueue_scripts() { if (is_page('trips')) { wp_dequeue_script('currency-converter'); wp_dequeue_script('swup'); } } add_action('wp_enqueue_scripts', 'reactpress_enqueue_scripts', 20000); function reactpress_head() { global $wp_query; if (is_page('trips')) { ?> 'get_post_meta_for_api', 'schema' => null, ) ); } function get_post_meta_for_api( $obj ) { $postmeta = get_post_meta( $obj['id']); //=============== $apiKey = "0772153bce5238310c5a3fcbe783d1a7"; $cityId = get_field('city_code', $obj['id']); $apiUrl = "https://api.openweathermap.org/data/2.5/weather?id=" . $cityId . "&lang=ru&units=metric&APPID=" . $apiKey; $data = get_transient('weather_data_'.$cityId); if( empty($data) ){ $crequest = curl_init(); curl_setopt($crequest, CURLOPT_HEADER, 0); curl_setopt($crequest, CURLOPT_RETURNTRANSFER, 1); curl_setopt($crequest, CURLOPT_URL, $apiUrl); curl_setopt($crequest, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($crequest, CURLOPT_VERBOSE, 0); curl_setopt($crequest, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($crequest); curl_close($crequest); $data = json_decode($response); set_transient('weather_data_'.$cityId, $data, 3600); // 3600 in seconds = 1h } $postmeta['weather'] = [ 'description' => ucwords($data->weather[0]->description), 'icon' => $data->weather[0]->icon, 'temp' => intval($data->main->temp) ]; //=============== foreach ($postmeta as $key => $field){ if ($key == 'cost_of_living_raw'){ $field = unserialize($field[0]); $postmeta[$key] = $field; } if ($key == 'country'){ $country = get_field_object('country', $obj['id']); $country = $country['choices'][$country['value']]; $postmeta[$key] = $country; } } return $postmeta; } //=================================================================================== //=== aviasales === $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; // add_action('rest_api_init', function () { // register_rest_route( 'aviasales/v1', '/aviasales/', array( // 'methods' => 'GET', // 'callback' => 'aviasales', // )); // }); // function aviasales($request) { // global $travelpayouts_token; // $url = 'https://api.travelpayouts.com/aviasales/v3/prices_for_dates'; // //$request->get_param('cheap') // $params = [ // 'origin' => $request->get_param('departure_city'), // 'destination' => $request->get_param('destination_city'), // 'departure_at' => $request->get_param('departure_date'), // //'trip_class' => $request->get_param('type'), // 'unique' => 'false', // 'sorting' => 'price', // // 'direct' => 'false', // 'currency' => 'usd', // 'limit' => '15', //100 // 'page' => '1', // 'token' => $travelpayouts_token, // ]; // if ($request->get_param('direction') == 'oneway') { // $params['one_way'] = 'true'; // } else { // $params['one_way'] = 'false'; // $params['return_at'] = $request->get_param('return_date'); // } // //$request->get_param('persons') // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($params, true), FILE_APPEND); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // return $result; // } add_action('rest_api_init', function () { register_rest_route('aviasales/v1', '/search/', array( 'methods' => 'GET', 'callback' => 'aviasales_search', )); }); function aviasales_search($request) { $log_file = $_SERVER['DOCUMENT_ROOT'] . '/flight_logs.txt'; $debug_log_file = $_SERVER['DOCUMENT_ROOT'] . '/debug_log_flights.txt'; function log_message($log_file, $message) { $timestamp = date("Y-m-d H:i:s"); file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND); } log_message($log_file, "Starting flight search request."); $marker = '402943'; $host = 'travcave.ru'; $user_ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $locale = 'en'; $trip_class = 'Y'; $signature_token = '6d0c907fad90bb689a5db94d75b3789d'; $segments = [ [ 'origin' => $request->get_param('departure_city'), 'destination' => $request->get_param('destination_city'), 'date' => $request->get_param('departure_date') ] ]; if ($request->get_param('return_date')) { $segments[] = [ 'origin' => $request->get_param('return_city'), 'destination' => $request->get_param('return_destination_city'), 'date' => $request->get_param('return_date') ]; } $params = [ 'host' => $host, 'marker' => $marker, 'user_ip' => $user_ip, 'locale' => $locale, 'trip_class' => $trip_class, 'passengers' => [ 'adults' => (int) $request->get_param('adults'), 'children' => (int) $request->get_param('children'), 'infants' => (int) $request->get_param('infants') ], 'segments' => $segments ]; log_message($debug_log_file, "Received parameters: " . json_encode($params)); $signature_elements = [ $signature_token, $host, $locale, $marker, $params['passengers']['adults'], $params['passengers']['children'], $params['passengers']['infants'], $params['segments'][0]['date'], $params['segments'][0]['destination'], // Reverse order for signature $params['segments'][0]['origin'] // Reverse order for signature ]; if (isset($params['segments'][1])) { $signature_elements = array_merge($signature_elements, [ $params['segments'][1]['date'], $params['segments'][1]['destination'], // Reverse order for signature $params['segments'][1]['origin'] // Reverse order for signature ]); } $signature_elements = array_merge($signature_elements, [ $trip_class, $user_ip ]); $signature_string = implode(':', $signature_elements); $signature = md5($signature_string); $params['signature'] = $signature; $json_params = json_encode($params); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON encode error: $json_error"); return array('error' => 'JSON encode error', 'message' => $json_error); } log_message($log_file, "Request parameters: $json_params"); $url = 'http://api.travelpayouts.com/v1/flight_search'; log_message($log_file, "Request URL: $url"); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_params); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_VERBOSE, true); ob_start(); $result = curl_exec($ch); $curl_error = curl_error($ch); $verbose_log = ob_get_contents(); ob_end_clean(); log_message($log_file, "CURL error (if any): $curl_error"); log_message($log_file, "CURL verbose log: $verbose_log"); log_message($log_file, "API response: $result"); $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); log_message($log_file, "HTTP response code: $response_code"); curl_close($ch); if ($response_code != 200) { log_message($log_file, "API request failed with response code: $response_code"); return array('error' => 'API request failed', 'response_code' => $response_code); } $result = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON decode error: $json_error"); return array('error' => 'JSON decode error', 'message' => $json_error); } if (empty($result)) { log_message($log_file, "Empty result received from API."); return array('error' => 'No results', 'message' => 'No results returned from API.'); } log_message($log_file, "Returning result to client."); return $result; } add_action('rest_api_init', function () { register_rest_route('aviasalescity/v1', '/autocomplete/', array( 'methods' => 'GET', 'callback' => 'aviasales_city_autocomplete', )); }); function aviasales_city_autocomplete($request) { $log_file = $_SERVER['DOCUMENT_ROOT'] . '/flight_logs.txt'; $debug_log_file = $_SERVER['DOCUMENT_ROOT'] . '/debug_log_flights.txt'; // Helper function to log messages function log_message($log_file, $message) { $timestamp = date("Y-m-d H:i:s"); file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND); } log_message($log_file, "Starting city autocomplete request."); log_message($debug_log_file, "Starting city autocomplete request."); $url = 'https://autocomplete.travelpayouts.com/places2'; log_message($log_file, "Request URL: $url"); log_message($debug_log_file, "Request URL: $url"); $params = [ 'locale' => 'ru', 'term' => $request->get_param('city'), ]; log_message($log_file, "Request parameters: " . http_build_query($params)); log_message($debug_log_file, "Request parameters: " . http_build_query($params)); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $curl_error = curl_error($ch); log_message($log_file, "CURL error (if any): $curl_error"); log_message($debug_log_file, "CURL error (if any): $curl_error"); log_message($log_file, "API response: $result"); log_message($debug_log_file, "API response: $result"); $result = json_decode($result, true); curl_close($ch); if (json_last_error() !== JSON_ERROR_NONE) { $json_error = json_last_error_msg(); log_message($log_file, "JSON decode error: $json_error"); log_message($debug_log_file, "JSON decode error: $json_error"); return array('error' => 'JSON decode error', 'message' => $json_error); } if (empty($result)) { log_message($log_file, "Empty result received from API."); log_message($debug_log_file, "Empty result received from API."); return array('error' => 'No results', 'message' => 'No results returned from API.'); } $result = array_slice($result, 0, 10); log_message($log_file, "Returning result to client."); log_message($debug_log_file, "Returning result to client."); return $result; } add_action('rest_api_init', function () { register_rest_route( 'aviasalescity/v1', '/aviasalescity/', array( 'methods' => 'GET', 'callback' => 'aviasalescity', )); }); function aviasalescity($request) { $url = 'https://autocomplete.travelpayouts.com/places2'; $params = [ 'locale' => 'ru', //'types[]' => 'airport',//, 'city' 'term' => $request->get_param('city'), ]; $ch = curl_init($url.'?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $result = json_decode($result); $result = array_slice($result, 0, 10); curl_close($ch); //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); return $result; } //=================================================================================== //=== hotels === // add_action('rest_api_init', function () { // register_rest_route( 'hotels/v1', '/hotels/', array( // 'methods' => 'GET', // 'callback' => 'hotels', // )); // }); // function hotels($request) { // //return '1234'; // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($params, true), FILE_APPEND); // $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; // $url = 'https://engine.hotellook.com/api/v2/lookup.json'; // $params = [ // 'query' => $request->get_param('city'), // 'lang' => 'ru', // 'lookFor' => 'city', // 'limit' => 1, // 'token' => $travelpayouts_token, // ]; // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($results->results, true), FILE_APPEND); // if (isset($result->results->locations[0])) { // $id = $result->results->locations[0]->id; // file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', 'id='.$id, FILE_APPEND); // $url = 'https://yasen.hotellook.com/tp/public/widget_location_dump.json'; // $params = [ // 'currency' => 'usd', // 'language' => 'ru', // 'limit' => 100, // 'id' => $id, // 'type' => 'popularity', // 'check_in' => $request->get_param('start_date'), // 'check_out' => $request->get_param('end_date'), // 'token' => $travelpayouts_token, // ]; // $ch = curl_init($url.'?' . http_build_query($params)); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_HEADER, false); // $result = curl_exec($ch); // $result = json_decode($result); // curl_close($ch); // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // } else { // $result = false; // } // //file_put_contents($_SERVER['DOCUMENT_ROOT'].'/data.txt', print_r($result, true), FILE_APPEND); // return $result; // } function get_city_id($city, $token) { $url = 'https://engine.hotellook.com/api/v2/lookup.json'; $params = [ 'query' => $city, 'lang' => 'ru', 'lookFor' => 'city', 'limit' => 1, 'token' => $token, ]; $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); if (isset($result['results']['locations'][0]['id'])) { return $result['results']['locations'][0]['id']; } else { return false; } } function start_hotel_search($location, $check_in, $check_out, $adults_count, $token, $customer_ip, $marker, $iata = 'MOW') { $url = 'https://engine.hotellook.com/api/v2/search/start.json'; $params = [ 'cityId' => $location, 'checkIn' => $check_in, 'checkOut' => $check_out, 'adultsCount' => $adults_count, 'customerIP' => $customer_ip, 'currency' => 'USD', 'lang' => 'ru', 'waitForResult' => 0, 'marker' => $marker, 'childrenCount' => 1, 'childAge' => 10, 'iata' => $iata, ]; // Correct signature string construction $signature_string = "$token:$marker:$adults_count:$check_in:$check_out:10:1:$location:USD:$customer_ip:$iata:ru:0"; $params['signature'] = md5($signature_string); // Log all variables for signature file_put_contents('debug_log.txt', "Token: $token\n", FILE_APPEND); file_put_contents('debug_log.txt', "Marker: $marker\n", FILE_APPEND); file_put_contents('debug_log.txt', "Adults Count: $adults_count\n", FILE_APPEND); file_put_contents('debug_log.txt', "Check-in: $check_in\n", FILE_APPEND); file_put_contents('debug_log.txt', "Check-out: $check_out\n", FILE_APPEND); file_put_contents('debug_log.txt', "Child Age 1: 10\n", FILE_APPEND); file_put_contents('debug_log.txt', "Children Count: 1\n", FILE_APPEND); file_put_contents('debug_log.txt', "Currency: USD\n", FILE_APPEND); file_put_contents('debug_log.txt', "Customer IP: $customer_ip\n", FILE_APPEND); file_put_contents('debug_log.txt', "IATA: $iata\n", FILE_APPEND); file_put_contents('debug_log.txt', "Location: $location\n", FILE_APPEND); file_put_contents('debug_log.txt', "Lang: ru\n", FILE_APPEND); file_put_contents('debug_log.txt', "Wait For Result: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature String: $signature_string\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature: " . $params['signature'] . "\n", FILE_APPEND); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); $curl_info = curl_getinfo($ch); // Get curl info $curl_error = curl_error($ch); // Get curl error if any curl_close($ch); $result = json_decode($result, true); if (isset($result['searchId'])) { return $result['searchId']; } else { // Log request and response for debugging file_put_contents('debug_log.txt', "Request URL: " . $url . '?' . http_build_query($params) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Response: " . print_r($result, true) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Curl Info: " . print_r($curl_info, true) . "\n", FILE_APPEND); file_put_contents('debug_log.txt', "Curl Error: " . $curl_error . "\n", FILE_APPEND); return false; } } function get_hotel_search_results($search_id, $token, $marker) { $url = 'https://engine.hotellook.com/api/v2/search/getResult.json'; $params = [ 'searchId' => $search_id, 'limit' => 10, 'offset' => 0, 'sortBy' => 'price', 'sortAsc' => 1, 'roomsCount' => 0, 'marker' => $marker, ]; $signature_string = "$token:$marker:10:0:0:$search_id:1:price"; $params['signature'] = md5($signature_string); // Log all variables for signature file_put_contents('debug_log.txt', "Token: $token\n", FILE_APPEND); file_put_contents('debug_log.txt', "Marker: $marker\n", FILE_APPEND); file_put_contents('debug_log.txt', "Limit: 10\n", FILE_APPEND); file_put_contents('debug_log.txt', "Offset: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Rooms Count: 0\n", FILE_APPEND); file_put_contents('debug_log.txt', "Search ID: $search_id\n", FILE_APPEND); file_put_contents('debug_log.txt', "Sort Asc: 1\n", FILE_APPEND); file_put_contents('debug_log.txt', "Sort By: price\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature String: $signature_string\n", FILE_APPEND); file_put_contents('debug_log.txt', "Generated Signature: " . $params['signature'] . "\n", FILE_APPEND); $ch = curl_init($url . '?' . http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); curl_close($ch); $result = json_decode($result, true); return $result; } add_action('rest_api_init', function () { register_rest_route('hotels/v1', '/hotels/', array( 'methods' => 'GET', 'callback' => 'hotels_search', )); }); function hotels_search($request) { $travelpayouts_token = '6d0c907fad90bb689a5db94d75b3789d'; $marker = '402943'; $customer_ip = $_SERVER['REMOTE_ADDR']; // Correct the iata code parameter $city = $request->get_param('city') ?? 'MOW'; $check_in = $request->get_param('start_date'); $check_out = $request->get_param('end_date'); $adults_count = $request->get_param('adults_count') ?? 1; // Default to 1 if not provided // Debugging output for city ID retrieval $city_id = get_city_id($city, $travelpayouts_token); if (!$city_id) { file_put_contents('debug_log.txt', "City ID retrieval failed for city: $city\n", FILE_APPEND); return array('error' => 'City not found', 'debug' => 'City ID retrieval failed'); } // Debugging output for search initiation $search_id = start_hotel_search($city_id, $check_in, $check_out, $adults_count, $travelpayouts_token, $customer_ip, $marker, $city); if (!$search_id) { file_put_contents('debug_log.txt', "Hotel search initiation failed for city_id: $city_id\n", FILE_APPEND); return array('error' => 'Hotel search failed', 'debug' => 'Search initiation failed'); } // Fetch search results $result = get_hotel_search_results($search_id, $travelpayouts_token, $marker); if (isset($result['status']) && $result['status'] == 'ok') { return $result; } else { file_put_contents('debug_log.txt', "Search results retrieval failed for search_id: $search_id\n", FILE_APPEND); return array('error' => 'Hotel search results retrieval failed', 'debug' => 'Search results retrieval failed'); } } Куда поехать: лучшие города для жизни 2024 - сообщество цифровых кочевников TravCave
ТрэвКейв
Первый в Рунете портал, объединяющий номадов по всему миру 🌎

Мы о путешествиях, о городах, о работе на удаленке. TravCave - это место, где каждый сможет стать блогером и рассказать свою историю.

ГлавнаяСтатьиКуда поехать: лучшие города для жизни 2024

Куда поехать: лучшие города для жизни 2024

491 0

Старая английская пословица “Птицы одного пера — стаей летят” верна и для цифровых кочевников. Они предпочитают следовать за себе подобными, что приводит к появлению общепризнанных цифровых хабов по всему миру.

В прошлом году рейтинг “лучшие города для жизни” выглядел так:

#1 Бангкок 🇹🇭 Таиланд
#2 Лиссабон 🇵🇹 Португалия
#3 Лондон 🇬🇧 Великобритания
#4 Барселона 🇪🇸 Испания
#5 Париж 🇫🇷 Франция

Именно эти города являются одними из наиболее посещаемых мест в мире и привлекают толпы туристов, кочевников, да и всех подряд.

Исторически главными местами обитания цифровых кочевников были Таиланд и Бали. После пандемии к ним добавились “Америки” из-за продолжительных виз, а также Португалия с Испанией благодаря налоговым льготам, закону о цифровых кочевниках и европейскому положению.

Популярность Мексики, Южной и Латинской Америки обусловлена тем, что большинство цифровых кочевников – граждане США (32 млн или 46%), которые переселяются в соседние страны.

Высокое положение ЕС также отражает внутреннее движение европейских и британских (второе место по числу удаленных работников) кочевников, которые могут жить и работать в любых странах Евросоюза.

Остальные же номады, включая россиян, традиционно стекаются в Азию.

Лучшие города для цифровых кочевников

На сегодняшний день следующие направления однозначно и бесповоротно нанесены на карту удаленной работы:

Мы неоднократно рассматривали их в течение последних двух лет. Все они обладают общими характеристиками, которые делают их привлекательными для удаленной работы.

  • Наличие хорошего интернета, инфраструктуры, кафе и коворкингов.
  • Упрощенная визовая система, позволяющая оставаться надолго.
  • Доступная стоимость жизни и широкий выбор аренды.
  • Наконец, не последнюю роль играет теплый климат и множество развлечений.

Сегодня десятки стран и сотни городов соответствуют этим критериям, но кочевники всё равно остаются годами верными одним и тем же направлениям. Это потому, что мы тянемся к местам и людям, которые резонируют с нами, будь то залитые солнцем пляжи или оживленные мегаполисы. Мы хотим знакомиться, общаться и сосуществовать среди единомышленниками в приятной атмосфере, где есть чем заняться после работы.

Тенденции 2024

Конечно, уже освоенные направления продолжат укрепляться. Азия будет разбухать и дорожать, пока не лопнет. Никуда не денутся с радаров и Португалия с Испанией, несмотря на ужесточение визовых и миграционных правил.

Однако, если раньше номадов можно было пересчитать по пальцам, то сейчас их более 35 миллионов. Когда всей толпой приземляются на один маленький остров, это приводит к непомерному росту цен и другим негативным последствиям, известным как “джентрификация”. В результате многие вынуждены отправляться на поиски новых, более доступных направлений, где еще есть простор для жизни и работы.

Поэтому в 2024 году нас ожидают следующие тенденции:

Укрепление Латинской Америки

Латинская Америка становится все более популярным направлением для цифровых кочевников. Этому способствует сильная цифровая инфраструктура, доступная стоимость жизни и яркая культура. Такие страны, как Мексика и Колумбия, переживают настоящий бум. Они предлагают надежный интернет, множество развлечений и дружелюбную визовую политику. Представьте, как вы наслаждаетесь маргаритой на пляже Тулума или танцуете сальсу в Медельине, продолжая при этом работать удаленно.

Дешевая Европа без толп

В то время как Лиссабон и Барселона остаются фаворитами, более спокойные европейские города, такие как Белград или Тирана набирают силу. Эти скрытые сокровища предлагают более низкую стоимость жизни, очаровательные исторические декорации и растущее сообщество. Здесь вы можете прогуливаться по средневековым улочкам и наслаждаться латте вдвое дешевле соседей. Именно с этим связана популярность Балкан, Болгарии и Румынии. Однако, похоже, что в 2024 году из этого списка выживет только Албания и Сербия.

Экологичность выходит на первый план

Цифровые кочевники все чаще выбирают менее урбанизированные направления поближе к природе. Такие альтернативные направления как Флорианополис в Бразилии и Нуса-Пенида в Индонезии привлекают потрясающей и пока не испорченной красотой.

Сообщество и связь остаются королями

Коворкинг-пространства и развитая инфраструктура по-прежнему имеют первостепенное значение. Будь то мозговой штурм с коллегами в уютном кафе в Тираны или сетевые мероприятия в Панаме, дух сотрудничества и совместного опыта продолжит укреплять мир цифровых кочевников.

Куда поехать: лучшие города для жизни 2024

Главным трендом цифровых кочевников 2024 станут неизведанные направления. Прошли времена погони за знакомым. Чиангмай и Бали слишком долго были пристанищем для удаленных работников. Теперь “стая кочевников” устремляется к новым горизонтам.

Избалованные выбором, они ищут уникальные впечатления и доступность, за рамками привычного. Этот сдвиг в приоритетах открывает многообещающие перспективы для новых направлений, предлагая свежие альтернативы проторенным тропам.

Вот главные восходящие звезды на карте цифровых кочевников, за которыми стоит следить.

Страна Города Рост Цена,
руб/мес
Виза, дней
1 Албания 🇦🇱 Тирана 200% 85 000 виза 90
2 Сербия 🇷🇸 Белград 98% 90 000 без  30
3 Болгария 🇧🇬 Банско 250% 60 000 виза 90
4 ОАЭ 🇦🇪 Абу-Даби 146% 170 000 без 90
5 Бразилия 🇧🇷 Флорианополис 138% 70 000 без 90
6 Панама 🇵🇦 Панама-Сити
Бокас-дель-Торо
95% 110 000
93 000
без 90
7 Южная Африка 🇿🇦 Кейптаун 110% 130 000 без 90
8 Шри-Ланка 🇱🇰 Коломбо
Галле
77% 54 000
56 000
виза 30
9 Малайзия 🇲🇾 Куала Лумпур
Пенанг
55% 65 000,
52 000
без 30

Именно эти направления все чаще упоминаются в качестве следующего идеального места. Так ли это – скоро узнаем. Одно точно: каждое из них предлагает свой уникальный и необычный вкус.

Тирана, Албания 🇦🇱

Звезда Балкан

Растущая популярность Албании связана с введением годовой визы цифрового кочевника с минимальным требованием к доходу всего 9800 долларов США в год.

Последний неизведанный уголок Европы предлагает 476 км нетронутой береговой линии, великолепную природу, сказочные древние города, такие как Берат и Гирокастра.

Тирана является самопровозглашенной европейской столицей цифровых кочевников. Ей есть что предложить номадам: недорогая еда и проживание, гостеприимные горожане и множество кафе с дешевым кофе. При этом стоимость жизни очень привлекательная: однокомнатная квартира в центре Тираны стоит всего 25700 рублей, а обед – 300.

Банско, Болгария 🇧🇬

Дешёвый горнолыжный курорт

Маленький горный городок в Болгарии поражает своей необъяснимой популярностью, которая за последние годы выросла на 250%. Это особенно странно, потому что большинство кочевников предпочитают пляжные курорты или большие города. В отличие от них, Банско – одно из самых доступных мест для зимнего отдыха в Европе для любителей гор и снега.

Однако, независимо от сезона, в Банско одновременно работают более 300 удаленных работников. Возможно, причина тому не толко красивые пейзажи, невероятно дешёвая стоимость жизни и отличная инфраструктура, но и развитое сообщество. Многочисленные мероприятия, включая уроки сальсы, ужины, настольные игры, спортивные соревнования, поездки к горячим источникам и барбекю, создают живую атмосферу в любое время года. К тому же, здесь проводится один из самых известных фестивалей цифровых кочевников – Bansko Nomadfest.

Однако, скорее всего, это был последний сезон для кочевников в Банско из-за вступления Болгарии в Шенген с марта 2024 года.

Белград, Сербия 🇷🇸

Знакомое прошлое и яркое настоящее

Сербия занимает первое место среди самых дешевых стран для отдыха. Это последнее из трех направлений в Европе, куда россияне могут поехать без визы.

Белград становится популярным хабом цифровых кочевников из-за своего дружелюбия, простых виз, низкой стоимости и расслабленной атмосферы. Авторитетное издание Lonely Planet даже включило столицу Сербии в список лучших новых направлений для дистанционной работы.

Открытый, авантюрный и дерзкий, «Белый город» с его изобилием жизни – один из самых бурных и ярких городов Европы. Здесь можно комфортно жить, неспешно прогуливаясь и расслабляясь на речных пляжах, а ночью шумно кутить и вкусно есть в компании местных, не чувствуя себя туристом.

Абу-Даби, ОАЭ 🇦🇪

Будущее на побережье Персидского Залива

Абу-Даби поражает своим сочетанием роскоши и технологического новаторства. Амбициозные планы развития и привлекательные визовые варианты делают столицу ОАЭ магнитом для цифровых номадов.

Этот футуристический мегаполис предоставляет современные возможности для жизни и работы в уникальной атмосфере Ближнего Востока и при этом дешевле и спокойнее, чем в соседнем Дубае. Абу Даби больше похож на дом, чем на туристическое направление, что делает его идеальным местом для цифровых кочевников, планирующих остаться в Эмиратах надолго, особенно с семьей.

Флорианополис, Бразилия 🇧🇷

Тропическая мекка кочевников

Бразилия привлекла внимание в прошлом году, представив визу для цифровых кочевников, которая позволяет жить в стране год. Рио-де-Жанейро и Сан-Паулу уже признаны основными центрами для удаленной работы в стране. Но в последнее время их потеснил Флорианополис благодаря своим потрясающим пляжам, дружелюбию местных жителей, безопасности и растущему сообществу экспатов. Этот город предлагает уникальное сочетание природы и возможностей современного мегаполиса с колониальными крепостями 16-го века, спокойными рынками и парками.

Панама-Сити и Бокас-дель-Торо, Панама

Тропический рай для цифровых путешественников

Панама, новая звезда Центральной Америки, манит красочными ландшафтами, цифровой визой, отличным Wi-Fi и доступным образом жизни.

В Панаме два главных города: стильный Панама-Сити и уютный Бокас-дель-Торо. Оба они сочетают современные удобства и тропическую красоту. Панама-Сити – это кипучая столица с самым быстрым интернетом в регионе, где соседствуют коворкинги, исторические здания и современные достопримечательности для любого кошелька. А Бокас-дель-Торо – идеальное место для тех, кто ищет спокойствие пляжей и расслабленную атмосферу для работы на фоне тропического рая.

Кейптаун, Южная Африка 🇿🇦

Смесь природы и современности

Кейптаун стал пионером новой “африканской волны”. В отличие от Марокко, Танзании и Намибии, которые все еще считаются экзотическими направлениями для отдыха, столица Южной Африки привлекает полноценной жизнью. Кейптаун — один из самых красивых городов мира с пышными горами, спускающимися к нетронутым пляжам. Он предлагает номадам множество развлечений, захватывающую природу, стабильный интернет и яркую атмосферу. Эти качества, наряду с доступными ценами, прекрасной едой и современной инфраструктурой, делают его одним из лучших новых городов для удаленной работы.

Коломбо и Галле, Шри-Ланка 🇱🇰

Остров незабываемых приключений

Если вы ищете теплое местечко в Южной Азии с хорошим серфингом, низкими ценами, уникальной культурой и отличной погодой, но при этом не перегруженное туристами, то добро пожаловать на Шри Ланку. Коломбо и Галле – два замечательных города, которые иллюстрируют контрасты Шри-Ланки, представляя современную динамику и богатое колониальное прошлое страны.

Коломбо является живым символом современности и развития. Город сочетает в себе новое и старое, предлагая путешественникам исторические места с современными торговыми центрами и высотными зданиями.

Галле, расположенный на юго-западном побережье, отличается колониальным наследием и умиротворенной атмосферой. Этот исторический город поражает узкими улочками, старинными голландскими домами и великолепными видами на Индийский океан.

Куала Лумпур и Пенанг, Малайзия 🇲🇾

Где Восток встречается с Западом

Уровень жизни в Малайзии выше, а цены ниже, чем в других странах региона. Однако эта страна привлекает не только своей развитостью и ценами, но скорее необычной космополитичной  и очень европейской атмосферой, которая объединяет 30 миллионов человек разных этнических групп и религий.

Столица Малайзии, Куала Лумпур, поражает своей зеленью, архитектурой и грандиозностью. Этот потрясающий город, объединяющий современность и традиции, предлагает комфортную жизнь без границ. Он подойдет тем, кто хочет сочетать удобства удаленной работы в мегаполисе с богатством социального опыта.

Остров Пенанг не похож ни на одно другое место в Азии. Этот удивительный космополитичный мир вобрал в себя множество религий и культур, которые за много веков смешались в невероятный коктейль. Каждый его уголок пропитан уникальной пульсирующей энергией, которую сложно найти где-либо еще.


Выбирай свое следующее место для работы и приключений, будь то современный Абу-Даби, экзотический Флорианополис или уютный Банско. Не думай долго, собирай рюкзак, заряжай гаджеты и отправляйся в путешествие. Помни, что твое идеальное место столь же уникально, как и твой путь. Прислушайся к своему внутреннему голосу и исследуй мир в 2024 году.

Комментарии 0


    Привет! Я из Питера и
    расскажу тебе о городе

    Знаю много мест в Риме —
    заходи ко мне в профиль
    оставайтесь
    с нами
    и узнавайте новое
    Но сплочённость команды профессионалов
    говорит о возможностях направлений.
    Нажимая кнопку “Подписаться”, я соглашаюсь с условиями
    политики конфиденциальности