☰
WORDPRESS / PRACTICE

Как диагностировать отсутствие Custom Post Type в sitemap WordPress

Как диагностировать отсутствие Custom Post Type в sitemap WordPress

Custom Post Type может корректно отображаться в админпанели и открываться по собственному URL, но при этом отсутствовать в XML sitemap. Это не обязательно означает ошибку sitemap: WordPress или SEO-плагин могли считать этот тип записей непубличным, исключить его фильтром или не найти ни одной опубликованной записи.

Диагностику следует проводить последовательно: проверить регистрацию CPT, статус и видимость записей, источник sitemap, фильтры темы и плагинов, а после изменений — кеш и rewrite-правила. Добавлять URL вручную в sitemap стоит только после устранения причины, а не вместо него.

Сначала определите, какой sitemap используется

В WordPress sitemap может формироваться встроенным механизмом или SEO-плагином. В стандартной конфигурации главный файл обычно имеет адрес вроде /wp-sitemap.xml, а отдельные типы записей распределяются по дочерним sitemap. SEO-плагины могут использовать другой endpoint и собственные правила индексации.

Откройте sitemap index и проверьте, есть ли в нем карта для нужного типа записей. Если sitemap CPT присутствует, но отдельная запись отсутствует, проблема, скорее всего, связана со статусом, датой публикации, canonical или фильтрацией конкретных URL. Если самой карты CPT нет, проверяйте регистрацию типа и настройки генератора sitemap.

  • Убедитесь, что проверяете актуальный sitemap, а не старый файл из кеша.
  • Не смешивайте одновременно встроенный sitemap WordPress и sitemap SEO-плагина, не понимая, какой из них передается поисковым системам.
  • Проверьте sitemap в браузере, а также через инструменты командной строки или внешний HTTP-запрос, чтобы исключить проблему локального кеша.

Проверьте регистрацию Custom Post Type

Самая распространенная причина — аргументы register_post_type(). Чтобы попасть в публичную структуру сайта, CPT должен быть действительно публичным и доступным для запросов. Важно также проверить, что код регистрации выполняется при каждом запросе, а не только в админпанели.

Пример базовой регистрации может выглядеть так:

  • public => true означает, что тип предназначен для публичного использования.
  • publicly_queryable => true разрешает формировать публичные запросы и открывать single-страницы CPT.
  • exclude_from_search => false не исключает записи из поиска WordPress. Этот аргумент не всегда напрямую управляет sitemap, но его стоит проверить, поскольку SEO-плагины могут использовать его в собственной логике.
  • has_archive => true нужен для архива типа, но сам по себе не гарантирует включение отдельных записей в sitemap.
  • rewrite отвечает за структуру URL, а не за решение о включении записи в sitemap.
register_post_type('case', [
    'public'              => true,
    'publicly_queryable'  => true,
    'exclude_from_search' => false,
    'has_archive'        => true,
    'rewrite'             => ['slug' => 'cases'],
    'supports'            => ['title', 'editor'],
]);

Что проверить в готовом проекте

Если CPT регистрирует плагин или тема, не изменяйте аргументы в админке вслепую. Найдите фактический вызов register_post_type() и проверьте, нет ли более поздних фильтров, которые изменяют объект типа записей.

Полезно получить параметры CPT через WP-CLI или временный диагностический код. Особое внимание уделите public, publicly_queryable, exclude_from_search и capability_type. Ошибка в slug обычно влияет на URL, но не объясняет отсутствие всей карты sitemap.

  • Проверьте, что slug типа не изменяется разными плагинами.
  • Убедитесь, что регистрация выполняется до момента формирования запросов и sitemap.
  • Не используйте название CPT, конфликтующее с уже зарегистрированным типом или таксономией.

Убедитесь, что записи действительно могут быть добавлены в sitemap

Даже правильно зарегистрированный CPT не будет иметь URL в sitemap, если в нем нет опубликованных записей. Черновики, записи на модерации, приватные материалы и запланированные публикации не должны рассматриваться как доступные обычному посетителю.

Проверьте не только статус, но и фактическую доступность записи без авторизации. Если URL возвращает 404, перенаправляет на другую страницу, требует входа или имеет запрещенную видимость, генератор sitemap может пропустить его.

  • Статус записи должен быть publish.
  • Запись не должна быть приватной или защищенной паролем.
  • Дата публикации не должна быть будущей.
  • У записи должен существовать корректный permalink, соответствующий canonical URL.
  • Страница не должна быть исключена метатегом noindex, если именно SEO-плагин формирует sitemap по правилам индексации.
wp post list --post_type=case --post_status=publish

Проверьте фильтры WordPress и SEO-плагина

Если URL CPT открывается, но не появляется в sitemap, следующим шагом станет поиск фильтров. Для встроенного sitemap WordPress ключевым является wp_sitemaps_post_types. Через него тема или плагин могут удалить тип записей из списка sitemap или изменить его настройки.

SEO-плагины имеют собственные фильтры и параметры для исключения post type, архивов или отдельных записей. Названия и расположение таких параметров зависят от конкретного плагина и его версии, поэтому проверяйте документацию и фактический код конфигурации проекта.

  • Поищите в коде wp_sitemaps_post_types и упоминания названия CPT.
  • Проверьте mu-plugins, functions.php, дочернюю тему и собственные плагины.
  • Посмотрите, не исключен ли весь тип записей в настройках SEO-плагина.
  • Проверьте фильтры для noindex, canonical, sitemap entries и post type exclusions.
  • Временно отключайте подозрительное правило на тестовом окружении, а не на рабочем сайте без резервной копии.
add_filter('wp_sitemaps_post_types', function ($post_types) {
    unset($post_types['case']); // пример исключения CPT
    return $post_types;
});

Почему не стоит сразу добавлять URL вручную

Ручное добавление URL в sitemap маскирует проблему: WordPress по-прежнему будет считать тип или запись непубличными. После обновления плагина, смены темы или повторного формирования sitemap URL может исчезнуть, а правила индексации останутся противоречивыми.

Сначала исправьте условия, при которых CPT считается публичным и доступным. Собственную логику добавления URL имеет смысл использовать только для нестандартного генератора контента, когда стандартная модель WordPress действительно не подходит.

Обновите rewrite-правила и очистите кеш

После изменения аргументов register_post_type() или rewrite-структуры обновите правила постоянных ссылок. Это не добавляет записи в sitemap напрямую, но устраняет ситуации, когда новый slug или маршрут еще не обрабатывается WordPress.

Отдельно очистите кеш страниц, object cache, кеш CDN и кеш SEO-плагина, если он используется. Sitemap часто кешируется как XML-ответ, поэтому после исправления код уже может работать, а браузер или прокси все еще будут показывать старую версию.

  • Выполните flush rewrite на тестовом или рабочем сервере только после проверки изменений.
  • Проверьте HTTP-заголовки sitemap: cache-control, age, etag и last-modified.
  • Не запускайте wp rewrite flush --hard без необходимости на сайте, где правила .htaccess или веб-сервера поддерживаются вручную; сначала убедитесь, что у вас есть резервная копия и доступ к конфигурации.
wp rewrite flush --hard

Системный чеклист диагностики

Чтобы не пропустить причину, пройдите проверку в следующем порядке. После каждого исправления повторно проверяйте sitemap, поскольку одна проблема может скрывать другую.

  • Определите, какой именно sitemap генерируется и есть ли в нем индекс карт.
  • Проверьте, зарегистрирован ли CPT с нужным названием и публичными параметрами.
  • Убедитесь, что существует хотя бы одна запись со статусом publish.
  • Откройте permalink записи без авторизации и проверьте код ответа.
  • Проверьте noindex, canonical, приватность и возможные редиректы.
  • Найдите фильтры wp_sitemaps_post_types и правила SEO-плагина.
  • Обновите rewrite-правила, очистите все уровни кеша и повторите проверку.
  • Убедитесь, что в sitemap появился именно canonical URL, а не служебный или дублирующий маршрут.
wp post list --post_type=case --post_status=publish --fields=ID,post_title,post_status,post_date

Типичные ошибки при исправлении

Чаще всего проблема усугубляется изменениями, которые не связаны с ее причиной. Например, добавление CPT в меню, создание архива или повторное сохранение permalink не сделают непубличный тип доступным для sitemap.

Также не стоит ориентироваться только на то, что страница открывается в браузере администратора. Авторизованный пользователь может видеть черновик или приватную запись, недоступную поисковому роботу.

  • Считать has_archive => true достаточным условием для включения CPT.
  • Приравнивать exclude_from_search к прямому исключению из sitemap во всех конфигурациях.
  • Проверять только главный sitemap и не открывать дочерние карты.
  • Забывать о фильтрах в mu-plugins и дочерней теме.
  • Очищать только кеш браузера, хотя XML кешируется CDN или сервером.
  • Отправлять поисковой системе sitemap до того, как он начал возвращать актуальный список URL.

Частые вопросы

Обязательно ли устанавливать SEO-плагин, чтобы CPT попал в sitemap?

Нет. Современный WordPress имеет встроенный механизм sitemap. SEO-плагин может изменять правила и состав карт, но для базового формирования он не обязателен.

Почему URL CPT открывается, но его нет в sitemap?

Проверьте статус записи, noindex, canonical, приватность, фильтры wp_sitemaps_post_types и настройки SEO-плагина. Доступность URL сама по себе не гарантирует его включение в sitemap.

Нужно ли выполнять wp rewrite flush после каждого изменения CPT?

Это целесообразно после изменения rewrite или slug, когда новые URL возвращают 404 или обрабатываются некорректно. Для изменения только параметров sitemap flush требуется не всегда, но после комплексных изменений он помогает исключить проблему старых правил.

Влияет ли exclude_from_search на sitemap?

Не всегда напрямую. Этот параметр управляет участием записей в стандартном поиске WordPress, но отдельные SEO-решения могут использовать его как сигнал для собственной логики sitemap или индексации. Поэтому его следует проверять вместе с другими аргументами.

Что делать, если sitemap по-прежнему показывает старые данные?

Очистите кеш страниц, object cache, CDN и кеш SEO-плагина, после чего проверьте XML в приватном окне или через HTTP-запрос. Также убедитесь, что открываете правильный sitemap endpoint.

Вывод

Отсутствие Custom Post Type в sitemap чаще всего вызвано не проблемой XML, а неверной моделью публичности: CPT зарегистрирован как непубличный, не имеет опубликованных записей или исключен фильтром.

Начните с проверки регистрации и фактического статуса записей, затем исследуйте фильтры WordPress и SEO-плагина, обновите rewrite-правила и очистите кеш. Такой подход устраняет первопричину и сохраняет sitemap согласованным с реальной структурой сайта.

← Все материалы WordPress