☰
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