Задача. Есть стандартные записи WordPress и есть пользовательский тип записей ‘selection’. Создали шаблон single-selection.php
в котором выводим список стандартных записей, исходя из настроек кастомного поста. Возникла проблема с пагинацией, а точнее со страницами пагинации — при переходе на /my-custom-page/page/2/
перенаправляло на первую страницу /my-custom-page/
.
Зачем это нужно. В моем случае я хотел сделать страницы на которых будут выводиться посты с определенными терминами таксономий. По сути как если бы мы использовали фильтры на сайте, выбирая нужные нам категории, метки или что-то другое, но только на этих страницах мы можем настраивать title
, description
и h1
ил что-то ещё.
Решение. В Код №1 указан условный шаблон как выводятся стандартные Записи WP на странице пользовательского типа записей ‘selection’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* Шаблон кастомного типа записи */ # Создаем запрос WP_Query для выборки записей $paged = get_query_var('paged') ? get_query_var('paged') : 1; // Определяем текущую страницу пагинации $args = array( 'post_type' => 'post', // Посты 'tax_query' => $tax_query, 'posts_per_page' => (int) get_option('posts_per_page'), // Выводим количество записей на страницу из настроек 'paged' => $paged ); $query = new WP_Query($args); # Вывод постов if ( $query->have_posts() ) { while ( $query->have_posts() ) : $query->the_post(); get_template_part( 'template-parts/content-card'); endwhile; wp_reset_postdata(); # Pagination echo '<nav class="navigation pagination" aria-label="Пагинация страниц"><div class="nav-links">'; echo paginate_links(array( 'base' => get_permalink($post->ID) . '%_%', 'format' => 'page/%#%/', 'total' => $query->max_num_pages, 'current' => max(1, get_query_var('paged')), 'prev_text' => __('<span class="icon-nav-previous"></span>'), 'next_text' => __('<span class="icon-nav-next"></span>') )); echo '</div></nav>'; } |
the_posts_pagination()
здесь не работает, т.к. она работает с архивами.Важно! Проблема в пагинации на пользовательского типа записях в том, что при переходе на страницы по типу /my-custom-page/page/2/
перенаправляет на первую страницу /my-custom-page/
. Это решается используя Код №2 в functions.php
. * Не забудьте обновить страницу Постоянных ссылок в настройках WordPress.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function qfurs_fix_request_redirect( $request ) { if ( isset( $request->query_vars['post_type'] ) && 'selection' === $request->query_vars['post_type'] && true === $request->is_singular && - 1 == $request->current_post && true === $request->is_paged ) { add_filter( 'redirect_canonical', '__return_false' ); } return $request; } add_action( 'parse_query', 'qfurs_fix_request_redirect' ); |
functions.php
предотвращает неправильные редиректы на страницах пагинации для постов типа ‘selection’:
isset( $request->query_vars['post_type'] )
— проверяет, задан ли параметр post_type в запросе.'selection' === $request->query_vars['post_type']
— убедится, что post_type равен ‘selection’, то есть это страница поста типа selection.true === $request->is_singular
— проверяет, что это одиночная страница (а не архив или другая страница).-1 == $request->current_post
— проверяет, что текущий пост не найден, что может происходить на страницах пагинации, когда запрос не возвращает постов.true === $request->is_paged
— проверяет, что это запрос пагинации.- Отмена редиректа:
add_filter( 'redirect_canonical', '__return_false' );
— отключает автоматические канонические редиректы, которые могут перенаправлять пользователя с URL пагинации на основную страницу поста.
return $request
— возвращает измененный запрос, который будет использоваться в WordPress.
Этот код позволяет корректно обрабатывать пагинацию на одиночных страницах пользовательского типа, в данном случае он назван ‘selection’), предотвращая нежелательные редиректы на основную страницу записи.