bestonline-preview.pages.dev → preview.bestonline-tour.ruЕдиная карта всех типов посадочных. Каждая ссылка ведёт на canonical-эталон на preview.bestonline-tour.ru. Перед работой над страницей — открой эталон, сверься со структурой.
| Тип | Canonical эталон | Статус | Schema @graph | Подробно |
|---|---|---|---|---|
| 🏠 Homepage | designs/homepage/ 10 секций · от прогера |
design draft | WebSite + Organization + ItemList | → §7a Homepage |
| 🌍 Country | designs/country/turkey/ 12 секций · 1246 строк |
design draft | TouristDestination + ItemList + FAQPage | → §7 Country |
| 🌏 Region ⭐NEW | turtsiya/antalya/ 11 секций · pilot 28.04 |
production-ready | TouristDestination + Place + AggregateOffer + 14 типов | → §5a Region |
| 🏨 Hotel | hotels-preview-5/club-prive... 10 секций · свежий эталон |
prod-pilot | Hotel + AggregateRating + GeoCoordinates + FAQPage | → §5 Hotel |
| 🏷 Brand | destinations/turkey/brand/hilton/ 8 секций · 14 эталонов |
production-ready | ItemList + Organization + FAQPage + BreadcrumbList | → §6 Brand |
🗂 Хаб всех артефактов preview: preview.bestonline-tour.ru (Basic Auth bestonline / BestonlineTour2026@)
Миссия: создать SEO-машину турагентства с ~16 700 посадочных страниц (отели + страны + регионы + субрегионы + бренды + ниши) для захвата всего спектра travel-запросов в РУ-рынке.
Модель: наша SEO-обёртка (Title, H1, факты, FAQ, Schema) + виджет Tourvisor (фото, цены, бронирование). Мы — SEO-слой, Tourvisor — контент и транзакция.
| Слой | Решение |
|---|---|
| CMS | WordPress 6.x |
| Page builder | Bricks Builder (Unlimited лицензия на портфель) |
| Custom fields | ACF Pro |
| SEO | Rank Math Pro |
| Cache | Redis + WP Rocket |
| Hosting | Beget (PHP 8.2, Nginx) |
| WP-CLI | Для массового импорта из Tourvisor API |
| Cloudflare | НЕ используем (РФ-аудитория, Яндекс лучше индексирует) |
| Аддон | Зачем | Приоритет |
|---|---|---|
| Bricksforge | Conditional visibility — скрывать секции если поле пустое (description пустой → не показывать «Об отеле»). Критично из-за empty-cohort 33% по long-tail Tourvisor | 🔴 must |
| Structeezy | Сохранять и переиспользовать структуры. Наши 5 типов страниц (Hotel/Region/Country/Brand/Homepage) = 5 шаблонов которые надо собрать раз и применять везде | 🔴 must |
| Automatic.css (ACSS) или Core Framework | Управление типографикой и цветами через CSS-переменные. Унификация дизайна всего портфеля 6 проектов. Один из двух — выбрать | 🟠 strongly recommended |
| Advanced Themer | Расширенные настройки CSS, цветовые палитры, синхронизация с OpenAI прямо в админке (полезно контент-менеджеру) | 🟠 nice to have |
| BricksExtras или Max Addons | Доп элементы (карусели, табы, аккордеоны). Один из двух, не оба | 🟢 optional |
| НЕ используем — у нас нет Gutenberg, всё на Bricks | ❌ skip | |
| НЕ используем — нам нужны Tourvisor виджеты, не свои | ❌ skip |
Программисту: создать в WP админке Application Password для пользователя «devops-claude» (Users → Profile → Application Passwords). Передать username + token (24 символа) в защищённом канале.
Зачем: AyurTour-Claude (DevOps) сможет проверять состояние сайта через REST API — какие плагины активны, какие ACF поля созданы, сколько hotels импортировано, валиден ли Schema. Алерты при поломках.
| Endpoint | Что отдаёт |
|---|---|
GET /wp-json/wp/v2/plugins | Список всех плагинов + статус (active/inactive) |
GET /wp-json/wp/v2/themes | Активная тема + все установленные |
GET /wp-json/acf/v3/field-groups | ACF поля по CPT (требует ACF Pro REST endpoints) |
GET /wp-json/bricks/v1/templates | Bricks шаблоны |
GET /wp-json/wp/v2/settings | Permalinks, timezone, language |
GET /wp-json/wp/v2/hotel | Импортированные hotels (с ACF полями) |
turtsiya, Alanya не alaniya. Словарь в Python-скрипте COUNTRY_SLUG_EN, REGION_SLUG_EN.
| Сущность | URL-шаблон | Пример |
|---|---|---|
| Страна | /destinations/{country}/ | /destinations/turkey/ |
| Регион | /destinations/{country}/{region}/ | /destinations/turkey/alanya/ |
| Субрегион (атолл/район) | /destinations/{country}/{region}/{subregion}/ | /destinations/maldives/male/raa-atoll/ |
| Отель | /destinations/{country}/{region}/{hotel-slug}/ | /destinations/turkey/alanya/hilton-alanya/ |
| Отель (когда region=country) | /destinations/{country}/{hotel-slug}/ | /destinations/maldives/alila-kothaifaru/ |
| Бренд (чистый) | /destinations/brand/{brand}/ | /destinations/brand/hilton/ |
| Бренд × страна | /destinations/{country}/brand/{brand}/ | /destinations/turkey/brand/hilton/ |
| Ниша | /niches/{niche}/ | /niches/spa/ |
| Ниша × страна | /destinations/{country}/{niche}/ | /destinations/maldives/spa/ |
alila-kothaifaru-maldives вместо alila-kothaifaru-maldives-79690. При коллизии в пределах (country, region) — добавляем суффикс -{id} младшим отелям. Проверено: 36 коллизий из 7 194.
| 🟢 Наше (SEO-слой) | 🟣 Виджет Tourvisor |
|---|---|
| Title, Meta Description, H1 | Фото отеля (галерея) |
| Breadcrumbs + Schema | Описание отеля (их авторский текст) |
| Бокс «Главное» (факты) | Услуги, номера, типы размещения |
| Концентрат / intro 2-3 фразы | Питание детально |
| FAQ 5-7 вопросов (FAQPage schema) | Актуальные цены (онлайн) |
| OG-теги, canonical, hreflang | Форма бронирования |
| Похожие отели / перелинковка | Карта расположения |
| Блог-лента по теме |
tv-hotels={id}) — фото, цены, бронь«{Название} — отель {на/в} {локация}», где «на» для островов/архипелагов (Мальдивы, Пхукет), «в» для остальных. Словарь ISLAND_COUNTRIES/ISLAND_REGIONS.
«Отель {название} {★} {на/в} {локация} — отзывы, цены, туры {YEAR}». YEAR — всегда динамический через date('Y'), никогда не хардкодим.
Эталон: Анталья (turtsiya/antalya/) — первая полная реализация по 19-block структуре из SERP research 27.04.
Реализовано 13/19 блоков, включая 8/10 GAP-блоков, которых нет ни у одного конкурента.
TouristDestination + Country + Place + GeoCoordinates + AggregateOffer + AggregateRating + Product + ItemList + ListItem + TouristAttraction + Organization + WebPage + WebSite + BreadcrumbList + FAQPage + Question + Answer
render_region_preview.py {country_id} {region_id} — берёт данные из БД и генерит HTML по этому шаблону. Из 568 регионов в БД работает на любом seeded.
Hilton × Турция — 59 отелей — все 12 блоков, включая sub-бренд DoubleTree (21), кросс-страны (Катар, Бахрейн, Кения), бокс «Главное», FAQ 7 вопросов, Schema @graph.
Генерация: python3 generate-brand-page.py hilton turkey
Эталон-дизайн: designs/homepage/ — мокап от прогера, 10 секций, 1028 строк. Используется как визуальный baseline для WP+Bricks.
WebSite + Organization + ItemList (популярные направления) + BreadcrumbList
| Тип отеля | Акценты в боксе «Главное» |
|---|---|
| Остров-резорт (Мальдивы) | Атолл, расстояние до аэропорта, трансфер (гидроплан/катер), тип пляжа, бренд/сеть |
| Остров-курорт (Пхукет, Фукуок) | Район, пляж, удалённость от центра, климат |
| Приморский курорт (Анталья, Хургада) | Линия пляжа, всё включено, для семей/молодёжи, питание |
| Городской (Стамбул, Дубай) | Район, близость к метро, для бизнеса/туризма, wifi/workspace |
| Пещерный (Каппадокия) | Уникальный формат, воздушные шары, сезон, романтика |
| SPA / велнес | Программы, специализация (аюрведа/детокс), мед.лицензия |
сommon.build (⚠ кириллическая «с») — год постройкисommon.place — локация (regex для атолла/района)infrastructure.beach — первый <LI>, тип пляжаmeals.list — regex BB/HB/FB/AI/UAI/ROCOUNTRY_FACTS, SEASON_FAQ, VISA_FAQ — из генератораПример «rixos турция» даёт: «rixos турция цены», «rixos турция туры», «rixos турция анталия/белек/кемер», «rixos турция концерты 2026». Из этого формулируем:
| Страница | Обязательные 4-5 вопросов | +2-3 из автокомплита |
|---|---|---|
| Отель | Цена, расположение, питание, детский, как забронировать | По имени отеля из Яндекс-подсказок |
| Страна | Когда ехать, виза, перелёт, средний чек, страховка | По «туры в {страну}» подсказкам |
| Бренд | Сколько отелей, sub-бренды, программа лояльности, цены, бронирование | По «{бренд} {страна}» подсказкам |
| Регион | Особенности курорта, лучший пляж, транспорт, топ-отели | По «{регион} отели» подсказкам |
Каждый FAQ — FAQPage schema. Проверка через Rich Results Test.
<script> с @graph объединяющий Hotel/Organization/BreadcrumbList/FAQPage/ItemList. Google любит cleaner structure.
| Страница | Типы в @graph |
|---|---|
| Отель | Hotel + FAQPage + BreadcrumbList + (Organization если бренд) |
| Бренд | ItemList + Organization + FAQPage + BreadcrumbList |
| Страна/регион | TouristDestination + ItemList + FAQPage + BreadcrumbList |
| Блог-статья | BlogPosting + FAQPage + BreadcrumbList |
/{country}/brand/{brand}/ блок «{Бренд} и в других странах» с количеством отелей (минимум 2 страны для показа).
BreadcrumbList.
| Таксономия | Slug | Иерархия | Примеры |
|---|---|---|---|
| Страна | country | — | turkey, maldives, egypt |
| Регион | region | parent: country | alanya → turkey |
| Субрегион | subregion | parent: region | raa-atoll → male → maldives |
| Звёзды | stars | — | 1-5 |
| Тип отеля | hotel_type | — | island-resort, city-hotel |
| Бренд | hotel_brand | — | hilton, marriott |
| Sub-бренд | hotel_sub_brand | parent: hotel_brand | doubletree → hilton |
| Ниша | hotel_niche | — | spa, diving, honeymoon |
project_bestonline_niche_taxonomies. 15 ниш × 38 стран = 570 потенциальных посадочных.
Факты (не охраняются): год постройки, атолл, количество вилл, расстояние до аэропорта, звёздность, цены — можно использовать свободно.
Авторский текст (охраняется): описания, маркетинговые формулировки Tourvisor/Booking/бренда — копировать нельзя. Парсим поля → собираем свой шаблонный текст.
{date('Y')}, никогда не хардкодим «2026». Иначе придётся перегенерировать тысячи страниц 31 декабря.
Принцип каждой новой посадочной:
| С какой страницы bestonline | Куда cross-link | Зачем |
|---|---|---|
/niches/ayurveda/ | ayurtour.ru (Индия/Шри-Ланка туры) | Аудитория «серьёзной аюрведы» |
/niches/spa/ | ayurtour.ru (программы) | Углубление SPA-интереса |
/destinations/india/, /sri-lanka/ | ayurtour.ru + panchakarma-india.ru | Тематическая синергия |
| Любая country-landing | evisa24.ru (визы в эту страну) | Визовая услуга |
/corporate/ | evisa24.ru/business/ (бизнес-визы) | B2B кросс-sell |
Жёсткое правило: перед wrangler pages deploy public-preview и перед массовым render через render_region_preview.py/generate-brand-page.py — обязательно прогнать валидаторы. Если хоть один Exit 1 — фиксим, потом деплой.
| Анти-паттерн | Где появляется | Grep-проверка | Severity |
|---|---|---|---|
| Yandex карты вместо Google | Нагенерированные hotel-page | grep -l "yandex.*map\|api-maps.yandex" | 🔴 критично |
| Google Static Maps API ключ в HTML | hotels-preview-5 | grep -l "maps.googleapis.com/maps/api/staticmap" | 🟠 security |
| Tourvisor / Booking / Tripadvisor в DOM | Любая клиентская страница | ./scripts/check-brands.sh public-preview/ | 🔴 критично |
| Хардкод года (2025/2026 в Title/Desc) | Шаблоны, JSON-LD | grep -l "20[0-9][0-9]" --include=*.html + manual review | 🟠 поддержка |
| Внешние ссылки на отзовики/карты/агрегаторы | Footer, контент | grep -E 'href="https://(tripadvisor|booking|aviasales|yandex)\.' | 🔴 уводит трафик |
| Отсутствие Schema @graph | Региональные/брендовые | grep -L '"@graph"' | 🔴 SEO |
| Нет canonical / OG image | Любая страница | grep -L 'rel="canonical"' · grep -L 'og:image' | 🟠 SEO |
| tourvisor_id в URL/slug | Slug отеля | grep -E '/[a-z-]+-[0-9]+/' | 🟡 чистота URL |
| Скрипт | Когда запускать | Что проверяет |
|---|---|---|
./scripts/validators/run-all.sh | Перед любым «готово» по импорту/Data Tracker/тирам | Тиры стран, дубли, prod vs local divergence |
./scripts/check-brands.sh public-preview/ | Перед wrangler pages deploy public-preview | Бренды поставщиков (Tourvisor/Booking/Tripadvisor) в DOM |
python3 /WORKJET/scripts/audit.py https://bestonline-tour.ru | Перед релизом, раз в месяц на prod | 15 категорий / 113 пунктов: meta, Schema, OG, footer, leaked brands |
date('Y')