Когда в XML-карте сайта начинают появляться служебные записи, черновые CPT, тестовые таксономии или контент, который не должен попадать в поиск, проблема обычно не в самой карте сайта, а в настройках генерации и регистрации типов контента. В WordPress это решается по-разному: через параметры register_post_type(), через фильтры ядра или через SEO-плагины. Ниже — рабочие варианты без лишней магии.
Когда это действительно нужно
Отключать отдельные типы записей из XML-карты стоит не «на всякий случай», а когда есть понятная причина:
- в карте сайта есть служебные CPT, которые не должны индексироваться;
- в sitemap попадают архивы таксономий с пустым или дублирующимся содержимым;
- поисковик тратит обход на страницы, которые не дают ценности;
- после импорта или миграции в карту попали тестовые записи;
- нужно оставить тип записей доступным на сайте, но не отдавать его в sitemap.
Диагностика: что именно попало в карту сайта
Сначала проверьте, какой именно генератор sitemap используется. В WordPress 5.5+ есть встроенные XML-карты сайта, но на практике их часто заменяют SEO-плагины. Это важно: способ отключения зависит от источника.
Как быстро понять источник
- Откройте
/wp-sitemap.xml. Если там стандартная структура WordPress, работает ядро. - Если у вас есть Yoast SEO, Rank Math или другой SEO-плагин, у него может быть свой sitemap и отдельные настройки.
- Проверьте исходный код страницы sitemap: иногда плагин подменяет стандартный URL через rewrite.
Если в карте сайта виден нужный тип записей, но вы не уверены, откуда он берется, сначала проверьте регистрацию CPT и настройки SEO-плагина. Часто проблема не в sitemap, а в том, что тип записей зарегистрирован с publicly_queryable и show_in_rest, а потом автоматически подхватывается генератором карты.
Пошаговое решение через регистрацию типа записей
Если тип записей вы регистрируете сами, самый чистый способ — сразу исключить его из sitemap на уровне register_post_type(). Это лучше, чем потом «вычищать» уже сгенерированную карту.
add_action('init', function () {
register_post_type('internal_note', [
'label' => 'Внутренние заметки',
'public' => false,
'show_ui' => true,
'show_in_menu' => true,
'show_in_rest' => false,
'has_archive' => false,
'rewrite' => false,
'exclude_from_search' => true,
'publicly_queryable' => false,
'show_in_nav_menus' => false,
'show_in_sitemap' => false,
'supports' => ['title', 'editor'],
]);
});Ключевой момент здесь — 'show_in_sitemap' => false. Для встроенной карты сайта WordPress это корректный и понятный способ убрать тип записей из XML. При этом сам CPT может оставаться в админке, если он нужен редакторам или для внутренних процессов.
Если тип записей уже существует: фильтр для sitemap
Когда CPT уже зарегистрирован в теме или плагине, менять его регистрацию не всегда удобно. Тогда используйте фильтр wp_sitemaps_post_types. Он позволяет убрать конкретный тип записей из списка, который попадет в карту сайта.
add_filter('wp_sitemaps_post_types', function ($post_types) {
unset($post_types['internal_note']);
unset($post_types['test_page']);
return $post_types;
});Этот вариант удобен, если вы не хотите править исходный код плагина или темы. Но важно понимать: фильтр влияет только на встроенный sitemap WordPress. Если у вас SEO-плагин со своей генерацией, нужен его механизм исключения.
Как убрать только отдельные записи, а не весь тип
Иногда тип записей нужен в sitemap, но несколько конкретных страниц — нет. Например, тестовые материалы, служебные шаблоны или записи с незавершенным контентом. В этом случае исключать нужно не тип целиком, а отдельные ID.
Для встроенной карты сайта можно использовать фильтр wp_sitemaps_posts_query_args и исключить нужные записи через post__not_in.
add_filter('wp_sitemaps_posts_query_args', function ($args, $post_type) {
if ($post_type === 'post') {
$args['post__not_in'] = [123, 456, 789];
}
return $args;
}, 10, 2);Это рабочий вариант, если список исключений небольшой и статичный. Если ID часто меняются, лучше решать задачу через статус записи, отдельную таксономию или логику в SEO-плагине, чтобы не держать ручной список в коде.
Сравнение подходов
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
show_in_sitemap => false | Вы сами регистрируете CPT | Чисто, прозрачно, без лишних фильтров | Нужно менять код регистрации |
wp_sitemaps_post_types | Тип уже существует | Не трогает исходный CPT | Работает только для встроенного sitemap |
wp_sitemaps_posts_query_args | Нужно скрыть отдельные записи | Точечное исключение | Нужно поддерживать список ID |
Если используется SEO-плагин
У плагинов логика может отличаться. Обычно есть отдельные настройки для включения или отключения типов записей в XML-карте сайта. Это предпочтительнее, чем писать код, если sitemap генерируется не ядром WordPress.
Проверьте:
- настройки XML sitemap в интерфейсе плагина;
- список типов записей и таксономий, которые разрешены к индексации;
- нет ли отдельного переключателя для архивов, медиафайлов или пользовательских типов;
- не включен ли конфликтующий sitemap от другого плагина.
Если вы используете Clearfy Pro, там есть инструменты для чистки сайта и управления SEO-элементами, но сам принцип тот же: сначала определите, кто именно генерирует карту, а потом отключайте лишнее в одном месте, а не сразу в трех.
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой страницы. Нужно убедиться, что URL действительно исчез из sitemap и не отдается в старом кеше.
- Откройте
/wp-sitemap.xmlи проверьте, что нужный тип записей больше не отображается. - Если используется кэш, очистите его на уровне плагина, сервера и CDN.
- Проверьте исходный XML в браузере или через
curl.
curl -s https://example.com/wp-sitemap.xml | grep -n "internal_note"Если команда ничего не возвращает, значит тип записей действительно не попадает в карту сайта. Для отдельной записи можно проверить конкретный URL sitemap и убедиться, что он не присутствует в списке ссылок.
Частые ошибки и как их исправить
Отключили тип записей, но он все равно в sitemap
Обычно причина в том, что sitemap генерирует не ядро WordPress, а SEO-плагин. В этом случае фильтры wp_sitemaps_post_types и show_in_sitemap могут не сработать. Ищите настройку в самом плагине или его фильтры.
Сломали доступ к архиву или одиночным страницам
Такое бывает, если вместе с исключением из sitemap вы поставили public => false или publicly_queryable => false, хотя тип записей должен быть доступен на фронтенде. Если задача только в sitemap, не отключайте публичность без необходимости.
После изменений карта сайта не обновилась
Причина почти всегда в кэше. Очистите объектный кэш, page cache и CDN. Если карта сайта отдается через reverse proxy, старый XML может жить там дольше, чем в админке.
Записи исчезли из sitemap, но остались в индексе
Это нормально: исключение из sitemap не удаляет URL из поиска мгновенно. Если страница должна исчезнуть из индекса, нужен отдельный план: noindex, редирект, удаление контента или статус 410 Gone — в зависимости от сценария.
Практические советы по безопасности и производительности
Не редактируйте ядро WordPress и не вносите правки прямо в файлы плагина. Для таких задач лучше использовать дочернюю тему, mu-plugin или собственный мини-плагин. Тогда изменения не потеряются после обновления.
Если исключений много, не держите список ID в шаблоне страницы. Вынесите его в отдельную функцию или конфиг, чтобы не искать вручную, почему конкретная запись пропала из sitemap.
<?php
/**
* Plugin Name: Sitemap Exclusions
*/
add_filter('wp_sitemaps_posts_query_args', function ($args, $post_type) {
$excluded = [123, 456, 789];
if ($post_type === 'post') {
$args['post__not_in'] = $excluded;
}
return $args;
}, 10, 2);Такой мини-плагин проще сопровождать, чем разрозненные вставки в functions.php. А если позже понадобится вернуть записи в sitemap, вы меняете одну точку входа, а не ищете код по всей теме.
Что проверить перед публикацией изменений
- какой sitemap реально используется: ядро WordPress или SEO-плагин;
- не отключили ли вы публичность там, где она нужна;
- исчез ли нужный тип записей из XML-карты;
- очищен ли кэш;
- не осталось ли дублирующего sitemap от другого плагина;
- не нужно ли дополнительно закрыть страницы от индексации через
noindexили редирект.
Если задача сводится именно к чистке XML-карты сайта, лучше решать ее на уровне регистрации типа записей или фильтра генератора. Это дает предсказуемый результат и не ломает остальной контент.