Создание простой пагинации для шаблонов произвольного типа записей

1 февр. 2015 г., 15:23:55
Просмотры: 52.8K
Голосов: 0

У меня есть произвольный тип записей '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, так как я не уверен, нужно ли его реализовывать или нет?

0
Все ответы на вопрос 1
7

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 );
    
        }
    
    });
    
  • Удалите страницу, которую вы создали в административной панели. Теперь все должно работать идеально.

1 февр. 2015 г. 16:57:09
Комментарии

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

Jack Barham Jack Barham
1 февр. 2015 г. 20:51:30

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

Pieter Goosen Pieter Goosen
1 февр. 2015 г. 20:52:51

Упс, думал, что это отформатируется

Jack Barham Jack Barham
1 февр. 2015 г. 20:55:51

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

Jack Barham Jack Barham
1 февр. 2015 г. 21:13:09

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

Jack Barham Jack Barham
1 февр. 2015 г. 21:28:01

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

Jack Barham Jack Barham
1 февр. 2015 г. 21:53:27

Просто проверь моё обновление, я только что сделал то же самое в правке, но правильным способом. Я уже иду спать. Надеюсь, моё обновление тоже тебе поможет. Приятного :-)

Pieter Goosen Pieter Goosen
1 февр. 2015 г. 21:54:13
Показать остальные 2 комментариев