Диагностика проблемы: почему при переходе по страницам пагинации возникает 404 ошибка
Ошибка 404 при попытке перейти на вторую и последующие страницы пагинации кастомного типа записей (CPT) — частая проблема в WordPress. Это связано с тем, что WordPress не всегда корректно обрабатывает параметр paged в запросах для CPT, если не настроены правильно правила перезаписи (rewrite rules) и параметры запроса.
Основные причины:
- Неправильная регистрация кастомного типа записей — отсутствует или некорректно задан параметр
'has_archive' => true. - Параметр
rewriteили'rewrite' => array('with_front' => false)настроен некорректно, из-за чего URL пагинации не распознается. - Отсутствие сброса правил перезаписи после регистрации CPT.
- Неправильный вызов или использование параметра
pagedв WP_Query.
Пошаговое решение: как настроить пагинацию для кастомных типов записей без ошибок 404
1. Проверьте регистрацию кастомного типа записей
Убедитесь, что при регистрации CPT установлен параметр has_archive и правильно настроен rewrite. Пример правильной регистрации:
register_post_type('product', array(
'label' => 'Продукты',
'public' => true,
'has_archive' => true, // Включаем архив для пагинации
'rewrite' => array('slug' => 'products', 'with_front' => false),
'supports' => array('title', 'editor', 'thumbnail'),
));2. Сбросьте пермалинки
После внесения изменений в регистрацию CPT обязательно нужно обновить правила перезаписи, чтобы WordPress распознал новые URL. Делается это в админке в разделе Настройки > Постоянные ссылки — просто нажмите кнопку «Сохранить изменения» без изменения настроек.
3. Правильно используйте параметр paged в WP_Query
Если вы выводите записи CPT кастомным запросом, обязательно передавайте параметр paged из запроса:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
);
$query = new WP_Query($args);Без этого параметра пагинация работать не будет.
4. Используйте правильные ссылки для пагинации
Для вывода пагинации используйте стандартные функции WordPress, например paginate_links() с правильными параметрами:
echo paginate_links(array(
'total' => $query->max_num_pages,
'current' => $paged,
'format' => 'page/%#%/',
'base' => get_post_type_archive_link('product') . '%_%',
));Проверка результата после внедрения
1. Перейдите на страницу архива вашего кастомного типа записей, например /products/.
2. Попробуйте перейти на вторую страницу пагинации /products/page/2/.
3. Страница должна успешно загрузиться без ошибки 404 и показать следующую порцию записей.
4. Проверьте, что пагинация корректно работает и ссылки ведут на правильные страницы.
Частые ошибки и как их исправить
- Ошибка 404 после перехода по пагинации: не обновлены правила перезаписи — просто сохраните пермалинки заново.
- Пагинация всегда показывает первую страницу: проверьте, что параметр
pagedпередаётся в WP_Query. - URL пагинации ведут на несуществующие страницы: проверьте параметр
rewriteи базовый URL вpaginate_links(). - Пагинация не работает с кастомными таксономиями: убедитесь, что запрос учитывает параметры таксономий и совместим с пагинацией.
Практические советы по производительности и безопасности
- Используйте параметры
posts_per_pageс разумным числом, чтобы избежать нагрузки на сервер при больших объемах данных. - Кешируйте результаты запросов, если пагинация выводится на страницах с высокой посещаемостью.
- При использовании пользовательских запросов в шаблонах не забывайте вызывать
wp_reset_postdata()после цикла, чтобы избежать конфликтов с глобальным запросом WordPress. - Если используете AJAX пагинацию для CPT, убедитесь, что nonce передаются и проверяются для защиты от CSRF.
Сравнение вариантов реализации пагинации для CPT
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартный архив CPT + WP_Query с paged | Простота, поддержка из коробки, SEO-дружелюбно | Требуется правильная регистрация CPT и пермалинки | Стандартные сайты с архивами CPT |
| Кастомные страницы с AJAX пагинацией | Быстрая загрузка, улучшенный UX | Сложнее в реализации, требует JS и проверки безопасности | Интерактивные каталоги, магазины |
| Пагинация через параметры URL (GET) | Простота, не требует пермалинок | Меньше SEO-оптимизации, иногда плохой UX | Вспомогательные фильтры и сортировки |