Когда карта сайта в WordPress начинает разрастаться за счет служебных страниц, черновых типов записей или контента, который не должен попадать в поиск, проблема обычно не в самом sitemap, а в настройках источников. В итоге в Google Search Console появляются URL, которые вы не хотите индексировать, а карта сайта перестает быть полезным сигналом для поисковиков.
Ниже разберем практический сценарий: как убрать из XML sitemap отдельные типы записей, таксономии или конкретные элементы, не ломая остальную индексацию. Подходы будут разные: через настройки SEO-плагина и через код, если нужен точечный контроль.
Диагностика: что именно попало в sitemap лишнего
Сначала не трогайте код. Откройте XML-карту сайта и посмотрите, какие именно URL там присутствуют. Обычно проблема проявляется в одном из трех вариантов:
- в sitemap есть
attachment-страницы с медиафайлами; - попали архивы таксономий, которые не дают трафик и дублируют контент;
- в карту включен кастомный тип записей, который нужен только для внутренней логики сайта.
Если у вас стоит SEO-плагин, проверьте его настройки генерации sitemap. Часто там уже есть переключатели для типов записей и таксономий. Если карта формируется ядром WordPress, логика будет другой: нужно либо исключать типы на уровне регистрации, либо фильтровать список URL через доступные фильтры.
Что проверить до изменений
- какой плагин генерирует sitemap;
- какие типы записей должны индексироваться реально;
- не используется ли этот тип записей в перелинковке или в хлебных крошках;
- не закрыт ли уже этот контент через
noindexили robots.txt отдельно.
Как убрать лишние записи из XML sitemap через настройки
Если sitemap генерирует SEO-плагин, самый безопасный путь — отключить ненужные сущности в его интерфейсе. Это лучше, чем править ядро или шаблоны вручную: после обновления настройки сохранятся, а логика останется прозрачной.
Смысл простой: если тип записей не должен индексироваться, он не должен и попадать в sitemap. Но важно не путать это с полным удалением из сайта. Страница может быть доступна по прямой ссылке для пользователей, но не участвовать в карте сайта.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройки SEO-плагина | Нужно быстро убрать типы записей или таксономии | Зависит от конкретного плагина и его интерфейса |
| Код через фильтры WordPress | Нужен точечный контроль без лишних зависимостей | Требует аккуратности и тестирования после обновлений |
| robots.txt | Нужно ограничить обход, а не генерацию sitemap | Не решает проблему самой карты сайта |
Пошаговое решение через код
Если карта сайта формируется ядром WordPress или вам нужен контроль без плагина, используйте фильтры. Для WordPress 5.5+ есть встроенный XML sitemap, и его можно фильтровать на уровне источников. Ниже пример, который отключает отдельный тип записей из карты сайта.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
// Убираем служебный тип записей из XML sitemap.
unset( $post_types['portfolio'] );
return $post_types;
} );
Если нужно убрать таксономию, используется похожий фильтр:
<?php
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
return $taxonomies;
} );
Такой способ хорош тем, что он не трогает сам контент и не требует переписывать шаблоны. Но он работает только там, где sitemap действительно генерируется ядром WordPress. Если у вас Yoast SEO, Rank Math или другой SEO-плагин, логика исключения будет в его настройках или в его собственных фильтрах.
Если нужен контроль по одному типу записей
Иногда проблема не в целом типе, а в отдельных элементах. Например, в sitemap попадают записи со статусом private или тестовые материалы. Тогда лучше фильтровать сами URL перед выводом. Для встроенного sitemap WordPress можно использовать фильтры уровня провайдера, но на практике проще и безопаснее сначала решить вопрос на уровне регистрации типа записей: не включать его в публичную карту сайта, если он не предназначен для индексации.
При регистрации кастомного типа записей проверьте параметры public, publicly_queryable и show_in_rest. Они не управляют sitemap напрямую, но часто показывают, что тип изначально создан как внутренний, а потом случайно стал видимым для поиска и карты сайта.
<?php
register_post_type( 'portfolio', array(
'labels' => array(
'name' => 'Портфолио',
),
'public' => true,
'publicly_queryable' => true,
'show_in_rest' => true,
'has_archive' => false,
'supports' => array( 'title', 'editor', 'thumbnail' ),
) );
Если такой тип нужен только для внутреннего каталога, не делайте его публичным без необходимости. Иначе вы получите не только sitemap, но и лишние архивы, хлебные крошки и потенциальные дубли.
Проверка результата после внедрения
После изменения не ограничивайтесь открытием главной карты сайта. Проверьте именно те URL, которые вы исключали.
- Откройте sitemap в браузере и убедитесь, что нужный тип записей исчез из списка.
- Проверьте вложенные sitemap-файлы, если карта разбита по типам.
- Посмотрите исходный XML, а не только визуальный рендер в браузере.
- В Google Search Console отправьте карту сайта повторно и дождитесь переобхода.
Если URL все еще присутствуют, причина обычно одна из трех: вы правите не тот генератор sitemap, кэш отдает старую версию, или исключение сделано не на том уровне. Для кэша очистите серверный кэш, объектный кэш и кэш плагина, если он есть.
Как быстро убедиться, что карта обновилась
- проверьте заголовки ответа и дату генерации, если плагин ее показывает;
- сравните содержимое sitemap до и после очистки кэша;
- откройте URL в режиме инкогнито, чтобы исключить локальный кэш браузера;
- если используется CDN, сбросьте его кэш тоже.
Частые ошибки и как их исправить
Ошибка 1: отключили URL в robots.txt, но он остался в sitemap. Это разные механизмы. Robots.txt ограничивает обход, а sitemap управляет списком URL для обхода. Если URL не должен участвовать в индексации, убирайте его из карты сайта и дополнительно проверяйте мета-robots.
Ошибка 2: исключили тип записей, но архивы таксономий остались. Часто забывают про рубрики, метки или кастомные таксономии. В результате карта сайта все еще содержит страницы, которые ведут на тот же контент другим путем.
Ошибка 3: правят functions.php темы, а потом теряют изменения после обновления. Для точечных правок лучше использовать дочернюю тему или небольшой mu-plugin. Это проще сопровождать и легче отключать при диагностике.
Ошибка 4: отключили тип записей в sitemap, но не закрыли его от индексации. Если страница доступна и не должна индексироваться, проверьте еще мета-теги noindex и каноникал. Иначе поисковик может найти URL через внутренние ссылки.
Что делать, если sitemap генерирует SEO-плагин
У плагинов логика обычно удобнее для редактора, но менее универсальна для разработчика. Если вам нужен быстрый результат без кода, используйте встроенные настройки исключения типов записей и таксономий. Если нужен более тонкий контроль, ищите фильтры именно в документации плагина, а не копируйте случайные сниппеты из интернета.
Если вы уже используете набор для технической чистки сайта, вроде Clearfy Pro, проверьте, не дублирует ли он часть функций вашего SEO-плагина. Конфликт возникает, когда два инструмента пытаются управлять одной и той же картой сайта или одним и тем же типом индексации.
Практические советы по безопасности и производительности
- не правьте ядро WordPress вручную;
- храните изменения в mu-plugin или дочерней теме, если это кодовая правка;
- после обновления SEO-плагина перепроверяйте карту сайта;
- не отключайте sitemap целиком, если сайт активно индексируется и у вас нет другой стратегии подачи URL;
- не смешивайте исключение из sitemap с удалением контента: это разные задачи.
Если у сайта много служебных типов записей, лучше заранее определить, какие из них публичные, какие индексируемые, а какие только внутренние. Тогда sitemap не придется постоянно чистить вручную, а поисковая структура будет стабильнее.
В итоге рабочая схема такая: сначала находите источник генерации sitemap, потом исключаете лишние типы записей или таксономии на правильном уровне, после этого проверяете XML в браузере и в Search Console. Если все сделано аккуратно, карта сайта становится короче, чище и полезнее для индексации.