Редирект /page/2 на первую страницу при использовании $paged

12 янв. 2014 г., 18:45:12
Просмотры: 15.1K
Голосов: 2

Я настроил пользовательский запрос для своих записей (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 и создал новый, но ничего не помогло.

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

Если кто-то столкнулся с этой проблемой, вы можете добавить этот код в файл 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;
}

Источник

12 янв. 2014 г. 19:40:39
Комментарии

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

Milo Milo
12 янв. 2014 г. 21:36:48

@Milo Есть ли альтернативное решение этой проблемы?

ianrandmckenzie ianrandmckenzie
26 янв. 2021 г. 14:24:20
0

Это давняя проблема с пагинацией для пользовательских типов записей. На неё есть открытый тикет в трекере разработки 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' );
22 апр. 2020 г. 12:48:34
3

Если это не основной цикл (например, на странице блога), WordPress интерпретирует /2 как имя подстраницы, а не как query_var для пагинации.

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

12 янв. 2014 г. 18:57:51
Комментарии

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

user156 user156
12 янв. 2014 г. 19:12:32

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

Robin Westerlundh Robin Westerlundh
12 янв. 2014 г. 19:22:57

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

user156 user156
12 янв. 2014 г. 19:39:19
0

Я пробовал наиболее известное решение, и оно не сработало для меня - использование /page-name/?page=2 всё равно перенаправляло меня на /page-name/.

Также заметил, что использование ?p=2 тоже не работало.

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

21 нояб. 2023 г. 15:49:28