Когда в sitemap попадают служебные записи, черновики, внутренние типы контента или таксономии без ценности для поиска, карта сайта начинает мешать, а не помогать. В WordPress это часто случается после установки SEO-плагина, кастомной темы или плагина с собственным post type. Ниже — как убрать лишнее из XML sitemap без поломки индексации и без лишних костылей.
Когда sitemap нужно чистить
Проблема обычно заметна не сразу. Сайт может продолжать нормально открываться, но в Search Console появляются URL, которые вы не планировали продвигать: страницы фильтров, технические записи, вложения, служебные CPT, архивы с пустым или дублирующимся контентом. Если такие URL попадают в sitemap, поисковик получает сигнал, что их стоит обходить чаще.
Типичные признаки
- в sitemap есть записи из
attachment,revisionили внутреннего CPT; - в Search Console индексируются страницы, которые вы не добавляли в меню и не считаете контентными;
- в отчётах по сканированию много URL с низкой ценностью;
- SEO-плагин генерирует карту сайта автоматически, а нужный тип записей не исключается в настройках.
Диагностика: что именно попало в XML sitemap
Сначала проверьте, какой именно генератор sitemap используется. В WordPress это может быть встроенная карта сайта ядра, Yoast SEO, Rank Math, All in One SEO или другой плагин. От этого зависит способ исключения.
Откройте sitemap в браузере и посмотрите структуру. Если это встроенный sitemap WordPress, обычно адрес выглядит как /wp-sitemap.xml. У SEO-плагинов адрес может быть другим, например /sitemap_index.xml.
Дальше проверьте, какой post type лишний. Это можно сделать прямо в админке или через код, если тип записей кастомный.
<?php
$post_types = get_post_types( array( 'public' => true ), 'names' );
print_r( $post_types );
Если вы видите там тип, который не должен попадать в sitemap, дальше уже выбирайте способ исключения: через настройки плагина или через фильтр.
Как отключить отдельный тип записей из sitemap
Самый надёжный путь — не править ядро и не лезть в файлы плагина. Для WordPress есть рабочие фильтры, а у SEO-плагинов — собственные настройки. Ниже — варианты по ситуации.
Вариант 1: встроенный sitemap WordPress
Если сайт использует стандартный sitemap ядра, можно исключить тип записей через фильтр wp_sitemaps_post_types. Это безопаснее, чем отключать sitemap целиком.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['portfolio'] );
unset( $post_types['faq'] );
return $post_types;
} );
В этом примере из карты сайта убираются типы portfolio и faq. Названия должны совпадать с реальным slug post type. Если у вас другой slug, подставьте свой.
Вариант 2: Yoast SEO
У Yoast SEO есть фильтр wpseo_sitemap_exclude_post_type. Он подходит, если нужно исключить один или несколько типов записей из sitemap, не трогая остальную SEO-логику.
<?php
add_filter( 'wpseo_sitemap_exclude_post_type', function( $exclude, $post_type ) {
if ( in_array( $post_type, array( 'portfolio', 'internal_note' ), true ) ) {
return true;
}
return $exclude;
}, 10, 2 );
Если тип записей должен остаться доступным на сайте, но не попадать в sitemap, это как раз тот случай.
Вариант 3: Rank Math
В Rank Math логика часто решается через настройки типа записи в админке, но если нужен кодовый контроль, проверьте, не отключён ли sitemap для конкретного CPT в настройках самого плагина. Для кастомных решений лучше сначала использовать интерфейс плагина, а код оставлять для точечных исключений, когда настройка недоступна.
| Способ | Когда подходит | Минус |
|---|---|---|
| Настройки SEO-плагина | Если тип записей виден в интерфейсе | Не всегда есть гибкость для точечных исключений |
| Фильтр в коде | Если нужен контроль над конкретным CPT | Нужно аккуратно поддерживать код в теме или плагине |
| Отключение sitemap целиком | Редкий аварийный случай | Потеря полезной карты сайта для всего сайта |
Куда вставить код, чтобы не сломать сайт
Не вставляйте такие фильтры в functions.php активной темы, если тема часто меняется. Для рабочей установки лучше использовать мини-плагин или mu-plugin. Так код не исчезнет после обновления темы.
Пример простого mu-plugin:
<?php
/**
* Plugin Name: Sitemap exclusions
*/
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['portfolio'] );
return $post_types;
} );
Файл положите в wp-content/mu-plugins/. Если папки нет, создайте её вручную.
Как проверить, что исключение сработало
После внедрения не ограничивайтесь визуальной проверкой главной страницы sitemap. Нужна проверка на уровне конкретного URL и типа записей.
- Откройте sitemap заново и убедитесь, что нужный раздел исчез.
- Проверьте дочерние sitemap, если карта сайта индексная.
- Посмотрите исходный XML и найдите slug исключённого post type.
- Если используете Search Console, отправьте sitemap на повторное чтение и дождитесь обновления отчёта.
Для быстрой проверки можно использовать curl:
curl -s https://example.com/wp-sitemap.xml | grep -n "portfolio"
Если команда ничего не выводит, тип записей больше не присутствует в XML. Но это ещё не значит, что поисковик уже обновил индекс — для этого нужно время и повторный обход.
Частые ошибки и как их исправить
Неверный slug типа записей
Частая ошибка — исключают не тот идентификатор. В коде нужен именно slug post type, а не его человекочитаемое название из админки. Проверьте его через get_post_types() или в коде регистрации CPT.
Путают sitemap и noindex
Убрать URL из sitemap — не то же самое, что закрыть его от индексации. Если страница должна быть недоступна для поиска, одного исключения из карты сайта мало. В таком случае нужен отдельный контроль индексации: noindex, robots.txt или удаление страницы из публичного доступа.
Правят файлы плагина
После обновления SEO-плагина правка исчезнет. Если решение нужно на постоянной основе, используйте фильтр, mu-plugin или настройки самого плагина.
Отключают весь sitemap ради одного типа
Это избыточно. Потеря sitemap для всего сайта обычно хуже, чем наличие одного лишнего раздела. Сначала исключайте точечно, а не рубите генерацию целиком.
Практические советы по безопасности и производительности
Если у вас много кастомных типов записей, держите их регистрацию и исключения из sitemap в одном техническом месте: в небольшом плагине или в mu-plugin. Так проще сопровождать код и меньше риск, что при смене темы сайт начнёт отдавать лишние URL.
Не добавляйте в sitemap служебные сущности вроде внутренних заметок, тестовых CPT и архивов без контента. Это не ускоряет индексацию, а только увеличивает шум. Если на сайте уже есть дубли и мусорные URL, сначала наведите порядок в структуре контента, а потом пересобирайте sitemap.
Если вам нужно массово чистить сайт от дублей, служебных страниц и лишних SEO-артефактов, в связке с ручной настройкой может помочь Clearfy Pro, но только как инструмент для технической оптимизации, а не как замена пониманию того, что именно должно индексироваться.
Что должно получиться после настройки
После исправления в sitemap остаются только те типы записей, которые реально нужны для поиска и контентной стратегии. Лишние CPT исчезают из XML, а карта сайта становится короче и понятнее для поисковых систем. Если после этого в Search Console ещё видны старые URL, это нормально: поисковику нужно время на переобход и обновление данных.
Если хотите, я могу подготовить отдельный вариант статьи для случая, когда sitemap генерирует именно Yoast SEO или Rank Math, с более точными фильтрами и настройками под конкретный плагин.