Создание простой пагинации для шаблонов произвольного типа записей
У меня есть произвольный тип записей 'news', и я пытаюсь настроить правильную пагинацию. Мне нужны простые ссылки "предыдущая" и "следующая", без нумерации страниц посередине.
В файле page-news.php мой код выглядит так:
<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array('post_type' => 'news', 'posts_per_page' => 2, 'paged' => $paged);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
?>
// Цикл
<?php endwhile; wp_reset_postdata(); ?>
<div id="pagination" class="clearfix">
<?php posts_nav_link(); ?>
</div>
Вышеуказанный код показывает 2 записи, но ссылки пагинации не отображаются
Вот мой код регистрации произвольного типа записей:
function custom_post_news() {
register_post_type( 'news',
array('labels' => array(
'name' => __('Новости', 'post type general name'), /* Это заголовок группы */
'singular_name' => __('Новость', 'post type singular name'), /* Это индивидуальный тип */
'add_new' => __('Добавить новую', 'custom post type item'), /* Пункт меню добавления */
'add_new_item' => __('Добавить новую'), /* Заголовок добавления */
'edit' => __( 'Редактировать' ), /* Диалог редактирования */
'edit_item' => __('Редактировать'), /* Заголовок редактирования */
'new_item' => __('Новая '), /* Заголовок новой записи */
'view_item' => __('Просмотр'), /* Заголовок просмотра */
'search_items' => __('Поиск новостей'), /* Заголовок поиска */
'not_found' => __('Ничего не найдено в базе данных.'), /* Отображается, если записей нет */
'not_found_in_trash' => __('В корзине ничего не найдено'), /* Отображается, если в корзине пусто */
'parent_item_colon' => ''
), /* конец массива */
'description' => __( 'Это пример произвольного типа записей' ), /* Описание типа записей */
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'query_var' => true,
'menu_position' => 2, /* порядок отображения в левом меню */
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'news', 'with_front' => true ),
/* следующий параметр важен, он указывает, что включено в редакторе записей */
'supports' => array( 'title', 'editor', 'thumbnail')
)
);
}
// РЕГИСТРАЦИЯ ТАКСОНОМИИ
add_action( 'init', 'custom_post_news');
register_taxonomy( 'custom_news',
array('news'), /* если вы измените название register_post_type( 'movies', то нужно изменить и это */
array('hierarchical' => true,
'labels' => array(
'name' => __( 'Категории новостей' ), /* название произвольной таксономии */
'singular_name' => __( 'Категория новостей' ), /* единичное название таксономии */
'search_items' => __( 'Поиск категорий новостей' ), /* заголовок поиска для таксономии */
'all_items' => __( 'Все категории новостей' ), /* заголовок для всех таксономий */
'parent_item' => __( 'Родительская категория новостей' ), /* родительский заголовок для таксономии */
'parent_item_colon' => __( 'Родительская категория новостей:' ), /* родительский заголовок таксономии */
'edit_item' => __( 'Редактировать категорию новостей' ), /* заголовок редактирования таксономии */
'update_item' => __( 'Обновить категорию новостей' ), /* заголовок обновления таксономии */
'add_new_item' => __( 'Добавить новую новость' ), /* заголовок добавления новой таксономии */
'new_item_name' => __( 'Новая произвольная новость' ) /* заголовок имени новой таксономии */
),
'show_ui' => true,
'query_var' => true,
)
);
Это пользовательская тема (созданная с нуля), поэтому в functions.php нет ничего, что касается пагинации. Я просмотрел множество ответов в интернете, но получаю разные решения, и ничего не работает.
У меня также нет файла archive-news.php, так как я не уверен, нужно ли его реализовывать или нет?

posts_nav_link()
здесь не сработает
Полезно для обеспечения постраничной навигации на главной странице, в категориях и архивах.
Вам придется использовать более универсальные функции next_posts_link()
и previous_posts_link()
. Только убедитесь, что задали параметр $max_pages
для next_posts_links()
, иначе он не будет работать. Также имейте в виду, что если эта страница используется как статическая главная страница, то следует использовать page
, а не paged
.
РЕДАКТИРОВАНИЕ 1
Используйте вышеупомянутые ссылки следующим образом:
next_posts_link( 'Старые записи', $loop->max_num_pages );
previous_posts_link( 'Новые записи' );
РЕДАКТИРОВАНИЕ 2
Кажется, есть небольшое недопонимание. Попробуйте следующее:
В аргументах вашего пользовательского типа записи, при регистрации добавьте параметр
'has_archive' => true
. Ваша функция должна выглядеть так:function custom_post_news() { register_post_type( 'news', array('labels' => array( 'name' => __('Новости', 'post type general name'), /* Название группы */ 'singular_name' => __('Новость', 'post type singular name'), /* Название отдельного типа */ 'add_new' => __('Добавить новую', 'custom post type item'), /* Пункт меню "Добавить новую" */ 'add_new_item' => __('Добавить новую'), /* Заголовок добавления новой записи */ 'edit' => __( 'Редактировать' ), /* Диалог редактирования */ 'edit_item' => __('Редактировать'), /* Заголовок редактирования */ 'new_item' => __('Новая '), /* Заголовок новой записи */ 'view_item' => __('Просмотреть'), /* Заголовок просмотра */ 'search_items' => __('Искать новости'), /* Заголовок поиска по типу */ 'not_found' => __('Ничего не найдено в базе данных.'), /* Отображается, если записей еще нет */ 'not_found_in_trash' => __('Ничего не найдено в корзине'), /* Отображается, если в корзине ничего нет */ 'parent_item_colon' => '' ), /* конец массивов */ 'description' => __( 'Это пример пользовательского типа записи' ), /* Описание типа */ 'public' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'show_ui' => true, 'query_var' => true, 'menu_position' => 2, /* Позиция в меню */ 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => array('slug' => 'news', 'with_front' => true ), 'has_archive' => true, /* Следующий параметр важен - он определяет, что включено в редакторе записи */ 'supports' => array( 'title', 'editor', 'thumbnail') ) ); }
После этого сбросьте постоянные ссылки и посетите главную страницу.
Создайте файл
archive-news.php
. Он должен выглядеть так:<?php while ( have_posts() ) : the_post(); ?> // Цикл <?php endwhile; ?> <div id="pagination" class="clearfix"> <?php posts_nav_link(); ?> </div>
Затем в файле functions.php используйте
pre_get_posts
, чтобы изменить основной запрос по необходимости:add_action( 'pre_get_posts', function ( $q ) { if( !is_admin() && $q->is_main_query() && $q->is_post_type_archive( 'news' ) ) { $q->set( 'posts_per_page', 2 ); } });
Удалите страницу, которую вы создали в административной панели. Теперь все должно работать идеально.

Извините, я вижу, что вы только что оставили комментарий, как я сам разобрался, поэтому удалил их. В любом случае, спасибо за обновления. Это работает в плане отображения ссылки 'Старые записи', но она ведет обратно на страницу index.php

Это связано с вашими правилами перезаписи. Вы сбрасывали постоянные ссылки?

Этот код (второй блок кода в вопросе) уже находится в моем functions.php — я снова сбросил кэш, пересохранив настройки постоянных ссылок, но это все еще не работает.

Конечно, я удалил этот комментарий. Я отделил endwhile и разместил его после цикла, затем добавил ссылки на следующую и предыдущую записи (next и prev post_links), закрыл это с помощью wp_reset_postdata(); сбросил кэш, но все равно попадаю на index.php.

Ты легенда! Это сработало. Вот что я сделал (чтобы помочь другим). Использовал твой код для next/prev. Добавил has_archive => true в register_post_type, затем перенес весь код из page-news.php в archive-news.php, и это сработало. Спасибо за помощь!
