Top.Mail.Ru

Разбираюсь с дублями страниц форматов записей в WordPress. Расскажу, почему 301 редирект на главную — плохая идея, и покажу рабочий код, который возвращает честную 404.

Вы когда-нибудь замечали в Google или Яндекс.Вебмастере странные адреса вроде мой_сайт.ru/type/video/ или …/type/image/? У меня они появились внезапно. Сначала я подумал: «Ерунда, закрою в robots.txt». Не помогло. Потом установил 301 редирект на главную через .htaccess. И только спустя время понял, что чуть не навредил сайту.

Сейчас расскажу, как я докопался до истины и что в итоге сделал.

Честная ошибка 404 оказалась лучшим другом SEO…

Давайте вначале разберём, что значит «честная 404» и почему это лучше редиректа 301?

Я долго не мог понять, в чём разница. Оба варианта вроде бы убирают страницу из поиска. Но для поисковиков это две разные вещи.

Простая аналогия

Представьте, что вы пришли в библиотеку и спросили книгу «Как приготовить плов».

Вариант с 301 редиректом — библиотекарь отвечает: «Эта книга навсегда переехала в здание напротив» и показывает на почтовое отделение. Вы приходите в почту, а там марки и конверты. Вы в замешательстве и робот Google тоже путается.

Вариант с честной 404 — библиотекарь говорит: «Извините, такой книги у нас нет, и никогда не было». Вы понимаете, что искать её здесь бесполезно, и вы уходите. Робот же в этом случае получает чёткий сигнал: «Удали страницу из индекса».

В нашем случае страницы /type/video/ на самом деле нет, если же есть, тогда создаёт дубли (полезного контента там нет). Значит, надо честно сказать об этом.

Как код возвращает 404, а не редирект

Вот тот самый код из functions.php:

if (in_array($term_slug, $formats_to_disable)) {
    $query->set_404();
    status_header(404);
    nocache_headers();
}

Эти три строчки заставляют сервер выдать HTTP-статус 404 Not Found. Никакого перенаправления. Браузер просто показывает стандартную страницу «Не найдено», а поисковик понимает: здесь нужно удалять.

Как проверить, что у вас именно 404, а не скрытый редирект

Сделайте простой тест. Я им пользуюсь каждый раз после добавления кода.

1. Откройте https://мой_сайт.ru/type/video/ в браузере (лучше в Яндекс или Chrome)
2. Нажмите клавишу F12 — откроются инструменты разработчика.
3. Перейдите на вкладку Network (Сеть).
4. Обновите страницу (F5 или Ctrl+R).
5. В списке запросов найдите самый первый — обычно он называется video/ или имеет такой же адрес.
6. Посмотрите на колонку Status (Статус).

Если там 301 или 302 — значит, всё ещё срабатывает старый редирект из .htaccess. Идите и в .htaccess удалите ту строчку RedirectMatch. Если показывает 404 — вы всё сделали правильно.

Что вы увидите на экране после проверки:

  • Сам адрес /type/video/ — открывается обычная страница 404 вашей темы (скорее всего, с надписью «Ничего не найдено»).
  • Код ответа в Network — 404.
  • Никакого перехода на главную — адресная строка не меняется.

Именно этого мы и добивались.

Коротко: чем 404 лучше 301 в моем случае

Критерий301 редирект на главнуюЧестная 404
Сигнал роботу«Страница переехала» (обман)«Страницы нет» (правда)
Риск Soft 404ВысокийНоль
Потребление краулингового бюджетаЕсть, потому что робот идёт по редиректуМинимальное
Что видит пользовательГлавная (непонятно, как сюда попал)Сообщение «Не найдено» + поиск по сайту

Надеюсь, теперь про «честную 404» стало яснее. Если у вас в теме не очень красивая страница 404 — рекомендую доработать её: добавить форму поиска, ссылки на популярные статьи и кнопку на главную. Это поможет удержать случайного посетителя. Но сам статус 404 менять не нужно — он идеален для таких пустышек.

Откуда вообще лезут эти /type/ страницы?

Это не баг и не вирус. WordPress из коробки умеет группировать записи по форматам: видео, изображение, цитата, галерея и так далее. Всего их 10: aside, gallery, link, image, quote, status, video, audio, chat, standard.

Когда вы хоть раз выставили у поста формат «Видео», движок автоматически создаёт архив /type/video/. Там должны показываться все видеозаписи. Только вот у большинства блогов эти архивы пустые или бесполезные.

У меня на сайте почему-то активными оказались только два формата — video и image. Остальные восемь отдавали 404, и меня это устраивало. А вот эти два дублировали контент и плодили мусорные URL.

Знакомая ситуация? Тогда читайте дальше…

Моя ошибка: 301 редирект на главную

Моей первой мыслью было: «А давай просто перенаправим всё /type/video/ на главную». Я добавил в .htaccess (apache) такую строчку:

RedirectMatch 301 ^/type/(video|image)(/page/\d+/)?/?$ https://мой_сайт.ru/

Сработало. Редирект крутился, я был доволен. Но потом я полез в Google Search Console и увидел «мягкие ошибки 404». Это когда сервер возвращает 200 (всё ок), а на самом деле страница пустая и не по теме.

Оказывается, что массовый 301 редирект с пустого архива на главную — это плохой сигнал для поисковиков. Роботы начинают путаться, тратят лишний бюджет на сканирование, а ваш сайт рискует получить репутацию «не очень честного» ВебМастера.

Лучшее решение: честная 404 ошибка

Я обратился к хорошему разработчику, и он объяснил простую вещь: если страницы не существует — отдавайте 404 ошибку. Это нормально. Это не ошибка сервера, а корректный ответ.

Google прямо говорит: ошибки 404 сами по себе не влияют на ранжирование. Они просто удаляют из индекса то, чего нет.

Поэтому я решил не маскировать пустые архивы под главную, а честно сообщить роботам: «Здесь ничего нет для вас, идите мимо».

Как я отключил только video и image, а не всё подряд

Долго искал код, который не трогает остальные архивы (aside, gallery и т. д.). В итоге нашёл элегантное решение через pre_get_posts.

Вот что я добавил в functions.php своей дочерней темы (предварительно сделав бэкап):

 // Выборочно отключаем архивы для форматов video и image
 add_action('pre_get_posts', 'disable_specific_post_format_archives');
 function disable_specific_post_format_archives($query) {
 if ($query->is_tax('post_format') && $query->is_main_query() && !is_admin()) {
 $term = $query->get_queried_object();
 $term_slug = $term->slug;
 $formats_to_disable = array('post-format-video', 'post-format-image');
 if (in_array($term_slug, $formats_to_disable)) {
 $query->set_404();
 status_header(404);
 nocache_headers();
 }
 }
 }

Что происходит: код ловит запрос к архиву, проверяет его slug, и если это post-format-video или post-format-image — возвращает 404. Все остальные форматы (даже если они появятся в будущем) остаются нетронутыми.

Важный нюанс: перед добавлением кода я удалил старый редирект из .htaccess (ту самую строчку RedirectMatch). Иначе Apache перехватывал запрос раньше, чем срабатывал WordPress, и я всё равно видел 301-е перенаправление на главную страницу.

Проверяем результат

После сохранения файла я открыл в браузере:

  • https://мой_сайт.ru/type/video/ → результат страница 404.
  • https://мой_сайт.ru/type/image/ → результат 404.
  • А вот https://мой_сайт.ru/type/aside/ (которого у меня нет) → тоже 404, но это и не нужно.

Главное — обычные записи с форматом видео или изображения продолжают открываться без проблем. Например, статья с отметкой «Видео» работает, как обычно.

Что ещё я сделал для чистоты

Чтобы поисковики точно забыли про старые дубли, я выполнил три простых шага:

1. Проверил постоянные ссылки. Зашёл в админку → Настройки → Постоянные ссылки и просто нажал «Сохранить». Это сбрасывает правила перезаписи WordPress.

2. Отправил страницы с 404 на перепроверку в Google Search Console. Через две недели они исчезли из индекса.

А что с производительностью?

После всех манипуляций я прогнал сайт через тесты скорости в Pagespeed. Ничего не упало, наоборот — стало чуть легче, потому что роботы наконец-то перестали посещать мусорные URL.

Вот как сейчас выглядят показатели на компьютерах:

pagespeed для компьютера

А это на мобильных устройствах:

pagespeed мобильные устройства

Как видите, никакого негатива. Зато порядок в SEO и скорости загрузки страниц сайта.

Как отключить архивы форматов записей (если не хотите разбираться)

Я показал выше точечный код для video и image, но если вы хотите закрыть все архивы форматов разом, тогда делайте пошагово. Этот метод подойдёт, когда вы точно не пользуетесь форматами записей (aside, gallery, quote и т. д.).

Пошагово отключить архивы форматов записей:

  1. Создайте резервную копию.

Это железное правило. Перед любыми правками файлов темы обязательно сделайте бэкап. Файлы и базу данных. Мало ли что пойдёт не так — вы всегда откатитесь назад.

  1. Добавьте код в functions.php.

Откройте файл functions.php вашей активной темы. Лучше через FTP или редактор хоста. Добавьте в самый конец (перед закрывающим ?> — если он есть) вот этот код:

// Отключаем архивы для всех форматов записей
add_action('pre_get_posts', 'disable_post_format_archives');
function disable_post_format_archives($query) {
    if ($query->is_tax('post_format') && $query->is_main_query() && !is_admin()) {
        $query->set_404();
        status_header(404);
        nocache_headers();
    }
}

Что делает этот код?
Ловит любой запрос к любому архиву формата (/type/любой_формат/) и принудительно возвращает ошибку 404. Без редиректов и без мягких ошибок.

  1. Проверьте результат.

После сохранения файла перейдите по адресу: https://мой_сайт.ru/type/video.

А также проверьте https://мой_сайт.ru/type/image/ и, например, https://мой_сайт.ru/type/gallery/.

Во всех случаях вы должны увидеть стандартную страницу «404 Not Found» (оформленную вашей темой). Если вместо этого открылась главная или какая-то другая страница — значит, у вас остался старый редирект в .htaccess (удалите его).

Сравнение, какой способ выбрать?

Ваш сценарийКакой код использовать
Вы не используете форматы записей вообщеОтключайте все (это пошагово)
У вас есть полезные архивы, например, /type/quote/ или /type/aside/Используйте точечный код из основной части статьи (например, только для video и image)
Вы не уверены, какой формат вам пригодится в будущемЛучше точечный — он безопаснее

Я лично остановился на точечном отключении. Но если вы твёрдо решили зачистить всё — берите полный код из этой инструкции.

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

Почему нельзя просто закрыть /type/ в robots.txt?
Роботы всё равно могут найти ссылку с другого сайта и попытаться зайти. А robots.txt — это лишь рекомендация, не запрет. Плюс страница остаётся доступной, просто не индексируется. Это хуже, чем честная 404.

А что если я активно использую форматы записей и хочу оставить архивы?
Тогда ничего не отключайте. Но хотя бы поставьте канонические ссылки или noindex, чтобы избежать дублей. Эта статья — для тех, кто форматами не пользуется.

Код в functions.php сломает сайт, если я ошибся?
Риск минимальный, если вы сделали бэкап. Но на всякий случай имейте доступ к файлам через FTP, чтобы в случае чего удалить строчки.

А как быть с /type/standard/?
Стандартный формат не создаёт отдельной страницы-архива. Поэтому его можно не трогать.

Моё резюме

Я потратил пару вечеров, перепробовал редиректы и плагины. В итоге самый простой, и надёжный способ оказался самым правильным: вернуть 404 для ненужных архивов. Никаких «мягких ошибок» и никакого обмана поисковиков. Только честность и прозрачность в продвижении сайта.

Если вы тоже заметили у себя на сайте WordPress странные страницы /type/video/ или /type/image/, не спешите устанавливать 301 редирект на главную. Попробуйте данный код, который вам поможет удалить дубли страниц форматов записей.

А если остались вопросы — пишите в комментариях. Я всегда на связи. Удачи вам и быстрой индексации!

Читайте также:

Как настроить 301 редирект на главную для SEO-оптимизации
GigaChat и правда пишет за вас посты?
Как я победил атаку на WordPress

Комментарии и отзывы
Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Еще записи из этой же рубрики

Что будем искать? Например,seo

Минуту внимания
Мы используем файлы cookies, чтобы правильно работал наш веб-сайт.