404 на страницах рубрик, меток, архивов произвольных типов записей и таксономий обычно появляются не из-за «битых ссылок» как таковых, а из-за несоответствия между зарегистрированной таксономией, шаблоном темы и правилами пермалинков. На практике это часто всплывает после миграции, смены темы, отключения плагина или правки register_post_type() и register_taxonomy().
Если у вас часть архивов открывается, а часть отдает 404, не начинайте с переустановки WordPress. Сначала проверьте, что именно сломалось: правила перезаписи, сам объект таксономии, шаблон архива или конфликт с плагином, который регистрирует тот же slug.
Как понять, где именно возникает 404
Симптомы похожи, но причины разные. Если URL существует, а страница отдает 404, это может быть:
- необновленные правила пермалинков после изменения CPT или таксономии;
- таксономия зарегистрирована, но не привязана к нужному типу записи;
- slug рубрики, метки или таксономии совпадает с slug страницы, записи или другого архива;
- тема не содержит шаблон
taxonomy.php,archive.phpили ожидаемый fallback работает некорректно; - плагин кеша отдает старую версию маршрута;
- плагин/тема удалили регистрацию объекта, а ссылки в контенте остались.
Быстрая диагностика в админке
Начните с простого:
- Откройте Настройки → Постоянные ссылки и просто нажмите «Сохранить изменения».
- Проверьте, открываются ли стандартные архивы рубрик и меток.
- Если проблема только у одного CPT или одной таксономии, временно переключитесь на стандартную тему и отключите плагины, которые регистрируют контентные типы.
- Очистите кеш страницы и объектный кеш, если он есть.
Если после пересохранения пермалинков проблема ушла, значит дело было в rewrite rules. Если нет — нужно смотреть регистрацию сущностей и шаблоны.
Пошаговое решение для архивов и таксономий
1. Проверьте регистрацию CPT и таксономии
Частая ошибка — таксономия создана, но не привязана к нужному типу записи, либо slug меняли в одном месте и забыли в другом. Пример корректной регистрации:
add_action('init', function () {
register_post_type('book', [
'label' => 'Книги',
'public' => true,
'has_archive' => true,
'rewrite' => ['slug' => 'books'],
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);
register_taxonomy('book_genre', ['book'], [
'label' => 'Жанры',
'public' => true,
'hierarchical' => true,
'rewrite' => ['slug' => 'book-genre'],
'show_in_rest' => true,
]);
});Здесь важно, чтобы 'book' был в массиве объектов для register_taxonomy(). Если этого нет, архив таксономии может существовать в базе, но WordPress не будет корректно строить маршрут.
2. Обновите rewrite rules после изменений
Если вы меняли rewrite, has_archive или slug таксономии, правила нужно обновить. Вручную это делается через сохранение постоянных ссылок. Если вы разворачиваете сайт на staging и переносите на production, лучше не рассчитывать на память администратора.
Для одноразового сброса правил можно использовать такой подход в плагине или временно в теме:
add_action('init', function () {
if (get_option('my_flush_rewrite_rules_once') !== 'done') {
flush_rewrite_rules(false);
update_option('my_flush_rewrite_rules_once', 'done');
}
});Этот код нельзя держать постоянно без контроля: flush_rewrite_rules() тяжелая операция, и на каждом запросе ее вызывать нельзя.
3. Убедитесь, что шаблон архива существует
Если у CPT или таксономии есть маршрут, но тема не умеет его выводить, WordPress может показать 404 или не тот шаблон. Для таксономий проверьте наличие:
taxonomy.php;taxonomy-book_genre.phpдля конкретной таксономии;archive.phpкак fallback;archive-book.phpдля архива CPT.
Если тема кастомная, откройте шаблон и убедитесь, что в нем есть основной цикл:
<?php if (have_posts()) : ?>
<header class="archive-header">
<h1><?php single_term_title(); ?></h1>
<?php the_archive_description('<div class="archive-description">', '</div>'); ?>
</header>
<div class="archive-list">
<?php while (have_posts()) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
</article>
<?php endwhile; ?>
</div>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>Записей не найдено.</p>
<?php endif; ?>4. Проверьте конфликт slug
Если у страницы, рубрики и таксономии одинаковый slug, WordPress может выбрать не тот маршрут. Например, /news/ может быть страницей, архивом рубрики или архивом CPT в зависимости от порядка правил и настроек.
Что делать:
- переименовать slug таксономии или страницы;
- избегать одинаковых баз для CPT и таксономий;
- не использовать слишком общие slug вроде
blog,news,catalogдля всего подряд.
Когда проблема в плагине или теме
Если 404 появились после установки SEO-плагина, плагина фильтров или кастомного каталога, проверьте, не перехватывает ли он запросы через pre_get_posts, template_include или собственные rewrite rules. Нередко плагин добавляет красивый URL, но после отключения старые ссылки продолжают жить в индексе и ведут в никуда.
Для проверки временно отключите подозрительный плагин и откройте тот же URL. Если архив заработал, ищите конфликт в регистрации маршрута или шаблона.
Проверка результата после внедрения
После исправлений проверьте не только сам URL, но и соседние сценарии:
- открывается ли архив таксономии без 404;
- работает ли пагинация на второй и третьей странице архива;
- не ломаются ли канонические URL;
- не ведет ли старый адрес на редирект или в 404;
- не дублируется ли архив по нескольким путям.
Удобно проверить ответ сервера через curl:
curl -I https://example.com/book-genre/fiction/
curl -I https://example.com/books/
curl -I https://example.com/book-genre/fiction/page/2/В ответе должен быть 200 OK, а не 404 Not Found. Если первая страница открывается, а пагинация нет, значит проблема уже не в регистрации таксономии, а в правилах перезаписи или шаблоне пагинации.
Частые ошибки и как их исправить
Сохранили постоянные ссылки, но 404 остались
Значит, проблема не только в rewrite rules. Проверьте slug, шаблон и регистрацию таксономии. Иногда помогает только полная пере-регистрация объекта после смены темы или плагина.
Таксономия есть в админке, но архив не открывается
Обычно это означает, что таксономия зарегистрирована без нужного объекта или с неверным rewrite. Также проверьте, не отключен ли public или publicly_queryable.
404 только на второй странице архива
Это типичный симптом конфликта с пагинацией или кастомным rewrite. Проверьте, не перехватывает ли тема запросы через query_vars и не ломает ли плагин структуру ссылок.
После смены темы архивы исчезли
Значит, старая тема могла регистрировать CPT или таксономию сама. Если регистрацию не вынесли в плагин, WordPress теряет объект вместе с темой. Это плохая архитектура: контентный тип должен жить отдельно от шаблона.
Чек-лист перед публикацией исправления
- slug таксономии не совпадает со slug страницы или другого архива;
- таксономия привязана к нужному post type;
- после изменений пересохранены постоянные ссылки;
- в теме есть подходящий шаблон архива;
- пагинация на архиве открывается без 404;
- старые URL либо редиректятся, либо удалены из внутренних ссылок;
- кеш очищен на уровне плагина, сервера и CDN.
Практические советы по безопасности и производительности
Не держите flush_rewrite_rules() в коде, который исполняется на каждом запросе. Если нужно автоматизировать сброс после активации плагина, делайте это в хук активации, а не в init. Для темы или плагина это безопаснее и дешевле по ресурсам.
Если архивов много, а часть из них не нужна для индексации, лучше закрыть их от поисковиков через noindex на уровне SEO-плагина или шаблона, чем оставлять пустые страницы с 404. Но сначала убедитесь, что вы не скрываете полезный контент вместе с мусором.
Если вам нужно системно чистить дубли, пустые архивы и технические хвосты, имеет смысл посмотреть в сторону инструментов вроде Clearfy Pro: он помогает закрывать типовые SEO-дубли и убирать лишние элементы без ручной правки каждой темы. Подробности есть на странице плагина.
Главная проверка простая: если архив открывается напрямую, пагинация работает, а старые URL не конфликтуют с новыми, значит маршрут восстановлен корректно. Если нет — возвращайтесь к регистрации объекта и slug, а не к косметике в шаблоне.