Как исправить ошибку 404 при пагинации кастомных типов записей в WordPress

Диагностика проблемы: почему пагинация кастомных типов записей ведёт на 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 пагинациюТребует навыков разработки, сложнее поддерживать

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как сделать пагинацию для постов по датам в WordPress
15.12.2025
Как использовать пагинацию с AJAX и кешированием в WP-PageNavi
28.01.2026
Как быстро исправить ошибку 404 при переходе по страницам пагинации в WordPress
06.05.2026
Как исправить неработающую пагинацию WooCommerce при фильтрации и сортировке
17.06.2026
Как сделать пагинацию для WordPress на основе пользовательского запроса WP_Query
14.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше