Ситуация типовая: сайт уже живёт, в индексе появляются служебные страницы, а в XML sitemap оказываются типы записей, которые вы не хотите продвигать. Чаще всего это черновые CPT, внутренние разделы, страницы фильтров, вложения или таксономии с пустым содержимым. Если просто удалить sitemap целиком, поисковики теряют нормальный сигнал о структуре сайта. Правильнее точечно исключить лишнее и оставить только то, что реально должно обходиться.
Ниже — рабочие способы для WordPress без выдуманных хуков и без опасных правок ядра. Разберём, как понять, что именно попадает в sitemap, как отключить отдельные типы записей через код или плагин, и как проверить, что после изменений карта сайта стала чище.
Когда проблема действительно в sitemap
Не каждый лишний URL в индексе связан именно с XML sitemap. Но если в отчётах Search Console вы видите страницы, которые не должны индексироваться, а они при этом присутствуют в карте сайта, это уже прямой сигнал. Поиск сначала идёт по sitemap, а потом по внутренним ссылкам и внешним сигналам. Если мусор есть в карте сайта, вы сами подсказываете поисковику, что его стоит обходить.
Что обычно попадает лишним
- кастомные типы записей, которые используются только внутри админки;
- медиа-вложения, если у них нет самостоятельной ценности;
- таксономии с пустыми или техническими архивами;
- страницы пагинации, которые не нужны в индексации;
- служебные записи плагинов, которые выводятся как публичные.
Если вы используете SEO-плагин, он может генерировать собственный sitemap и иметь отдельные переключатели. Если нет — в WordPress с 5.5+ есть встроенная XML sitemap-функциональность, и её тоже можно настраивать через фильтры.
Диагностика: что именно нужно отключить
Сначала посмотрите, какие sitemap реально отдаются сайтом. Обычно это /wp-sitemap.xml в ядре WordPress или sitemap, который генерирует SEO-плагин. Откройте карту сайта в браузере и проверьте, какие разделы там есть: посты, страницы, CPT, таксономии, авторы, вложения. Если лишний раздел виден уже на верхнем уровне, его проще убрать сразу, чем потом чистить отдельные URL.
Полезно проверить и настройки самих типов записей. Для публичного типа записи WordPress включает его в sitemap только если он доступен для фронтенда и не скрыт фильтрами. Если CPT нужен только для внутренней логики, у него часто стоит 'public' => false или 'publicly_queryable' => false. Но этого недостаточно, если тип уже зарегистрирован как публичный и попадает в sitemap через плагин.
Мини-чек-лист перед правками
- определите, кто генерирует sitemap: ядро WordPress или SEO-плагин;
- составьте список лишних типов записей и таксономий;
- проверьте, не используется ли этот URL во внутренних ссылках;
- сохраните резервную копию файла, если правите код темы или плагина;
- после изменений очистите кеш, если он есть на сайте или на сервере.
Способ 1: отключить тип записи из встроенного sitemap WordPress
Если sitemap генерирует ядро WordPress, можно исключить конкретный тип записи через фильтр wp_sitemaps_post_types. Это самый прямой способ, когда нужно убрать, например, portfolio, event или любой технический CPT.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['portfolio'] );
unset( $post_types['event'] );
return $post_types;
} );Код можно добавить в functions.php дочерней темы или в небольшой mu-plugin, если вы не хотите зависеть от темы. Для продакшена mu-plugin обычно надёжнее: он не отключится после смены темы и не потеряется при обновлении.
Как убрать таксономию из sitemap
Для таксономий используется фильтр wp_sitemaps_taxonomies. Это полезно, если в sitemap попадают технические рубрики или пустые таксономии, которые не нужны в поиске.
<?php
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
unset( $taxonomies['product_cat'] );
return $taxonomies;
} );Здесь важно не путать отключение sitemap и запрет индексации. Если таксономия не должна индексироваться вообще, одного удаления из sitemap мало: страницы могут попасть в индекс через внутренние ссылки. Но если задача именно в чистке карты сайта, этого фильтра достаточно.
Способ 2: если sitemap делает SEO-плагин
У популярных SEO-плагинов логика своя. Обычно проще отключить нужный тип записи в настройках самого плагина, чем лезть в код. Это безопаснее для редактора и быстрее для поддержки. Но если нужен точечный контроль, смотрите документацию конкретного плагина: у него могут быть собственные фильтры и настройки для sitemap.
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройки плагина | Если sitemap генерирует SEO-плагин | Без кода, проще поддерживать | Не всегда есть точечная гибкость |
| Фильтры WordPress | Встроенный sitemap ядра | Точно и предсказуемо | Нужно редактировать код |
| Отключение типа записи | Технический CPT не нужен публично | Убирает проблему в корне | Может повлиять на фронтенд, если тип уже используется |
Если вы используете плагин для SEO и хотите дополнительно чистить дубли, служебные архивы и лишние URL, имеет смысл смотреть в сторону инструментов, где это собрано в одном месте. Например, у Clearfy Pro есть функции для удаления дублей и технической чистки сайта: https://wpshop.ru/plugins/clearfy. Но даже в этом случае сначала проверьте, кто именно генерирует sitemap, иначе можно искать не в том месте.
Способ 3: скрыть конкретный тип записи на уровне регистрации CPT
Если вы сами регистрируете кастомный тип записи, лучше сразу задать его поведение корректно. Для внутренних сущностей, которые не должны светиться в sitemap, не делайте их публичными без необходимости. Пример ниже показывает тип записи, который доступен в админке, но не предназначен для публичного обхода.
<?php
register_post_type( 'internal_note', array(
'label' => 'Internal notes',
'public' => false,
'show_ui' => true,
'show_in_menu' => true,
'show_in_rest' => false,
'exclude_from_search' => true,
'has_archive' => false,
) );Такой подход лучше, чем потом вычищать URL из sitemap постфактум. Но если тип уже работает на сайте и менять его публичность нельзя, используйте фильтр sitemap, а не ломайте существующую логику.
Проверка результата после внедрения
После правок не ограничивайтесь визуальной проверкой страницы sitemap в браузере. Нужно убедиться, что исключённый тип действительно исчез из XML и не отдаётся через старые кеши.
- Откройте sitemap в браузере и проверьте, что раздела больше нет.
- Если есть кеш-плагин или серверный кеш, очистите его.
- Проверьте исходный XML через
view-source:или curl. - Убедитесь, что URL из исключённого типа не появляются в новых sitemap-файлах.
- В Search Console отправьте sitemap на повторную проверку, если это нужно по процессу.
Для быстрой проверки можно использовать curl:
curl -s https://example.com/wp-sitemap.xml | grep -n "portfolio\|event\|post_tag"Если команда ничего не выводит, значит нужный фрагмент в текущем ответе отсутствует. Но помните: если сайт отдаёт sitemap через кеш или CDN, проверять нужно именно актуальную версию после очистки кеша.
Частые ошибки и как их исправить
Удалили не тот тип записи
Ошибка встречается, когда в коде указывают slug типа записи не из регистрации, а из URL-структуры или названия в админке. Проверьте реальный ключ CPT в коде регистрации или в плагине, который его создаёт.
Смотрят только на sitemap, но не на внутренние ссылки
Если URL всё ещё есть в меню, хлебных крошках, блоках или в архиве, поисковик может найти его и без sitemap. В таком случае исключение из карты сайта решает только часть задачи.
Проверяют старую версию из кеша
После изменения фильтров sitemap может какое-то время отдаваться из кеша. Это особенно заметно на сайтах с CDN или page cache. Очистка кеша — обязательный шаг, иначе кажется, что код не работает.
Путают sitemap и robots.txt
Закрыть URL в robots.txt и убрать его из sitemap — это разные задачи. Robots.txt не удаляет уже известные поисковику страницы из индекса, а только ограничивает обход. Для чистки карты сайта нужен именно фильтр или настройка генератора sitemap.
Безопасность и производительность
Если вы вносите изменения в functions.php, делайте это в дочерней теме или вынесите код в отдельный mu-plugin. Это снижает риск потерять правку при обновлении темы. Для сайта с несколькими средами лучше хранить такой код в репозитории, а не править вручную на продакшене.
Не ставьте несколько SEO-плагинов одновременно, если каждый из них умеет генерировать sitemap. Два источника карт сайта создают путаницу: один файл может быть отключён, а второй — продолжать отдавать лишние URL. Сначала определите единственный источник sitemap, потом настраивайте исключения.
Если задача не ограничивается только sitemap и вам нужно системно убрать дубли, служебные архивы и лишние точки входа, иногда проще собрать это в одном инструменте, чем держать набор разрозненных правок. Но даже тогда полезно оставлять кодовые исключения для редких случаев, где нужен точный контроль.
В итоге логика простая: сначала выясняете, кто генерирует sitemap, потом точечно исключаете лишнее, затем проверяете результат по фактическому XML, а не по предположению. Это тот случай, где аккуратная настройка лучше, чем полное отключение карты сайта или ручная чистка на глаз.