Ваш сайт зростає — тисячі товарів, десятки категорій, сотні статей. Нові сторінки потрапляють в індекс тижнями, хоча ви оновили sitemap вручну місяць тому. Знайомо? Статичний XML-файл швидко застаріває, а ручне редагування призводить до помилок: забули додати нову категорію, не видалили видалену сторінку. Ми налаштовуємо динамічну генерацію sitemap з бази даних — вона завжди актуальна та не потребує ручного оновлення. Розберемо, як це працює і чому це критично для сайтів із 10 000+ URL.
Проблеми, які вирішує динамічний sitemap
Застарілий sitemap. Якщо ви редагуєте sitemap вручну, неминучі помилки: забули додати нову категорію, не видалили видалену сторінку. Динамічна генерація виключає людський фактор — дані беруться безпосередньо з БД.
Величезні каталоги. Для інтернет-магазину з 100 000+ товарів один sitemap не підходить — перевищує ліміт у 50 000 URL. Ми розбиваємо sitemap на частини (chunks) і створюємо sitemap index.
Повільна індексація. Пошукові системи не знають про нові сторінки, поки ви не відправите sitemap. Ми автоматизуємо відправку пінгів у Google та Яндекс після кожного оновлення.
Чому статичний sitemap небезпечний для великих сайтів?
Статичний sitemap — це файл, який ви редагуєте вручну. Для сайту з 50 000 товарів це десятки годин роботи на місяць. Кожен раз при додаванні або видаленні сторінки потрібно правити XML. У результаті — помилки, пропущені URL, невірні дати lastmod. Пошукові системи втрачають довіру до sitemap і перестають його враховувати. Динамічна генерація вирішує цю проблему повністю: дані завжди свіжі, помилки виключені.
Як динамічний sitemap прискорює індексацію?
Після налаштування динамічної генерації sitemap оновлені сторінки з'являються у файлі протягом хвилини після публікації. Відправка пінгів відбувається автоматично — краулери дізнаються про нові URL миттєво. У результаті сторінки індексуються в 3–5 разів швидше порівняно з ручним оновленням. Ми заміряли на проектах із каталогами 50 000+ товарів: середній час до першої появи у видачі скоротився з тижнів до 8–12 годин. Економія на помилках індексації може сягати десятків тисяч гривень на місяць.
Як гарантувати, що sitemap завжди свіжий?
Ключовий елемент — кешування з автоматичною інвалідацією. Генерація sitemap для 100 000 товарів може тривати кілька секунд. Без кешування кожен краулер викликатиме перерахунок, що навантажує БД та сервер. Ми кешуємо результат на годину та автоматично інвалідуємо кеш при зміні даних. Для цього використовуємо observer на моделі Product, який очищає кеш при кожному збереженні. Детальніше про стандарт sitemap можна дізнатися в Wikipedia.
Як ми це робимо: стек та архітектура
Використовуємо Laravel 11 з Blade-шаблонами для генерації XML. Для великих каталогів застосовуємо chunked-підхід: кожен розділ — окремий файл. Ось мінімальна архітектура:
// routes/web.php та SitemapController
Route::get('/sitemap.xml', [SitemapController::class, 'index']);
Route::get('/sitemap-products-{page}.xml', [SitemapController::class, 'products']);
Route::get('/sitemap-categories.xml', [SitemapController::class, 'categories']);
Route::get('/sitemap-articles.xml', [SitemapController::class, 'articles']);
public function index(): Response
{
$productPages = ceil(Product::where('is_active', true)->count() / 1000);
$sitemaps = [];
for ($i = 1; $i <= $productPages; $i++) {
$sitemaps[] = [
'loc' => route('sitemap.products', ['page' => $i]),
'lastmod' => now()->format('Y-m-d'),
];
}
$sitemaps[] = ['loc' => route('sitemap.categories'), 'lastmod' => now()->format('Y-m-d')];
$sitemaps[] = ['loc' => route('sitemap.articles'), 'lastmod' => now()->format('Y-m-d')];
return response()->view('sitemap.index', compact('sitemaps'))->header('Content-Type', 'application/xml');
}
Чанкована генерація товарів
public function products(int $page): Response
{
$products = Product::where('is_active', true)
->select(['slug', 'updated_at', 'main_image'])
->orderBy('id')
->forPage($page, 1000)
->get();
return response()->view('sitemap.products', compact('products'))->header('Content-Type', 'application/xml')->header('Cache-Control', 'public, max-age=3600');
}
Blade-шаблон включає підтримку зображень:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
@foreach ($products as $product)
<url>
<loc>{{ url('/products/' . $product->slug) }}</loc>
<lastmod>{{ $product->updated_at->format('Y-m-d') }}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
@if ($product->main_image)
<image:image>
<image:loc>{{ $product->main_image }}</image:loc>
</image:image>
@endif
</url>
@endforeach
</urlset>
Чому важливо кешувати sitemap?
Генерація sitemap для 100 000 товарів може тривати кілька секунд. Без кешування кожен краулер викликатиме перерахунок, що навантажує БД та сервер. Ми кешуємо результат на годину та автоматично інвалідуємо кеш при зміні даних.
public function products(int $page): Response
{
$cacheKey = "sitemap:products:{$page}";
$content = Cache::remember($cacheKey, now()->addHour(), function () use ($page) {
$products = Product::where('is_active', true)
->select(['slug', 'updated_at', 'main_image'])
->orderBy('id')
->forPage($page, 1000)
->get();
return view('sitemap.products', compact('products'))->render();
});
return response($content)->header('Content-Type', 'application/xml');
}
Інвалідація за подією saved моделі Product (через observer) — гарантує, що sitemap завжди свіжий.
Автоматична відправка в пошукові системи
Після кожного оновлення відправляємо пінги:
// Artisan command
Http::get('https://www.google.com/ping', ['sitemap' => url('/sitemap.xml')]);
Http::get('https://webmaster.yandex.ru/ping', ['sitemap' => url('/sitemap.xml')]);
Порівняння продуктивності: статичний vs динамічний
| Параметр | Статичний | Динамічний |
|---|---|---|
| Час генерації | 0 (готовий файл) | 0.5–5 сек (залежно від кількості URL) |
| Актуальність | Ручне оновлення | Автоматична з БД |
| Підтримка великих каталогів | Потребує ручного розбиття | Чанкована генерація |
| Помилки | Часті (людський фактор) | Виключені |
| Час підтримки | Високий | Мінімальний |
| Підтримка зображень | Потребує ручного додавання | Автоматично з моделі |
Типові проблеми та їх вирішення
| Проблема | Вирішення |
|---|---|
| Sitemap перевищує 50 МБ | Автоматичне розбиття на чанки |
| Не всі сторінки в sitemap | Повна інвентаризація маршрутів |
| Повільна генерація | Кешування з інвалідацією за подіями |
| Невірний lastmod | Використовувати updated_at з БД |
Що входить у роботу
- Аудит поточної структури сайту
- Проектування архітектури sitemap: розбивка на файли, визначення пріоритетів
- Реалізація чанкованої генерації з кешуванням
- Налаштування автоматичної відправки пінгів
- Документація та передача доступів
- Навчання вашої команди (як додавати нові типи сторінок)
Строки налаштування
Від 1 до 2 днів залежно від складності каталогу. Вартість розраховується індивідуально після аналізу вашого проекту.
Наші інженери мають 7+ років досвіду в розробці високонавантажених сайтів. Ми реалізували динамічну генерацію sitemap для більш ніж 50 проектів, включаючи інтернет-магазини з каталогами до 500 000 товарів. Замовте налаштування динамічного sitemap вже сьогодні — отримайте консультацію з оптимізації індексації. Зв'яжіться з нами, щоб прискорити індексацію вашого сайту.







