Пагинация на пользовательском шаблоне страницы

25 окт. 2011 г., 21:23:15
Просмотры: 13.9K
Голосов: 3

Я создал пользовательский тип записей '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.

Как правильно добавить пагинацию на пользовательский шаблон страницы?

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

Вот что я делаю для постраничной навигации. Надеюсь, это поможет вам встать на правильный путь, хотя это может быть избыточно для вашей задачи...

Сначала я устанавливаю переменную $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>';

Повторюсь, это может быть избыточно, но работает отлично.

1 дек. 2011 г. 19:56:39
Комментарии

функция paginate_links($pagination) возвращает пустое значение в моем случае

AGrush AGrush
14 апр. 2022 г. 17:05:33
0

Вы уверены, что у вас нет страницы с таким же именем, как и у вашего пользовательского типа записей? Если такая страница существует, правила перезаписи постоянных ссылок могут запутаться и вызвать ошибку 404.

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

Также всегда не забывайте перезаписывать файл .htaccess после создания нового пользовательского типа записей.

19 апр. 2022 г. 11:40:08