Редирект /page/2 на первую страницу при использовании $paged
Я настроил пользовательский запрос для своих записей (single.php) с пагинацией, которая, кстати, отлично работает со стандартной структурой постоянных ссылок.
domain.com/p=ID&paged=2
Но если я переключаю постоянные ссылки на /%postname%/, переход на page/2/ перенаправляет на первую страницу.
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args=array( 'connected_type'=> 'posts_to_posts', 'posts_per_page' => 3, 'paged' => $paged, 'order' => 'ASC', 'connected_items' => get_queried_object() );
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query( $args );
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php the_title(); ?></a>
<?php endwhile; endif; $wp_query = null; $wp_query = $temp; wp_reset_query(); ?>
Меня смущает тот факт, что это работает со стандартными постоянными ссылками, но не работает с "красивыми" ЧПУ.
Пагинация на главной странице работает нормально, проблемы только со страницами записей. Может кто-нибудь подсказать, в каком направлении искать ошибку?
Я деактивировал все плагины, удалил htaccess и создал новый, но ничего не помогло.
Если кто-то столкнулся с этой проблемой, вы можете добавить этот код в файл functions.php
add_filter('redirect_canonical','pif_disable_redirect_canonical');
function pif_disable_redirect_canonical($redirect_url) {
if (is_singular()) $redirect_url = false;
return $redirect_url;
}

Это давняя проблема с пагинацией для пользовательских типов записей. На неё есть открытый тикет в трекере разработки WordPress. Последнее рабочее решение, которое было найдено в трекере, представлено ниже. Оно отлично работает в моём случае.
/**
* Исправление проблемы с пагинацией для пользовательского типа записей
*
* @link https://core.trac.wordpress.org/ticket/15551
*
* @param object $request WP_Query
*
* @return object
*/
function child_martfury_fix_request_redirect( $request ) {
if ( isset( $request->query_vars['post_type'] )
&& 'custom_type' === $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', 'child_martfury_fix_request_redirect' );

Если это не основной цикл (например, на странице блога), WordPress интерпретирует /2 как имя подстраницы, а не как query_var для пагинации.
Если вам нужно, чтобы это работало на странице, необходимо зарегистрировать пользовательский query_var http://codex.wordpress.org/WordPress_Query_Vars и использовать структуру, например, /page/paging/2.

Но если это так, то это не должно работать и с дефолтными постоянными ссылками, разве я не прав? Если у тебя есть идеи, что я могу попробовать, дай мне знать.

Да, ты прав :) "Дефолтные" постоянные ссылки не требуют перезаписи query_vars, поэтому большинство GET-параметров будут распарсены и доступны. Вот почему это работает.

Спасибо, ты направил меня в другое русло. Я искал проблемы с редиректами в пагинации и нашел это решение, отлично сработало с моим текущим кодом. :)

Я пробовал наиболее известное решение, и оно не сработало для меня - использование /page-name/?page=2
всё равно перенаправляло меня на /page-name/
.
Также заметил, что использование ?p=2
тоже не работало.
Единственное решение, которое я нашёл - это использование другого имени параметра, например ?pg=2
, которое не вызывает перенаправления и доступно через $_GET['pg']
.
