Динамічний Sitemap: генерація з БД для інтернет-магазинів

Каталог зростає, а карта сайту залишається статичною — і нові адреси просто не потрапляють у пошук. Ми розробляємо динамічний sitemap: карта збирається з бази даних і оновлюється автоматично. Це прибирає ручну роботу з картою сайту і скорочує час на її актуалізацію в рази.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Динамічний Sitemap: генерація з БД для інтернет-магазинів
Середній
від 1 дня до 3 днів
Часті запитання

Динамічний sitemap: чому карта сайту застаріває і що це ламає

Статичний sitemap.xml — це знімок каталогу на момент збірки. Поки файл лежить у корені, каталог живе своїм життям: товари з'являються та зникають, змінюються ціни, відкриваються нові категорії, частина адрес віддає 404 або редирект.

Пошуковий робот приходить за розкладом і бачить набір URL, якого вже немає, а нових сторінок у ньому просто не було. Чим активніший магазин, тим сильніше розходяться файл і реальність.

Ціна розходження вимірна. Новий товар, що не потрапив у карту сайту інтернет-магазину, чекає обходу тижнями — увесь цей час він не показується у видачі, і трафік, який міг би йти на картку, витікає до конкурентів.

Видалені позиції залишаються у файлі й тягнуть краулінговий бюджет на себе: робот витрачає ліміт обходів на сторінки-привиди замість живого асортименту.

Якщо карта генерується вручну або за розкладом раз на добу, розрив тільки зростає — при вигрузці в тисячі SKU добова затримка означає, що частина каталогу не індексується взагалі.

Окрема проблема — ліміти формату. Один файл вміщає обмежену кількість адрес, тому великий каталог потребує розбивки на кілька карт і індексного файлу, який на них посилається.

Зібраний руками набір швидко втрачає консистентність: частина карт не оновлюється, частина посилається на застарілі розділи, а пошуковик, отримавши суперечливі сигнали, знижує довіру до джерела.

Динамічний sitemap вирішує це інакше: адреси формуються запитом до бази в момент звернення робота, тому карта завжди відображає поточний стан каталогу. Нижче розбираємо, як це влаштовано і які вузькі місця закриває.

Що дає генерація карти сайту з бази даних

Статичний файл карти сайту живе окремо від каталогу: товар додали, ціну змінили, позицію зняли з продажу — а у файлі й досі старий набір адрес. Пошуковий робот приходить за ним, натрапляє на неіснуючі сторінки та знижує частоту обходу розділу.

Генерація з бази даних прибирає цей розрив: карта збирається запитом до каталогу, а не руками контент-менеджера.

Швидкість індексації тут — наслідок регулярності. Коли карта перезбирається за розкладом або за подією зміни запису, нова адреса потрапляє до неї в тому ж циклі, і робот забирає її на найближчому обході, а не після наступного релізу.

Частка проіндексованих карток зростає не тому, що ми «попросили» пошуковик, а тому що він перестає витрачати обхід на биті та дубльовані посилання.

Актуальність карти сайту тримається на правилах відбору, а не на дисципліні редактора. У вибірку потрапляють лише опубліковані позиції з непорожнім залишком або доступним передзамовленням, сторінки-дублі склеюються канонічною адресою, а зняті з продажу виходять з карти одразу.

Автоматичне оновлення закриває й рутину: правки під час масового перейменування категорій або зміни структури посилань більше не перетворюються на окрему задачу на тиждень.

Побічний, але відчутний ефект — зняте навантаження з ручних правок. Редактор займається контентом, а не звіркою адрес, і при цьому карта завжди відображає те, що реально лежить у базі. Розбираємо, як це влаштовано і що потрібно передбачити в каталозі.

Способи віддачі карти: файл, потік, розбивка за розділами

Віддача карти сайту — це компроміс між свіжістю даних, навантаженням на базу та тим, як швидко пошуковий робот обходить каталог. Статичний файл віддається миттєво й не торкається бази, але застаріває між перезбираннями: новий товар з'являється в каталозі, а в карті його ще немає.

Генерація за запитом завжди віддає актуальний набір URL, але кожен обхід робота — це запит до бази, і на каталозі в десятки тисяч позицій він має вкладатися у відведений час.

Варіант Коли підходить Обмеження
Статичний файл Каталог змінюється рідко, до кількох тисяч URL Потребує перезбирання при кожному оновленні, відстає від даних
Генерація за запитом Часті зміни, товари й ціни оновлюються постійно Навантаження на базу при кожному обході, потрібен кеш
Розбивка на карти за розділами Великий каталог, десятки тисяч URL Потрібен індексний файл і логіка розбиття за розділами

Ліміти карти сайту задають саму необхідність розбивки: один файл вміщає до 50 000 URL і до 50 МБ, тому великий каталог фізично не поміщається в одну карту.

Тоді карту ділять за розділами каталогу — категорії, товари, статті, — а кореневий індексний файл посилається на кожну частину. Робот обходить розділи незалежно, і оновлення одного з них не змушує перезбирати всю карту.

На практиці ці варіанти комбінують: важкі й рідко змінювані розділи віддають статикою, а товарні — генерують за запитом з кешем на стороні застосунку. Кеш знімає навантаження з бази, а розбивка тримає кожну частину в межах лімітів. Такий гібрид дає актуальні дані без пікового навантаження на каталог у момент обходу.

Як ми будуємо генерацію: від аудиту бази до регламенту оновлення

Генерація динамічного sitemap починається не з коду, а з інвентаризації даних: які таблиці містять товари, категорії, бренди та статті, як пов'язані сутності, чи є прапорці публікації та дати зміни.

Від цього залежить, чи потрапить у карту реально доступна сторінка або бите посилання, яке пошуковик викине з індексу.

  1. Аудит бази даних. Дивимося структуру таблиць, зв'язки, ознаки активності запису, історію видалень і чернеток. Фіксуємо, які сутності взагалі повинні потрапляти в карту, а які закриті від індексації.
  2. Проєктування запитів. Будуємо вибірки по кожній групі сторінок окремо, щоб важкий каталог не гальмував віддачу карти. Додаємо фільтри за статусом публікації та датою останньої зміни — це дає коректний lastmod.
  3. Налаштування віддачі. Карта збирається на льоту або кешується і роздається за стабільною адресою з коректним типом вмісту. Для великих каталогів розбиваємо її на частини і зв'язуємо індексним файлом, щоб пошуковий робот забирав дані порціями.
  4. Перевірка повноти. Звіряємо число записів у карті з числом активних сторінок у базі, ловимо дублі, порожні категорії та адреси з помилковими параметрами. Окремо перевіряємо, що закриті розділи не просочилися у видачу.
  5. Регламент оновлення. Карта повинна перезбиратися при зміні каталогу, а не за забутим ручним запуском. Налаштовуємо перезбирання за подією та періодичну звірку, щоб нові товари з'являлися в індексі того ж дня.
  6. Передача та моніторинг. Віддаємо команді замовника опис логіки, точки контролю та порядок дій при збої. Додаємо оповіщення, якщо карта перестала оновлюватися або віддає порожню відповідь.

Такий порядок прибирає ручне збирання карти і тримає індекс в актуальному стані без участі людини. Якщо каталог зростає або змінюється структура бази — регламент переглядається точково, без переписування всієї логіки.

Що замовник отримує після впровадження

Після впровадження динамічного sitemap у команди залишається не «магія в коді», а комплект артефактів, за яким систему можна супроводжувати без автора.

Генерація перестає бути чорною скринькою: зрозуміло, звідки беруться адреси, за яким правилом вони потрапляють до карти і що робити, коли структура каталогу змінюється.

  • Конфігурація генерації — файл з параметрами: які сутності потрапляють до карти, ліміт адрес на файл, розбивка на кілька карт, пріоритети та частота оновлення за типами сторінок. Правки вносяться без релізу застосунку.
  • Схема зв'язків таблиць — карта, за якою генератор збирає адреси: товари, категорії, бренди, фільтри, регіональні версії. Видно, яке поле відповідає за ЧПУ, а яке за ознаку публікації.
  • Правила відбору адрес — які записи виключаються: приховані, без залишку, дублі, сторінки-заглушки, технічні розділи. Окремо — правила склейки та пріоритету для сторінок з однаковим вмістом.
  • Обробка великих каталогів — розбивка на індексну карту та дочірні файли, щоб пошукові роботи забирали її частинами і не впиралися в ліміт на один файл.
  • Документація — опис логіки відбору, точок інтеграції з базою та поведінки при зміні структури каталогу. Достатньо, щоб новий інженер розібрався без листування з автором.
  • Регламент оновлення — коли карта перезбирається: за розкладом, за подією публікації або при масовому імпорті. Плюс порядок дій, якщо генерація впала.
  • Моніторинг і логи — звіт за кількістю адрес у кожній карті, оповіщення при різкому падінні або зростанні, історія збірок для розбору інцидентів.
  • Чек-лист приймання — набір перевірок: карта віддається за потрібною адресою, містить лише публічні сторінки, коректно розбита та оновлюється після зміни товару.

Такий комплект знімає головний ризик — залежність від однієї людини. Структура каталогу змінюється, а правила відбору та регламент оновлення залишаються точкою опори: правку можна внести до конфігурації, не переписуючи генератор.

Кейс: як каталог на десятки тисяч карток перестав втрачати адреси

Інтернет-магазин електроніки з каталогом близько 40 000 активних карток: частина позицій сходить з полиці за тижні, нові надходять партіями по кілька сотень.

Sitemap збирався скриптом раз на добу — файл генерувався цілком, лежав одним документом і на боці пошуковика оброблявся частково.

За логами обходу виходило, що до половини адрес товарів не потрапляли в чергу регулярно, а нові картки чекали на перший візит робота в середньому 9–12 днів.

Google Search Console підтверджував картину: частка проіндексованих карток коливалася близько 62%, «Виявлено, але не проіндексовано» зростало швидше, ніж каталог. Маркетинг правив адреси вручну — до 300 правок на місяць ішло тільки на те, щоб виштовхнути нові позиції в обхід.

Що змінили

Зібрали динамічний sitemap: індексний файл плюс розбивка за розділами каталогу, по 5 000 адрес на документ, з коректними lastmod з бази. Генерація йде за подією — товар з'явився, змінив ціну або пішов в архів, — а не за розкладом. Архівні та неактивні картки випадають з карти одразу, дублі закриті канонічними адресами.

Метрики до і після

Показник До Після
Частка проіндексованих карток 62% 94%
Час появи нового товару в обході 9–12 днів 1–2 дні
Ручні правки адрес на місяць ~300 поодинокі

Окремо зняли навантаження: генерація перестала бути нічним важким процесом, карта віддається з кешу й оновлюється інкрементально.

Через два місяці після запуску частка проіндексованих карток тримається вище 90% навіть на піках надходження нових партій — обхід встигає за швидкістю оновлення каталогу.

Чим динамічний sitemap відрізняється від статичного файлу

Статичний файл — це заздалегідь зібраний список адрес, який лежить у корені сайту та віддається як є. Поки структура каталогу змінюється раз на місяць, він працює: файл генерується при релізі, потрапляє у збірку та не потребує окремого сервісу.

Проблема починається там, де адреси з'являються та зникають щодня — картка товару знята з продажу, категорія переїхала, у позиції змінилася адреса. Статичний список у цей момент бреше: він віддає пошуковику адреси, яких уже немає, і мовчить про нові.

Динамічний sitemap збирається на льоту з бази: запит бере активні сутності, застосовує правила видимості та віддає готовий XML за запитом. Ключова відмінність — джерело правди одне.

Адреса сторінки існує рівно тоді, коли існує запис у базі, і жодної окремої синхронізації між каталогом і картою сайту не потрібно.

Заодно вирішується питання обсягу: якщо адрес більше за ліміт на один файл, генератор віддає індекс і розбиває список на частини автоматично, а не вручну при кожному релізі.

Порівняння підходів упирається в частоту змін. Коли доречний статичний файл: лендінги, корпоративні сайти, документація — десятки-сотні адрес, змінюються рідко, генерація на релізі дешевша за будь-який сервіс.

Динамічний sitemap обов'язковий там, де каталог живий: інтернет-магазин, маркетплейс, база оголошень. Тут статичний файл або застаріває між релізами, або потребує ручного вивантаження, яке все одно відстає від реальності.

Інженерно різниця ще й у вартості помилки. Статичний файл легко перевірити очима та закомітити — але він не знає про товар, доданий годину тому. Динамічний потребує кешу та захисту від навантаження, зате віддає актуальну картину на кожен обхід. Для магазину з щоденними поставками це не зручність, а умова індексації нових позицій.

Технічні сумніви: навантаження, кеш, дублі та великі каталоги

Динамічний sitemap читається пошуковими роботами частіше, ніж здається: при активному обході запит надходить кожні кілька хвилин, і щоразу це запит до бази.

Якщо карта будується «на льоту» важким з'єднанням таблиць каталогу, на великому магазині це перетворюється на регулярне пікове навантаження на базу — особливо коли робот обходить карту повністю, а не частинами.

Кешування знімає питання: готова карта віддається з кешу, а перезбирання запускається за подією — додали товар, змінили ціну, зняли з публікації. Між перезбираннями віддача карти не торкається бази взагалі.

Для каталогів на десятки тисяч позицій карта ріжеться на частини за розділами або за діапазонами, і в корені залишається індексний файл — робот забирає лише змінені частини, а не весь список.

Чи не зросте навантаження на базу під час перезбирання?

Перезбирання йде пакетами і у фоні, а не одним важким запитом: база віддає дані порціями, між порціями є пауза. Пік припадає на момент публікації змін, а не на кожен обхід робота.

Якщо каталог оновлюється масово — наприклад, нічною синхронізацією — перезбирання ставиться в чергу після неї, а не паралельно.

Що робити з дублями адрес?

Дублі закриваються на рівні вибірки: у карту потрапляє лише канонічна адреса, а сторінки з параметрами сортування, фільтрів і пагінації виключаються правилом. Товари, доступні за кількома шляхами, віддають одну адресу, решта позначаються канонічними.

Це прибирає ситуацію, коли робот обходить один і той самий товар за десятком адрес і розмиває вагу сторінки.

Що з товарами, яких немає в наявності?

Такі позиції не випадають з карти різко — інакше робот бачить масове зникнення адрес. Вони залишаються з ознакою недоступності, а видаляються з карти лише після того, як товар знято з продажу остаточно. Так карта не «блимає» на кожній зміні складу.

Ці три питання — навантаження, кеш і дублі — закриваються на етапі проєктування генератора, а не після запуску. Якщо карта вже віддається напряму з бази і гальмує каталог, переводимо її на кеш із перезбиранням за подіями без переписування сайту.

Обговоримо ваше завдання і повернемося з оцінкою та планом

Розмова починається не з брифу, а з вашої поточної карти сайту: як вона збирається зараз, скільки URL в індексі, як часто змінюється каталог, що відбувається з товарами, які зняли з продажу.

За цими відповідями видно, чи потрібна генерація з бази, чи достатньо перезбирання за розкладом — і де саме рветься зв'язок між даними та тим, що бачить пошукова система.

Далі ми проходимо стандартний інженерний шлях, і на кожному кроці ви бачите, що і навіщо робиться:

  • Знімаємо поточний стан: вивантаження карти, частка сторінок, що віддають помилку, швидкість відповіді при піковому навантаженні, поведінка при недоступності бази.
  • Узгоджуємо джерела: які таблиці та подання вважаємо істиною, як позначаємо активні, приховані та видалені позиції, що потрапляє в карту, а що закривається від індексації.
  • Проєктуємо генерацію: розбивка на файли за розділами, ліміт посилань на файл, кешування готового результату, інвалідація при зміні каталогу.
  • Впроваджуємо генерацію на тестовому контурі: звіряємо видачу з базою порядково, перевіряємо поведінку при масовому оновленні та при відмові суміжних сервісів.
  • Виводимо в робоче середовище: перемикання без простою, контроль помилок, оповіщення, якщо карта перестала оновлюватися або віддає порожню відповідь.
  • Передаємо експлуатацію: регламент оновлення, точки контролю, інструкція для вашої команди — що робити при збої та як відкотитися на попередню версію.
  • Підтримка після запуску: стежимо за часткою проіндексованих сторінок, реагуємо на зростання кількості виключених URL, доопрацьовуємо правила при змінах у каталозі.

Щоб повернутися з оцінкою та планом, нам потрібен мінімум: адреса сайту, приблизна кількість товарів і розділів, на чому працює база, і як часто змінюється асортимент. Опишіть завдання в цьому обсязі — ми подивимося поточну карту, назвемо терміни етапів і порядок робіт.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060