Диагностика ошибки 404 при пагинации кастомных типов записей
Ошибка 404 при переходе по страницам пагинации кастомных типов записей — частая проблема в WordPress. Обычно это связано с неправильной работой параметра paged в запросах WP_Query или некорректной настройкой постоянных ссылок.
Чтобы диагностировать проблему, проверьте:
- Правильно ли передается параметр
pagedв запрос. - Обновлены ли правила перезаписи (rewrite rules) после регистрации кастомного типа записи.
- Не конфликтуют ли другие плагины или темы с пагинацией.
Проверка текущих правил перезаписи
Для просмотра правил перезаписи можно использовать следующий код в файле functions.php или в отдельном плагине для отладки:
add_action('init', function() {
global $wp_rewrite;
error_log(print_r($wp_rewrite->rules, true));
});В логах вы увидите текущие правила и сможете проверить, есть ли правила для пагинации кастомного типа записи.
Пошаговое решение проблемы
1. Правильная регистрация кастомного типа записи
При регистрации кастомного типа записи обязательно указывайте параметр 'has_archive' => true и корректный rewrite с 'with_front' => false, если требуется.
register_post_type('product', [
'label' => 'Товары',
'public' => true,
'has_archive' => true,
'rewrite' => [
'slug' => 'products',
'with_front' => false
],
'supports' => ['title', 'editor', 'thumbnail'],
]);2. Использование параметра paged в WP_Query
При выводе пагинации важно правильно передать текущую страницу в параметр paged. Пример правильного запроса:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
];
$query = new WP_Query($args);Обратите внимание, что для главной страницы пагинации иногда нужно использовать get_query_var('page'), если пагинация встроена в статическую страницу.
3. Сброс правил перезаписи
После изменения параметров регистрации кастомного типа записи или permalink-структуры необходимо сбросить правила перезаписи:
- Перейдите в Настройки > Постоянные ссылки в админке WordPress.
- Нажмите кнопку «Сохранить изменения» без внесения правок.
Это обновит правила и позволит WordPress корректно обрабатывать запросы пагинации.
Проверка результата после внедрения
- Перейдите на страницу архива кастомного типа записи (например,
/products/). - Проверьте, что пагинация отображается и работает, переходя по страницам.
- Убедитесь, что URL пагинации корректный, например
/products/page/2/. - Если возникает ошибка 404, повторите сброс правил перезаписи.
Частые ошибки и как их исправить
- Параметр paged не передается в WP_Query: обязательно используйте
get_query_var('paged')для получения текущей страницы. - Отсутствует 'has_archive' => true: без этого параметра архивная страница и пагинация не будут работать.
- Неправильный rewrite slug: конфликт с другими правилами или неправильный
slugприводит к 404. - Не сброшены правила перезаписи: после изменений всегда обновляйте их.
- Использование
query_postsвместоWP_Queryили неправильный хук для кастомного запроса.
Практические советы по производительности и безопасности
- Кэшируйте результаты запросов пагинации с помощью Transients API или внешних кешей, чтобы снизить нагрузку на базу данных.
- Избегайте избыточных и сложных запросов с большим количеством JOIN и LIKE, оптимизируйте мета-запросы.
- Проверяйте, чтобы пагинация не позволяла SQL-инъекции — используйте стандартные функции WordPress для параметров запроса.
Сравнение подходов к реализации пагинации кастомных типов записей
| Подход | Преимущества | Недостатки |
|---|---|---|
| Стандартный WP_Query с paged | Простота, поддержка WordPress, SEO-дружелюбность | Требует правильной настройки rewrite и сброса правил |
| Пользовательская пагинация на AJAX | Быстрая загрузка, плавный UX | Сложнее реализовать, требует дополнительного JS и кеширования |
| Использование плагинов (например, WP-PageNavi) | Удобство, готовые стили и функции | Может конфликтовать с кастомными запросами, лишний код |