Пагинация на пользовательском шаблоне страницы
Я создал пользовательский тип записей 'Events'. По определенным причинам я решил не использовать archive-events.php
в качестве шаблона архива для моих событий. Вместо этого я создал пользовательский шаблон страницы page-upcoming-events.php
, который использую как архив.
Я написал пользовательский запрос в этом шаблоне для вывода событий. Также я ограничиваю posts_per_page до 4. Я успешно добавил ссылки пагинации с помощью функций previous_posts_link()
и next_posts_link()
.
Эти функции генерируют ссылки на ожидаемые URL: /upcoming-events/page/2/ и т.д.
На первой странице я получаю первые 4 события и ссылку на следующие события.
Проблема в том, что когда я перехожу на страницу 2, я получаю ошибку 404, а не события 5-8.
Как правильно добавить пагинацию на пользовательский шаблон страницы?

Вот что я делаю для постраничной навигации. Надеюсь, это поможет вам встать на правильный путь, хотя это может быть избыточно для вашей задачи...
Сначала я устанавливаю переменную $paged:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
Затем собираю массив $args, обязательно включая:
'paged' => $paged
Запускаю запрос с необходимыми функциями для постраничной навигации (это пример, измените его под свои нужды):
//запрос с использованием аргументов выше
$wp_query = new WP_Query( $args );
//используем запрос для постраничной навигации
$wp_query->query_vars[ 'paged' ] > 1 ? $current = $wp_query->query_vars[ 'paged' ] : $current = 1;
//настраиваем массив "paginate_links" по нашим требованиям. Примеры смотрите в кодексе http://codex.wordpress.org/Function_Reference/paginate_links (ссылка на английском)
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
//'format' => '',
'showall' => false,
'end_size' => 4,
'mid_size' => 4,
'total' => $wp_query->max_num_pages,
'current' => $current,
'type' => 'plain'
);
//строим ссылки для постраничной навигации
if ( $wp_rewrite->using_permalinks() )
$pagination[ 'base' ] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
//дополнительные ссылки для навигации
if ( !empty( $wp_query->query_vars[ 's' ] ) )
$pagination[ 'add_args' ] = array( 's' => get_query_var( 's' ) );
//выполняем запрос
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
Осталось только указать, где на странице должны отображаться ссылки:
//выводим ссылки постраничной навигации на страницу
echo '<div class="pydPaging">' . paginate_links($pagination) . '</div>';
Повторюсь, это может быть избыточно, но работает отлично.

Вы уверены, что у вас нет страницы с таким же именем, как и у вашего пользовательского типа записей? Если такая страница существует, правила перезаписи постоянных ссылок могут запутаться и вызвать ошибку 404.
Очень простое решение: страница, которая выводит список пользовательских типов записей, должна называться во множественном числе (например, "товары"), а сам тип записи — в единственном числе (например, "товар"). Таким образом, они не будут конфликтовать, и всё будет работать корректно.
Также всегда не забывайте перезаписывать файл .htaccess после создания нового пользовательского типа записей.
