Если в WordPress регулярно удаляются записи, страницы, товары или старые URL после миграции, обычный ответ 404 Not Found не всегда лучший вариант. Для адресов, которые удалены окончательно и не вернутся, корректнее отдавать 410 Gone. Для поисковиков это прямой сигнал: страница удалена намеренно, проверять её дальше не нужно.
Это не про «ускорить SEO» магией. Смысл практический: уменьшить количество бесполезных повторных обходов, убрать мусорные URL из индекса и сделать поведение сайта предсказуемым. Но применять 410 нужно точечно. Если страница переехала на новый адрес, нужен редирект 301. Если контент временно недоступен, 410 тоже не подходит.
Когда 410 действительно нужен
Сценарий простой: URL больше не существует, и вы не планируете его восстанавливать. Например, удалённая новость, устаревшая посадочная, закрытая акция, страница тестового импорта, которая попала в индекс, или набор старых URL после чистки структуры сайта. В таких случаях 410 лучше, чем 404, потому что он явно сообщает о намеренном удалении.
Когда 410 не ставят
Не путайте удаление с переездом. Если у страницы есть новая версия, используйте 301. Если вы ещё не решили судьбу адреса, оставьте 404. Если URL должен открываться только для авторизованных пользователей, это уже история про 401/403, а не 410.
Диагностика проблемы: как понять, что на сайте накопились лишние URL
Обычно проблема видна в трёх местах: отчёты поисковых систем, логи сервера и внутренний поиск по сайту. В Search Console можно увидеть много запросов к несуществующим страницам. В логах — повторяющиеся обращения к старым URL, которые уже давно удалены. Если на сайте была миграция, часто всплывают адреса со старой структуры, которые продолжают обходиться роботами.
Проверьте, какие именно URL отдают 404. Если это страницы, которые вы удалили осознанно и не хотите возвращать, их можно перевести на 410. Если же среди них есть адреса с внешними ссылками или трафиком, сначала оцените, не нужен ли редирект на релевантную страницу.
- URL удалён окончательно и не имеет замены — кандидат на 410.
- URL переехал на новый адрес — нужен 301.
- URL был ошибочно удалён — лучше восстановить контент.
- URL генерируется плагином или темой — сначала ищите источник генерации.
Как отдать 410 Gone через код
Самый надёжный способ — точечно обработать нужные URL в template_redirect и отправить заголовок 410 Gone. Это удобно, если список адресов небольшой и известен заранее. Ниже пример для нескольких конкретных путей.
<?php
add_action('template_redirect', function () {
$path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$gone_paths = array(
'old-page',
'archive/test-landing',
'promo/spring-2023',
);
if (in_array($path, $gone_paths, true)) {
status_header(410);
nocache_headers();
include get_query_template('404');
exit;
}
});Здесь важный момент: мы не просто меняем код ответа, а ещё подключаем шаблон 404, чтобы пользователь увидел нормальную страницу ошибки. Для поисковика решающим будет именно заголовок 410.
Если список URL большой
Когда удалённых адресов много, удобнее хранить их в массиве или в отдельном файле конфигурации. Но не стоит превращать это в бездумный список всех 404. 410 имеет смысл только для окончательно удалённых страниц. Для массовой обработки лучше сначала выгрузить список из логов или Search Console, отфильтровать важные URL и только потом добавлять их в код.
<?php
add_action('template_redirect', function () {
$request_uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$gone_rules = array(
'catalog/old-product-1' => true,
'catalog/old-product-2' => true,
'news/2019/obsolete-post' => true,
);
if (!empty($gone_rules[$request_uri])) {
status_header(410);
nocache_headers();
wp_die(
'Страница удалена.',
'410 Gone',
array('response' => 410)
);
}
});В этом варианте используется wp_die() с кодом ответа 410. Для небольших проектов это даже проще, чем подключать отдельный шаблон. Но если у вас уже есть кастомная 404-страница, лучше сохранить единый дизайн и использовать её.
Как сделать 410 через плагин или правила сервера
Если не хочется править тему, можно использовать плагин для редиректов, если он умеет отдавать 410 для конкретных URL. Это удобно для редакторов и контент-менеджеров, но важно проверить, как плагин обрабатывает кэш и не превращает 410 в редирект на страницу-заглушку.
| Подход | Плюсы | Минусы |
|---|---|---|
| Код в теме или mu-plugin | Точный контроль, без лишних зависимостей | Нужно аккуратно поддерживать список URL |
| Плагин редиректов | Удобно для редакторов, не нужен PHP | Зависимость от плагина, возможны ограничения по 410 |
| Правила сервера | Быстро и без нагрузки на WordPress | Сложнее сопровождать, нужен доступ к конфигу сервера |
Если у вас много старых URL после миграции, серверный вариант может быть самым лёгким для сайта. Но для большинства задач WordPress достаточно кода в mu-plugin или в отдельном небольшом плагине.
Проверка результата после внедрения
После настройки не ограничивайтесь открытием страницы в браузере. Браузер может показать красивую заглушку, но вам нужен именно HTTP-статус.
- Проверьте ответ через
curl -I https://example.com/old-page. - Убедитесь, что в заголовках есть
HTTP/1.1 410 Goneили аналогичный статус. - Откройте URL в режиме инкогнито и проверьте, что страница не редиректит на главную.
- Посмотрите, не кэширует ли CDN или плагин кэширования старый ответ.
- Через несколько дней проверьте отчёты поисковой системы и логи сервера.
Пример проверки через консоль:
curl -I https://example.com/promo/spring-2023Если вместо 410 вы видите 200, значит правило не сработало. Если видите 301 или 302, где-то есть редирект, который перебивает ваш код. Если ответ 404, значит условие не совпало с реальным путём или код выполняется слишком поздно.
Частые ошибки и как их исправить
Самая частая ошибка — ставить 410 на всё подряд. Так можно случайно удалить из обхода страницы, которые нужно было перенаправить. Вторая ошибка — отдавать 410 только визуально, без правильного HTTP-статуса. Поисковик ориентируется на заголовок, а не на текст на странице.
Ещё одна типичная проблема — конфликт с кэшем. Если CDN или плагин кэширования уже сохранил 200-ответ, пользователи и роботы продолжат видеть старую версию. После изменения правил нужно очистить кэш на всех уровнях: WordPress, сервер, CDN, браузерные тесты.
- Ошибка: поставили 410 на URL с внешними ссылками. Исправление: оцените трафик и замените на 301, если есть релевантная страница.
- Ошибка: правило срабатывает только на части адресов. Исправление: проверьте слэши, регистр и точный путь из
REQUEST_URI. - Ошибка: страница выглядит как 404, но статус 200. Исправление: используйте
status_header(410)илиwp_die(..., array('response' => 410)). - Ошибка: 410 отдаётся для страниц, которые генерирует плагин. Исправление: найдите источник URL и отключите генерацию на уровне плагина.
Безопасность и производительность: что учесть
Для небольшого числа URL код в template_redirect почти не влияет на производительность. Но если список большой, не стоит делать тяжёлые запросы к базе на каждом хите. Лучше хранить правила в простом массиве, в опции с автозагрузкой по необходимости или в отдельном файле, который подключается без лишней логики.
С точки зрения безопасности не давайте пользователям из админки произвольно вставлять PHP-код для 410-правил. Если нужен интерфейс, делайте его через настройки плагина или через список URL в базе с жёсткой валидацией. И отдельно следите, чтобы правило не открывало путь к произвольным заголовкам или редиректам.
Что делать после массовой чистки URL
Если вы удалили большой блок контента, не ограничивайтесь 410. Проверьте внутренние ссылки, меню, XML-карту сайта и старые блоки в контенте. Иначе сайт продолжит ссылаться на удалённые адреса, а пользователи будут попадать в тупик. В таких случаях полезно сначала найти все упоминания старых URL, а уже потом решать, где нужен 301, где 410, а где восстановление страницы.
Практически это выглядит так: сначала собираете список удалённых адресов, затем делите его на группы, после чего для каждой группы выбираете действие. Такой подход лучше, чем массово превращать все ошибки в один тип ответа. Для поисковой оптимизации и поддержки сайта это обычно даёт более чистую картину, чем хаотичная смесь 404, 302 и случайных редиректов.