Одно из первых сообщений от Яндекс.Вебмастер было: «Sitemap-файл не найден». Я не понял, о чём речь. Какой ещё sitemap? Зачем он нужен? У меня же есть сайт, есть статьи, всё работает. Почему поисковик требует какой-то файл?
Прошло несколько недель, прежде чем я разобрался. Оказалось, что sitemap — это карта сайта. Файл, в котором перечислены все страницы, которые я хочу показать поисковикам. Без него роботы ходят по сайту наугад, переходят по ссылкам, могут что-то пропустить. С ним — у них есть чёткий список, куда идти.
В предыдущей статье я рассказывал про robots.txt — файл, который говорит роботам, куда можно ходить, а куда нельзя. Sitemap — это дополнение к нему. Robots.txt говорит, куда не надо. Sitemap говорит, куда надо. Вместе они создают понятную систему для поисковиков.
Сегодня расскажу, как я создал sitemap.xml без единого плагина. Только код. С примерами, которые можно сразу использовать.
Что такое sitemap.xml и зачем он нужен

Sitemap.xml — это XML-файл, в котором перечислены все страницы сайта, которые должны быть проиндексированы. Для каждой страницы указывается адрес, дата последнего изменения, приоритет и частота обновления.
Если по-простому: это как оглавление книги. Когда робот приходит на сайт, он может переходить по ссылкам и находить страницы. Но если ссылок мало или они плохо связаны между собой, робот может что-то пропустить. Sitemap говорит: «Вот все страницы, которые есть. Проверь их».
Зачем это нужно? Вот несколько причин, которые я понял на своём опыте.
Роботы быстрее находят новые статьи. Если вы только что опубликовали материал, sitemap сообщит об этом.
Роботы не пропускают страницы. Если статья плохо связана ссылками с другими страницами, sitemap всё равно её покажет.
Вы видите полную картину сайта. В Яндекс.Вебмастере и Google Search Console можно посмотреть, какие страницы были проиндексированы, а какие нет.
Это улучшает и ускоряет индексацию в целом. Поисковики доверяют сайтам, у которых есть sitemap.
Честно говоря, когда я только создал сайт, я был уверен, что поисковики сами всё найдут. Наивный. Они, конечно, найдут — но это может занять недели или месяцы. С sitemap процесс ускоряется в разы.
Почему я решил сделать sitemap без плагинов
Самый простой путь — установить плагин вроде Yoast SEO или Rank Math. Они автоматически генерируют sitemap. Но я отказался от этой идеи по нескольким причинам.
Во-первых, я хотел контролировать каждый аспект. Что попадает в sitemap, что нет. Как формируются даты. Какой приоритет у страниц.
Во-вторых, я не хотел зависеть от плагинов. Если разработчик перестанет обновлять плагин или WordPress что-то сломает — я останусь с проблемой. А если код мой, я знаю, как его исправить.
В-третьих, мне было интересно разобраться. Как это работает изнутри. Как формируется XML. Как WordPress отдаёт файлы.
И знаете что? Это оказалось не так сложно. Sitemap состоит из нескольких блоков кода, которые я добавил в functions.php дочерней темы. Всё работает автоматически. Новые статьи появляются в sitemap сразу после публикации.
Как создать sitemap.xml без плагинов
Вот код, который я использую. Покажу его полностью, а потом разберу каждую часть.
// ========== НАЧАЛО БЛОКА: XML-карта сайта ==========
function seo_add_sitemap_rewrite() {
add_rewrite_rule( '^sitemap\.xml$', 'index.php?seo_sitemap=1', 'top' );
}
add_action( 'init', 'seo_add_sitemap_rewrite' );
function seo_add_sitemap_query_var( $vars ) {
$vars[] = 'seo_sitemap';
return $vars;
}
add_filter( 'query_vars', 'seo_add_sitemap_query_var' );
function seo_sitemap_handler() {
if ( get_query_var( 'seo_sitemap' ) != 1 ) {
return;
}
header( 'Content-Type: application/xml; charset=utf-8' );
header( 'X-Robots-Tag: noindex, follow' );
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
echo '<url><loc>' . esc_url( home_url( '/' ) ) . '</loc><priority>1.0</priority><changefreq>daily</changefreq><lastmod>' . date( 'Y-m-d' ) . '</lastmod></url>' . "\n";
$posts = get_posts( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'modified',
'order' => 'DESC',
) );
foreach ( $posts as $post ) {
$lastmod = get_post_modified_time( 'Y-m-d', false, $post->ID );
echo '<url><loc>' . esc_url( get_permalink( $post->ID ) ) . '</loc><priority>0.8</priority><changefreq>weekly</changefreq><lastmod>' . esc_html( $lastmod ) . '</lastmod></url>' . "\n";
}
$categories = get_categories( array( 'hide_empty' => true ) );
foreach ( $categories as $cat ) {
$cat_posts = get_posts( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 1,
'category' => $cat->term_id,
'orderby' => 'modified',
'order' => 'DESC',
) );
$cat_lastmod = ! empty( $cat_posts )
? get_post_modified_time( 'Y-m-d', false, $cat_posts[0]->ID )
: date( 'Y-m-d' );
echo '<url><loc>' . esc_url( get_category_link( $cat->term_id ) ) . '</loc><priority>0.5</priority><changefreq>weekly</changefreq><lastmod>' . esc_html( $cat_lastmod ) . '</lastmod></url>' . "\n";
}
$pages = get_pages( array( 'post_status' => 'publish', 'hierarchical' => 0 ) );
foreach ( $pages as $page ) {
if ( get_option( 'page_on_front' ) == $page->ID ) {
continue;
}
$lastmod = get_post_modified_time( 'Y-m-d', false, $page->ID );
echo '<url><loc>' . esc_url( get_permalink( $page->ID ) ) . '</loc><priority>0.6</priority><changefreq>monthly</changefreq><lastmod>' . esc_html( $lastmod ) . '</lastmod></url>' . "\n";
}
echo '</urlset>';
exit;
}
add_action( 'template_redirect', 'seo_sitemap_handler' );
// ========== КОНЕЦ БЛОКА ========== Теперь разберём, что здесь к чему.
Правило перезаписи
Функция seo_add_sitemap_rewrite создаёт правило, которое говорит WordPress: «Если кто-то открывает адрес /sitemap.xml — покажи не страницу 404, а специальный обработчик».
add_rewrite_rule добавляет это правило. Параметр top означает, что правило проверяется в первую очередь, до всех остальных.
Функция seo_add_sitemap_query_var добавляет переменную seo_sitemap в список разрешённых. Это нужно, чтобы WordPress понял, что мы хотим обработать этот запрос.
Генерация XML
Функция seo_sitemap_handler — сердце sitemap. Она делает несколько вещей.
Проверяет, что запрос действительно к sitemap.
Устанавливает заголовки: тип контента XML и запрет индексации самого файла через
X-Robots-Tag: noindex, follow.Открывает XML-структуру:
<urlset>.Добавляет главную страницу с приоритетом 1.0 и частотой обновления daily.
Проходит по всем опубликованным постам и добавляет их с приоритетом 0.8 и частотой weekly.
Проходит по всем рубрикам с хотя бы одной статьёй и добавляет их с приоритетом 0.5.
Проходит по всем опубликованным страницам (Pages) и добавляет их с приоритетом 0.6.
Для каждого поста, рубрики и страницы на моем сайте указывается lastmod — дата последнего изменения. Это помогает поисковикам понять, что страница обновилась, и переиндексировать её.
Для рубрик я беру дату последнего изменения самой свежей статьи в этой рубрике. Так поисковик видит, что рубрика обновляется. Если статей в рубрике нет вообще — ставлю текущую дату.
Страницы (Pages) добавляю все, кроме главной — она уже добавлена отдельно с приоритетом 1.0. Иначе получится дубль.
Подключение обработчика
add_action( 'template_redirect', 'seo_sitemap_handler' ) говорит WordPress: «Когда загружается шаблон — проверь, не запрос ли это к sitemap. Если да — запусти обработчик».
Почему template_redirect, а не init? Потому что на этапе init WordPress ещё не знает, какой шаблон загружается. А на template_redirect — уже знает. И мы можем перехватить запрос до того, как загрузится шаблон.
Что нужно сделать после добавления кода

После того как я добавил этот код в functions.php, я сделал ещё один шаг. Без него sitemap не заработает.
Я зашёл в админку WordPress → «Настройки» → «Постоянные ссылки» и нажал «Сохранить изменения». Это обновляет правила перезаписи. Без этого шага новое правило /sitemap.xml не будет работать.
После этого я открыл в браузере https://milyutin-codes.ru/sitemap.xml. И увидел XML-файл со списком страниц. Это был момент радости. Первый sitemap, который я создал сам.
Ошибки, которые я совершил с sitemap
Я не могу сказать, что всё было гладко. Вот несколько ошибок, которые я допустил.
Первая: я забыл сохранить постоянные ссылки. Я добавил код, открыл /sitemap.xml — и увидел ошибку 404. Я не мог понять, в чём дело. Оказалось, что нужно просто зайти в «Постоянные ссылки» и нажать «Сохранить». После этого всё заработало.
Вторая: все даты lastmod были одинаковыми. Сначала я использовал date( 'Y-m-d' ) для всех страниц. В итоге у всех страниц была одна и та же дата — сегодняшняя. Поисковик думает, что все страницы обновляются каждый день, и перестаёт верить этим датам. Я исправил: теперь для каждого поста и страницы берётся дата последнего изменения через get_post_modified_time.
Третья: sitemap был недоступен. В какой-то момент Яндекс.Вебмастер начал показывать ошибку: «Sitemap недоступен». Я проверил — файл открывается. Потом понял: проблема была в кэше хостинга. Я отключил кэш для этой страницы и добавил заголовок Cache-Control: no-cache. Проблема решилась.
Четвёртая: я не добавил sitemap в robots.txt. Sitemap работал, но роботы о нём не знали. Пришлось добавлять строку Sitemap: https://milyutin-codes.ru/sitemap.xml в robots.txt.
Пятая: я не отправил sitemap в поисковики. Просто создать файл недостаточно. Нужно сообщить поисковикам, что он существует. Я отправил его в Яндекс.Вебмастер и Google Search Console через специальные разделы.
Как проверить, что sitemap работает
После того как я создал sitemap, я проверяю его несколькими способами.
Открываю
https://сайт.ru/sitemap.xmlв браузере. Если вижу XML-структуру — файл работает.Проверяю, что в sitemap есть главная страница, все статьи, все рубрики и все страницы.
Проверяю, что даты
lastmodразные для разных страниц.Отправляю sitemap в Яндекс.Вебмастер → «Индексирование» → «Sitemap-файлы».
Отправляю sitemap в Google Search Console → «Файлы Sitemap».
Жду несколько дней и смотрю, сколько страниц проиндексировано.
Я делаю это после каждого изменения структуры сайта. Если добавил новую рубрику или удалил страницу — проверяю, обновился ли sitemap.
Что ещё можно добавить в sitemap
Мой sitemap включает главную страницу, статьи, рубрики и страницы. Но можно добавить и другие типы контента.
Метки. У меня они закрыты от индексации через
noindex, followв robots.txt, поэтому в sitemap их нет.Изображения. В расширенном sitemap можно указать изображения для каждой страницы. Это помогает попасть в поиск по картинкам.
Видео. Если на сайте есть видео, их тоже можно добавить.
Я пока не добавлял изображения и видео. Мой сайт — блог, и основная ценность в текстах. Но если у вас много медиаконтента — стоит подумать.
Нужно ли разбивать sitemap на части
Есть ограничение: один sitemap может содержать не более 50 000 URL и быть не больше 50 МБ. Если у вас больше страниц — нужно разбивать на несколько файлов и создавать индексный sitemap.
У меня пока меньше 50 000 страниц. Поэтому я использую один файл. Но если сайт вырастет — придётся разбивать.
Что я понял про sitemap
Sitemap — это не роскошь, а необходимость. Без него роботы ходят по сайту наугад. С ним — у них есть чёткий список. Индексация ускоряется, страницы не пропадают.
Создать sitemap без плагинов — реально. Это не rocket science. Несколько блоков кода в functions.php — и всё работает автоматически.
Не забывайте про постоянные ссылки. После добавления кода нужно зайти в «Настройки» → «Постоянные ссылки» и сохранить. Без этого правило не заработает.
Даты должны быть разными. Не используйте одну дату для всех страниц. Берите дату последнего изменения каждой страницы.
Отправьте sitemap в поисковики. Просто создать файл недостаточно. Нужно сообщить Яндексу и Google, что он существует.
Проверяйте после каждого изменения. Добавили статью — проверьте, появилась ли она в sitemap. Удалили страницу — проверьте, исчезла ли она.
Первые шаги
Я начинал с этого. Ничего сложного.
Добавьте код sitemap в functions.php дочерней темы.
Сохраните постоянные ссылки в админке.
Откройте /sitemap.xml в браузере и проверьте, что всё работает.
Добавьте строку Sitemap в robots.txt.
Отправьте sitemap в Яндекс.Вебмастер и Google Search Console.
Подождите несколько дней и проверьте, сколько страниц проиндексировано.
Этого достаточно, чтобы начать. Остальное придёт с опытом.
Я не говорю, что sitemap — это самое важное в SEO. Но это база. Как ЧПУ. Как robots.txt. Как заголовки. Без этого сайт будет работать хуже, чем мог бы.
Если вы понимаете, что ваши статьи не индексируются — остановитесь. Проверьте, есть ли у вас sitemap. Если нет — создайте. Если есть — проверьте, правильно ли он заполнен. Это займёт не так много времени, но даст эффект на месяцы вперёд.
Подписывайтесь на мой блог, читайте другие статьи, делитесь опытом. Вместе мы строим то, что останется.
Автор: Константин Милютин
Группа ВК: vk.com/milyutin_codes
Email: milyutinkv@gmail.com

Добавить комментарий