«Нужно руками создать 16 000 страниц в WordPress — каждую оформить, заполнить, опубликовать. Или выгрузить таблицей в админку. Это займёт год работы».
В БД лежат 16 000 строк. В Bricks — 1 шаблон. Каждую страницу WordPress рендерит на лету, подставляя данные конкретного отеля. Изменили шаблон → все 16 000 страниц обновились. Добавили новый отель — одна строка в БД, страница сразу работает.
Возьмём наш живой пример — отель Alila Kothaifaru Maldives (Tourvisor ID: 79690). Вот что с ним происходит от момента «есть данные в JSON» до «страница открывается в браузере».
meta/hotels.json (7 250 отелей) + meta/details/79690.json (детали Alila: год 2022, атолл Раа, пляж, питание). Это наши исходные файлы — уже собраны.wp eval-file import-hotels.php. Скрипт читает JSON, для каждого отеля вызывает wp_insert_post(), wp_set_object_terms(), update_field(). Запуск 1 раз, потом при добавлении новых данных.wp_posts, связи с таксономиями (страна/регион/атолл) → wp_term_relationships, поля ACF → wp_postmeta. Детально ниже (раздел 3)./destinations/maldives/alila-kothaifaru-maldives/. WordPress парсит URL → понимает: это CPT hotel, slug alila-kothaifaru-maldives → лезет в БД → находит нашу запись (post_id = 12345).single-hotel.brx через dynamic tags подставляет: {post_title} → «Alila Kothaifaru Maldives», {acf:build_year} → «2022», {acf:atoll} → «Раа», breadcrumbs из таксономий, Schema.org собирается автоматом.Alila Kothaifaru Maldives в базе — это 4 связанные записи в 4 таблицах. Ничего лишнего, всё стандарт WordPress.
wp_posts — основная запись
Одна строка на отель
| post_id | post_type | post_title | post_name (slug) | post_status |
|---|---|---|---|---|
12345 | hotel | Alila Kothaifaru Maldives | alila-kothaifaru-maldives | publish |
wp_term_relationships — связи с таксономиями
Несколько строк (по одной на каждую связь)
| post_id | term_id | таксономия | значение |
|---|---|---|---|
12345 | 1 | country | Мальдивы → maldives |
12345 | 2 | region | Мале → male |
12345 | 3 | subregion | Раа (атолл) → raa-atoll |
12345 | 42 | stars | 5★ |
12345 | 51 | hotel_type | остров-резорт → island-resort |
wp_postmeta — ACF поля (структурированные данные)
По одной строке на каждое поле
| post_id | meta_key | meta_value | откуда берём |
|---|---|---|---|
12345 | tv_id | 79690 | id из hotels.json |
12345 | rating | 5 | rating из hotels.json |
12345 | build_year | 2022 | сommon.build из details |
12345 | atoll | Раа | regex из сommon.place |
12345 | beach_raw | песчаный частный пляж | первый <LI> из infrastructure.beach |
12345 | meal_codes | BB,HB,FB,AI | regex из meals.list |
wp_terms — справочник terms (общий на всю систему)
Заполняется один раз при импорте
| term_id | name | slug | parent | таксономия |
|---|---|---|---|---|
| 1 | Мальдивы | maldives | 0 | country |
| 2 | Мале | male | 1 | region (parent=Мальдивы) |
| 3 | Раа (атолл) | raa-atoll | 2 | subregion (parent=Мале) |
🎯 Вывод: даже на 16 000 отелей это всего 4 таблицы с миллионом записей в сумме. MySQL спокойно держит. Индексы по post_type, post_name, meta_key делают выборки быстрыми (~20ms).
На каждой странице отеля мы и Tourvisor делим зоны ответственности. Мы — за SEO и обёртку. Tourvisor — за контент карточки и бронирование.
⚠ Правовая граница: факты из Tourvisor (год, атолл, 145 км от аэропорта) — можно использовать. Авторский текст («В атолле Раа, на острове Котаифару; площадь 11,2 га, трансфер на гидросамолёте...») — копировать нельзя, это произведение. Мы берём только структурированные поля и собираем свой шаблонный текст.
Логин bestonline, пароль BestonlineTour2026@
Помимо страниц отелей мы получаем бесплатно целый набор посадочных страниц-категорий — каждая со своим SEO-потенциалом. Всё из той же базы.
/destinations/maldives/ ← SEO-посадочная «Отели Мальдив»/destinations/maldives/male/ ← «Отели в районе Мале»/destinations/maldives/male/raa-atoll/ ← «Отели в атолле Раа»/destinations/maldives/male/raa-atoll/alila-kothaifaru/Плюс сквозные таксономии (без иерархии):
| Таксономия | URL-пример | Что даёт |
|---|---|---|
Звёзды (stars) | /destinations/stars/5/ | «Все 5★ отели» — запрос «5 звёзд отели» |
Тип отеля (hotel_type) | /destinations/island-resort/ | «Остров-резорты» — запрос «острова резорт» |
По атоллам Мальдив есть две стратегии. Выбираем таксономию — больше SEO-потенциала.
Атолл хранится как строка в wp_postmeta.
subregionАтолл — это term в таксономии subregion, с parent=region.
/destinations/maldives/male/raa-atoll/ — полноценная SEO-посадочная💡 Правило: если у сущности есть SEO-потенциал (пользователи гуглят «отели атолл Раа») → таксономия. Если это просто отображаемое поле (год постройки) → ACF.
| Фаза | Мы (SEO/контент) | Программист WP | Tourvisor |
|---|---|---|---|
| Фаза 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] в статьях |
— |