Диагностика проблемы: почему пагинация кастомных типов записей ведёт на 404
Ошибка 404 при попытке перейти на вторую и последующие страницы пагинации кастомных типов записей (Custom Post Types, CPT) — частая проблема. Основные причины:
- Неправильная регистрация CPT без поддержки архивов (
has_archive). - Отсутствие или неправильная настройка параметра
rewriteпри регистрации CPT. - Сбои в правилах перезаписи URL (rewrite rules) после изменения CPT или структуры ссылок.
- Неправильное использование параметра
pagedв WP_Query.
Для подтверждения ошибки:
- Перейдите на страницу архива CPT (например,
/movies/). - Попробуйте перейти на вторую страницу пагинации (
/movies/page/2/). - Если появляется 404, значит, проблема с rewrite rules или регистрацией CPT.
Правильная регистрация кастомного типа записей для корректной пагинации
При регистрации CPT в functions.php или плагине обязательно укажите следующие параметры:
register_post_type('movies', array(
'label' => 'Фильмы',
'public' => true,
'has_archive' => true, // Обязательно для архивной страницы
'rewrite' => array('slug' => 'movies', 'with_front' => false),
'supports' => array('title', 'editor', 'thumbnail'),
));
has_archive должен быть true или строкой с нужным слагом. Без него WordPress не создаст архивную страницу, и пагинация сломается.
Принудительная перегенерация правил перезаписи
После изменения CPT и параметров перезаписи нужно сбросить правила:
- Откройте Настройки → Постоянные ссылки в админке и нажмите «Сохранить изменения» без изменений.
- Или программно вызовите
flush_rewrite_rules()(только один раз, например, при активации плагина):
function myplugin_flush_rewrites() {
register_post_type('movies', array(
'label' => 'Фильмы',
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'movies', 'with_front' => false),
));
flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'myplugin_flush_rewrites');
Пошаговое решение: корректная пагинация в WP_Query для CPT
При создании кастомного запроса для архива CPT пагинация должна учитывать параметр paged. Пример правильного кода для шаблона archive-movies.php:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'movies',
'posts_per_page' => 10,
'paged' => $paged,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h2>', '</h2>');
endwhile;
// Вывод пагинации
echo paginate_links(array(
'total' => $query->max_num_pages,
'current' => $paged,
));
else :
echo '<p>Записей не найдено</p>';
endif;
wp_reset_postdata();
Ключевой момент — получить текущую страницу из get_query_var('paged'), а не из $_GET или других источников.
Проверка результата: как убедиться, что пагинация работает
- Перейдите на архив кастомного типа, например
/movies/. - Проверьте, что на странице отображается список записей и пагинация внизу (ссылки на страницы).
- Кликните на вторую страницу пагинации
/movies/page/2/— должна открыться вторая страница без ошибки 404. - Включите WP_DEBUG для выявления ошибок, если что-то не работает:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false); // ошибки будут в wp-content/debug.log
Частые ошибки и как их исправить
- Отсутствует
has_archiveили установлен в false
Архив и пагинация не будут работать. Исправьте при регистрации CPT. - Не сброшены правила перезаписи после изменения CPT
Переходы на страницы пагинации ведут на 404. Сбросьте правила, зайдя в настройки постоянных ссылок или вызвавflush_rewrite_rules(). - Неправильное использование
pagedв WP_Query
Если не передатьpagedв аргументы запроса, пагинация не будет работать. - Конфликт с другими плагинами, модифицирующими rewrite rules
Временно отключите плагины, чтобы проверить. При необходимости добавьте приоритет в фильтры. - Использование
pageвместоpaged
Для пагинации WP_Query нужно именноpaged.
Практические советы по производительности и безопасности
- Кэширование запросов. Используйте Transients API или сторонние решения (например, WP Rocket) для кэширования страниц архива с пагинацией.
- Ограничение количества постов на страницу. Не ставьте слишком большое значение
posts_per_page— 10-20 оптимально для скорости загрузки. - Защита от SQL-инъекций. WP_Query безопасен при правильном использовании, но не передавайте параметры напрямую из
$_GETбез очистки. - Совместимость с SEO. Используйте канонические URL для страниц пагинации (SEO плагины как Clearfy Pro помогают автоматически управлять dublicate content).
Сравнение способов решения проблемы пагинации CPT
| Метод | Плюсы | Минусы |
|---|---|---|
| Правильная регистрация CPT и сброс rewrite rules | Нативное решение, стабильное, не требует сторонних плагинов | Нужно аккуратно настраивать и помнить сбрасывать правила |
| Использование плагинов для архивов и пагинации | Упрощает настройку, визуальные настройки | Зависимость от плагина, возможны конфликты |
| Полная кастомизация с WP_Query и шаблонами | Максимальный контроль, можно интегрировать AJAX пагинацию | Требует навыков разработки, сложнее поддерживать |