Если на сайте WordPress у записей одновременно доступны URL с категорией и без неё, поисковик видит два адреса для одного и того же контента. На небольшом сайте это часто незаметно, но при росте структуры появляются дубли, расползаются ссылки, а в отчётах Search Console всплывают лишние страницы. Проблема не в самой категории, а в том, что один и тот же материал можно открыть по нескольким путям.
Ниже разберём рабочую схему: как понять, что дубли действительно есть, как убрать их на уровне настроек или кода, и как проверить, что после правки сайт не потерял нужные URL.
Как выглядит проблема на практике
Типичный сценарий: запись доступна по адресу /category/news/post-name/ и одновременно по /post-name/. Иногда к этому добавляются архивы тегов, страниц авторов, пагинация и версии с параметрами. Для пользователя это почти незаметно, а для поисковика — несколько страниц с одинаковым содержимым или очень близким набором текста.
Если сайт уже давно работает, дубли обычно проявляются не в одном месте. Их видно в индексе, в отчётах по каноническим URL и в логах обхода, если они есть. Чем больше внутренних ссылок ведёт на разные варианты одного адреса, тем сложнее потом вычистить следы.
Что проверить перед изменениями
- Есть ли у записей два или больше рабочих URL.
- Используются ли категории в хлебных крошках и в постоянных ссылках.
- Есть ли уже настроенные 301-редиректы на старые адреса.
- Не ломают ли текущие правила адреса рубрик, страниц и вложений.
- Не закрыты ли нужные разделы от индексации случайно.
Диагностика: где именно появляются дубли
Сначала не трогайте структуру ссылок вслепую. Сначала найдите источник дублей. В WordPress это обычно один из трёх вариантов: настройки постоянных ссылок, плагин для SEO/чистки, или кастомный код в теме.
Проверьте адреса вручную: откройте одну запись по всем вариантам, которые могли сохраниться в старых ссылках. Если один вариант отдаёт 200 OK, а другой тоже открывается без редиректа, дубли уже есть. Если один вариант редиректит на другой, это нормально, но важно понять, какой адрес считается основным.
Полезно посмотреть и HTML-код страницы: в <link rel="canonical"> должен быть один канонический адрес. Если canonical указывает на URL с категорией, а в меню и карте сайта используется другой адрес, поисковик получает смешанный сигнал.
Пошаговое решение: убрать категорию из URL и сохранить редиректы
Есть два рабочих подхода. Первый — использовать плагин, который умеет чистить структуру ссылок и настраивать редиректы. Второй — править кодом, если нужен полный контроль и вы понимаете последствия для уже проиндексированных адресов.
Вариант 1: через плагин
Если на сайте уже стоит SEO-плагин или инструмент для технической чистки, проверьте, есть ли у него настройка удаления базы рубрик из URL записей. Это удобнее, чем писать собственные правила, если сайт ведётся не одним разработчиком. Например, в Clearfy Pro есть инструменты для чистки дублей и технических настроек WordPress, которые помогают убрать лишние элементы из структуры сайта без ручного редактирования ядра.
После включения такой опции обязательно проверьте, как плагин ведёт себя со старыми адресами: должен быть 301-редирект на новый канонический URL, а не 404 или цепочка из нескольких переходов.
Вариант 2: через код и редирект
Если вы хотите убрать категорию из постоянных ссылок записей, сначала убедитесь, что в Настройки → Постоянные ссылки используется структура, совместимая с вашей задачей. Затем можно добавить фильтр, который формирует URL записи без категории, а старые адреса перенаправляет на новый вариант.
Ниже пример для темы или мини-плагина. Он не меняет саму таксономию рубрик, а только убирает категорию из ссылки записи и пытается сохранить редирект со старого адреса.
<?php
add_filter( 'post_link', 'wpdev_remove_category_from_post_link', 10, 3 );
function wpdev_remove_category_from_post_link( $permalink, $post, $leavename ) {
if ( $post->post_type !== 'post' ) {
return $permalink;
}
$permalink = home_url( user_trailingslashit( $post->post_name ) );
return $permalink;
}
add_action( 'template_redirect', 'wpdev_redirect_old_category_urls' );
function wpdev_redirect_old_category_urls() {
if ( is_admin() || ! is_singular( 'post' ) ) {
return;
}
$current = home_url( add_query_arg( array(), $GLOBALS['wp']->request ) );
$canonical = get_permalink();
if ( untrailingslashit( $current ) !== untrailingslashit( $canonical ) ) {
wp_safe_redirect( $canonical, 301 );
exit;
}
}Этот пример намеренно простой. На живом сайте редирект лучше делать точнее: не сравнивать абстрактные строки, а отлавливать именно старые шаблоны URL. Иначе можно случайно задеть служебные адреса или нестандартные правила.
Если нужно сохранить рубрики в хлебных крошках, но убрать их из URL
Это нормальный компромисс. Категория может оставаться в навигации и архивах, но не обязана быть частью адреса записи. Важно не путать структуру URL с логикой контента. Рубрика нужна для навигации и внутренней перелинковки, а не как обязательный сегмент пути.
| Подход | Плюсы | Минусы |
|---|---|---|
| Плагин | Быстрее внедрить, меньше ручного кода | Зависимость от настроек и обновлений |
| Код в мини-плагине | Полный контроль над логикой редиректов | Нужно тестировать на всех типах URL |
| Оставить как есть и закрыть дубли canonical | Меньше вмешательства в структуру | Дубли остаются в обходе и внутренних ссылках |
Проверка результата после внедрения
После правки не ограничивайтесь открытием одной записи в браузере. Проверьте несколько точек:
- старый URL отдаёт 301, а не 200;
- новый URL открывается без цепочки редиректов;
- в исходном коде страницы canonical указывает на новый адрес;
- в XML-карте сайта остался только новый URL;
- внутренние ссылки в меню, блоках и статьях ведут на новый вариант;
- страницы рубрик и архивов не сломались.
Если есть доступ к командной строке, можно быстро проверить ответ сервера:
curl -I https://example.com/category/news/post-name/
curl -I https://example.com/post-name/В первом случае ожидается 301 Moved Permanently, во втором — 200 OK. Если вместо этого вы видите 302, редирект временный, и это плохой вариант для постоянной смены структуры.
Частые ошибки и как их исправить
Редирект сделан, но дубли остались в индексе
Это бывает, если старые URL всё ещё массово присутствуют во внутренних ссылках или в карте сайта. Поисковик продолжает их обходить и видит, что адреса живые. Исправление простое: обновить ссылки в меню, блоках и шаблонах, затем пересобрать sitemap.
После удаления категории сломались старые записи
Причина обычно в том, что в структуре permalink были завязаны не только записи, но и рубрики, страницы или вложенные типы записей. Перед изменением структуры нужно проверить, не используется ли похожий шаблон для других сущностей. Если сайт большой, лучше сначала сделать правку на копии или staging-сервере.
Появились 404 на архивы рубрик
Это не всегда ошибка. Если рубрики больше не нужны как отдельные посадочные страницы, их можно оставить, но закрыть от индексации или настроить аккуратный редирект на релевантный раздел. Главное — не перенаправлять всё подряд на главную, это ухудшает качество редиректов и мешает пользователю.
Canonical указывает не туда
Иногда SEO-плагин продолжает генерировать старый канонический адрес из-за кэша или конфликта фильтров. После изменения структуры очистите кэш плагина, серверный кэш и CDN, если он есть. Затем перепроверьте исходный код страницы.
Безопасность и производительность: что не забыть
Любая правка URL-структуры влияет на кэш, редиректы и обход сайта. Поэтому изменения лучше вносить через мини-плагин или child theme, а не в functions.php активной темы, если проект живой и часто обновляется. Так проще откатить правку и не потерять её при смене темы.
Если сайт уже получает трафик, не делайте массовую смену URL без списка старых адресов. Для крупных проектов полезно заранее выгрузить текущие URL из sitemap или базы и держать таблицу соответствий. Это экономит время, когда нужно быстро найти источник 404.
Если вам нужен не только контроль дублей, но и более широкая техническая чистка WordPress — удаление лишних архивов, настройка индексации, работа с дублями и служебными страницами — имеет смысл смотреть на инструменты вроде Clearfy Pro. Но даже с плагином базовая проверка остаётся той же: редирект, canonical, sitemap и внутренние ссылки должны совпадать по логике.
Короткий чек-лист перед публикацией изменений
- Старые адреса записей дают 301.
- Новые адреса открываются без лишних переходов.
- Canonical совпадает с основным URL.
- В sitemap нет старых вариантов.
- Меню и внутренние ссылки обновлены.
- Архивы рубрик либо работают как задумано, либо закрыты/перенаправлены осознанно.
Если после внедрения всё это сходится, значит вы убрали дубли не косметически, а технически. Именно такой результат нужен, когда задача — не просто спрятать категорию из URL, а сохранить нормальную индексацию и предсказуемую структуру сайта.