Страницы тикетов почти всегда содержат служебный контент: номера обращений, имена, email, внутренние комментарии, статусы. Если такие страницы попадают в индекс, это уже не просто вопрос SEO. Это лишние дубли, утечки данных и мусор в поиске. На практике проблема возникает в трёх местах: архивы тикетов, страницы одного тикета и служебные URL фильтров/поиска.
Ниже разберём, как закрыть их от индексации в WordPress без поломки логики поддержки и без попытки «спрятать» страницы только через robots.txt, что часто работает не так, как ожидают.
Когда проблема уже видна в индексе
Сначала стоит понять, что именно индексируется. Если в поиске находятся URL вида /tickets/, /ticket/123/, страницы с параметрами фильтрации или результаты поиска по тикетам, значит закрытие сделано частично или не сделано вовсе.
Что проверить в первую очередь
- Есть ли у тикетов отдельный CPT, архив и одиночные записи.
- Не выводятся ли тикеты в XML-карте сайта.
- Не стоят ли на страницах тикетов мета-теги
index, followпо умолчанию. - Не открываются ли служебные страницы для гостей.
- Не кэшируется ли публичная версия страницы, где должен быть только личный контент.
Если у вас уже есть SEO-плагин, проверьте его настройки. Но не полагайтесь только на интерфейс: у кастомных типов записей и шаблонов часто остаются исключения, которые плагин не видит.
Диагностика: где именно закрывать страницы тикетов
Есть три рабочих уровня защиты, и они решают разные задачи. Их лучше комбинировать, а не выбирать один.
| Подход | Что делает | Когда использовать |
|---|---|---|
Мета-тег noindex | Просит поисковики не индексировать страницу | Для одиночных тикетов и архивов, если страница должна открываться пользователю |
| Исключение из sitemap | Не подсказывает URL поисковикам | Для всех служебных страниц тикетов |
| Ограничение доступа | Не даёт открыть страницу без прав | Для личных тикетов, внутренних статусов и черновиков |
Если страница должна быть доступна только автору тикета и агенту поддержки, одной индексации мало. Нужно закрывать и доступ, и индексацию.
Пошаговое решение через код
Ниже пример для кастомного типа записей ticket. Он добавляет noindex, nofollow на одиночные тикеты и архив, а также убирает тикеты из sitemap, если ваш SEO-плагин поддерживает соответствующие фильтры. Код лучше положить в мини-плагин или в functions.php дочерней темы, если у вас нет отдельного слоя для кастомизации.
<?php
/**
* Закрываем тикеты от индексации.
*/
add_action('wp_head', function () {
if (is_singular('ticket') || is_post_type_archive('ticket') || is_tax('ticket_status')) {
echo '<meta name="robots" content="noindex, nofollow, noarchive" />' . "\n";
}
}, 1);
/**
* Запрещаем индексацию через robots meta для SEO-плагинов, если они используют фильтр.
* Подходит не для всех плагинов, поэтому это дополнительный слой, а не единственный.
*/
add_filter('wp_robots', function ($robots) {
if (is_singular('ticket') || is_post_type_archive('ticket') || is_tax('ticket_status')) {
$robots['noindex'] = true;
$robots['nofollow'] = true;
$robots['noarchive'] = true;
}
return $robots;
});Этот вариант не мешает пользователю открыть страницу, но говорит поисковику не индексировать её. Для личных тикетов этого недостаточно, потому что доступ всё равно остаётся открытым, если URL известен.
Как убрать тикеты из карты сайта
Если вы используете SEO-плагин, лучше исключить CPT тикетов из sitemap через его настройки. Если нужна программная защита, ориентируйтесь на фильтры конкретного плагина. Для Yoast SEO, например, можно отключить тип записи из sitemap так:
<?php
add_filter('wpseo_sitemap_exclude_post_type', function ($exclude, $post_type) {
if ($post_type === 'ticket') {
return true;
}
return $exclude;
}, 10, 2);Если у вас Rank Math или другой плагин, логика та же, но фильтр будет другим. Не копируйте этот код вслепую: сначала проверьте, какой SEO-плагин реально стоит на сайте и какие у него есть фильтры.
Если тикеты должны быть закрыты ещё и по доступу
Для личных обращений правильнее не просто ставить noindex, а ограничивать просмотр. Иначе страница может попасть в историю браузера, в кэш прокси или быть открыта по прямой ссылке.
Пример: неавторизованный пользователь видит 404, а автор тикета и администратор — сам тикет. Это уже защита уровня приложения, а не только SEO.
<?php
add_action('template_redirect', function () {
if (!is_singular('ticket')) {
return;
}
$post_id = get_queried_object_id();
$current_user_id = get_current_user_id();
$author_id = (int) get_post_field('post_author', $post_id);
if (!$current_user_id) {
wp_safe_redirect(wp_login_url(get_permalink($post_id)));
exit;
}
if ($current_user_id !== $author_id && !current_user_can('manage_options')) {
status_header(404);
nocache_headers();
include get_query_template('404');
exit;
}
});Здесь важно не возвращать «пустую» страницу с кодом 200. Для поисковиков это выглядит как обычный контент, и проблема индексации только усугубляется.
Проверка результата после внедрения
После настройки не ограничивайтесь визуальной проверкой. Нужно убедиться, что поисковик видит именно то, что вы задумали.
- Откройте страницу тикета в браузере и проверьте исходный код: должен быть
noindex. - Проверьте архив тикетов и страницы таксономий, если они есть.
- Посмотрите XML-sitemap: тикеты не должны там присутствовать.
- Откройте страницу без авторизации: личный тикет не должен быть доступен.
- Проверьте ответ сервера через
curl -I https://example.com/ticket/123/и убедитесь, что нет случайного кэширования публичной версии.
Если используете Google Search Console, отправьте страницу на повторную проверку только после того, как убедились, что мета-тег и доступ уже исправлены. Иначе поисковик просто зафиксирует старую версию ещё раз.
Частые ошибки и как их исправить
Ставят только robots.txt
Это частая ошибка. Disallow не гарантирует удаление из индекса, если URL уже известен поисковику. Для служебных тикетов нужен именно noindex или закрытие доступа, а лучше оба варианта.
Закрывают архив, но забывают одиночные страницы
В результате в индексе остаются карточки тикетов, а архив уже закрыт. Проверяйте все шаблоны: архив, одиночную запись, таксономии, поиск, страницы с параметрами.
Оставляют тикеты в sitemap
Если URL продолжает попадать в карту сайта, поисковик получает прямую подсказку, что страница важна. Для служебного контента это лишний сигнал.
Возвращают 200 для закрытой страницы
Если пользователь без прав видит «пустую» страницу с кодом 200, поисковик может считать её обычной страницей. Для закрытого доступа лучше редирект на логин или корректный 404/403 в зависимости от сценария.
Безопасность и производительность: что не стоит упускать
Если тикеты содержат персональные данные, не храните их в публичных мета-полях без необходимости. Не выводите email, телефон и внутренние комментарии в шаблоне, даже если страница закрыта от индексации. Индексация и безопасность — разные задачи.
Ещё один практический момент: если у вас много тикетов, не заставляйте WordPress каждый раз собирать сложную логику доступа на уровне каждого запроса без кэша. Но кэшировать можно только публичные и безопасные фрагменты. Личные страницы лучше исключать из page cache полностью.
Если для чистки сайта и удаления дублей вам уже нужен отдельный инструмент, имеет смысл посмотреть в сторону Clearfy Pro: он помогает навести порядок с техническими настройками, но всё равно не заменяет точечную логику для тикетов.
Короткий чек-лист перед публикацией
- Одиночные тикеты закрыты мета-тегом
noindex. - Архивы и таксономии тикетов тоже закрыты.
- Тикеты исключены из sitemap.
- Личные страницы недоступны без авторизации.
- Закрытые URL не отдаются с кодом 200 как обычный контент.
- В шаблоне не выводятся лишние персональные данные.
Если после внедрения в индексе всё ещё остаются старые URL, это нормально на коротком промежутке. Но новые страницы тикетов уже не должны появляться в поиске, а старые — постепенно выпадать после переобхода.