← Все задачи

🏗 Архитектура Bestonline-tour.ru

Как из одной базы и одного шаблона получается 16 000 посадочных страниц — на примере отеля Alila Kothaifaru Maldives
📅 21.04.2026 🎯 Для всей команды 📖 Чтение ~10 минут

1 Главное заблуждение

❌ Что многие представляют

«Нужно руками создать 16 000 страниц в WordPress — каждую оформить, заполнить, опубликовать. Или выгрузить таблицей в админку. Это займёт год работы».

✅ Как на самом деле

В БД лежат 16 000 строк. В Bricks — 1 шаблон. Каждую страницу WordPress рендерит на лету, подставляя данные конкретного отеля. Изменили шаблон → все 16 000 страниц обновились. Добавили новый отель — одна строка в БД, страница сразу работает.

🗄
16 000
записей
в базе данных
+
🎨
1
шаблон
Bricks template
=
🌐
16 000
живых URL
для Google/Яндекс

2 Путь одного отеля — от JSON до страницы

Возьмём наш живой пример — отель Alila Kothaifaru Maldives (Tourvisor ID: 79690). Вот что с ним происходит от момента «есть данные в JSON» до «страница открывается в браузере».

1
📁 Данные приходят в JSON
Из Tourvisor API выгружаем meta/hotels.json (7 250 отелей) + meta/details/79690.json (детали Alila: год 2022, атолл Раа, пляж, питание). Это наши исходные файлы — уже собраны.
2
🤖 WP-CLI скрипт импортирует отель в БД
Программист запускает wp eval-file import-hotels.php. Скрипт читает JSON, для каждого отеля вызывает wp_insert_post(), wp_set_object_terms(), update_field(). Запуск 1 раз, потом при добавлении новых данных.
3
🗄 В БД MySQL появляется запись
Данные Alila размазываются по 4 таблицам WordPress: основная запись → wp_posts, связи с таксономиями (страна/регион/атолл) → wp_term_relationships, поля ACF → wp_postmeta. Детально ниже (раздел 3).
4
🌐 Пользователь открывает URL
Заходит на /destinations/maldives/alila-kothaifaru-maldives/. WordPress парсит URL → понимает: это CPT hotel, slug alila-kothaifaru-maldives → лезет в БД → находит нашу запись (post_id = 12345).
5
🎨 Bricks template рендерит страницу
Шаблон single-hotel.brx через dynamic tags подставляет: {post_title} → «Alila Kothaifaru Maldives», {acf:build_year} → «2022», {acf:atoll} → «Раа», breadcrumbs из таксономий, Schema.org собирается автоматом.
6
⚡ HTML попадает к пользователю (через Redis-кеш)
Первый запрос рендерится из БД (~300ms), попадает в Redis. Все следующие запросы — из кеша (~10ms). Когда мы добавили данные или изменили шаблон — кеш сбрасывается, пересчёт один раз.

3 Что реально лежит в БД по одному отелю

Alila Kothaifaru Maldives в базе — это 4 связанные записи в 4 таблицах. Ничего лишнего, всё стандарт WordPress.

🏨 wp_posts — основная запись Одна строка на отель
post_idpost_typepost_titlepost_name (slug)post_status
12345hotelAlila Kothaifaru Maldivesalila-kothaifaru-maldivespublish
🏷 wp_term_relationships — связи с таксономиями Несколько строк (по одной на каждую связь)
post_idterm_idтаксономиязначение
123451countryМальдивы → maldives
123452regionМале → male
123453subregionРаа (атолл) → raa-atoll
1234542stars5★
1234551hotel_typeостров-резорт → island-resort
📋 wp_postmeta — ACF поля (структурированные данные) По одной строке на каждое поле
post_idmeta_keymeta_valueоткуда берём
12345tv_id79690id из hotels.json
12345rating5rating из hotels.json
12345build_year2022сommon.build из details
12345atollРааregex из сommon.place
12345beach_rawпесчаный частный пляжпервый <LI> из infrastructure.beach
12345meal_codesBB,HB,FB,AIregex из meals.list
📚 wp_terms — справочник terms (общий на всю систему) Заполняется один раз при импорте
term_idnameslugparentтаксономия
1Мальдивыmaldives0country
2Малеmale1region (parent=Мальдивы)
3Раа (атолл)raa-atoll2subregion (parent=Мале)

🎯 Вывод: даже на 16 000 отелей это всего 4 таблицы с миллионом записей в сумме. MySQL спокойно держит. Индексы по post_type, post_name, meta_key делают выборки быстрыми (~20ms).

4 Анатомия страницы — кто за что отвечает

На каждой странице отеля мы и Tourvisor делим зоны ответственности. Мы — за SEO и обёртку. Tourvisor — за контент карточки и бронирование.

🟢 Наше (SEO-обёртка)

  • Title — «Отель Alila Kothaifaru Maldives 5★ на Мальдивах — отзывы, цены, туры 2026»
  • Meta description — уникальный на каждую страницу
  • Breadcrumbs — Главная → Мальдивы → Alila
  • H1 — «Alila Kothaifaru Maldives — отель на Мальдивах»
  • Бокс «Главное» — формат, год, рейтинг, атолл, пляж, питание, сезон, перелёт, виза
  • FAQ — 5-7 вопросов (Schema FAQPage)
  • Schema.org — Hotel + FAQPage + BreadcrumbList
  • OG-теги, canonical, hreflang
  • Похожие отели — перелинковка

🟣 Виджет Tourvisor

  • Фото отеля (галерея)
  • Описание отеля (их авторский текст — мы не копируем!)
  • Список услуг (wi-fi, спа, ресторан)
  • Номера и типы размещения
  • Питание (детально)
  • Актуальные цены (онлайн)
  • Форма бронирования
  • Карта расположения

⚠ Правовая граница: факты из Tourvisor (год, атолл, 145 км от аэропорта) — можно использовать. Авторский текст («В атолле Раа, на острове Котаифару; площадь 11,2 га, трансфер на гидросамолёте...») — копировать нельзя, это произведение. Мы берём только структурированные поля и собираем свой шаблонный текст.

🔗 Посмотреть вживую:

Логин bestonline, пароль BestonlineTour2026@

5 Полная структура сайта — не только отели

Помимо страниц отелей мы получаем бесплатно целый набор посадочных страниц-категорий — каждая со своим SEO-потенциалом. Всё из той же базы.

🌍 Страна country 10-30 стран
│   /destinations/maldives/ ← SEO-посадочная «Отели Мальдив»
└── 📍 Регион region ~150 регионов
    │   /destinations/maldives/male/ ← «Отели в районе Мале»
    │
    └── 🏝 Субрегион / атолл subregion ~500 субрегионов
        │   /destinations/maldives/male/raa-atoll/ ← «Отели в атолле Раа»
        │
        └── 🏨 Отель CPT hotel ~16 000 отелей
            /destinations/maldives/male/raa-atoll/alila-kothaifaru/
~16 000
Страниц отелей
~500
Страниц атоллов/районов
~150
Страниц регионов
10-30
Страниц стран
~16 700
Итого посадочных

Плюс сквозные таксономии (без иерархии):

ТаксономияURL-примерЧто даёт
Звёзды (stars)/destinations/stars/5/«Все 5★ отели» — запрос «5 звёзд отели»
Тип отеля (hotel_type)/destinations/island-resort/«Остров-резорты» — запрос «острова резорт»

6 Атолл — поле или таксономия?

По атоллам Мальдив есть две стратегии. Выбираем таксономию — больше SEO-потенциала.

Вариант A: ACF поле

Атолл хранится как строка в wp_postmeta.

+ Плюсы:
  • Проще в реализации
  • Меньше таблиц
− Минусы:
  • Нет посадочной «все отели атолла Раа»
  • Нет фильтра по атоллу на странице страны
  • Теряем SEO-запросы типа «отели раа атолл»

💡 Правило: если у сущности есть SEO-потенциал (пользователи гуглят «отели атолл Раа») → таксономия. Если это просто отображаемое поле (год постройки) → ACF.

7 Кто что делает на каждой фазе

ФазаМы (SEO/контент)Программист WPTourvisor
Фаза 0
Research
✅ Сделали: выгрузили 7 250 отелей в JSON, 42 с деталями. Демо страницы. Предоставил API. Ждём JWT и embed-код виджета.
Фаза 1
Инфраструктура
Готовим список ACF-полей и URL-схему (готово — в ТЗ) Делает сейчас: CPT, таксономии, ACF, WP-CLI импорт, Bricks template, Schema, archive-страницы
Фаза 2
Контент
Claude API batch → intro + FAQ для 16k отелей, шаблоны Title/Meta, AI-тексты Интеграция AI-контента в ACF поля Ответил про embed-код → интегрируем виджет
Фаза 3
Перелинковка
Правила «похожие отели», пилларные страницы стран Bricks Loop Query блоки перелинковки
Фаза 4
Блог
Статьи, tokens для связи статья↔отели Шорткод [tourvisor_hotel id] в статьях