Исправление ошибки 404 при пагинации произвольного типа записей

10 июл. 2011 г., 04:09:33
Просмотры: 31.7K
Голосов: 10

Пытаюсь решить эту проблему весь день, но пока безуспешно...

У меня есть произвольный тип записей 'news' и шаблон архива (archive-news.php), где я хочу показывать 2 записи с пагинацией. Это работает нормально до тех пор, пока я не пытаюсь перейти на "следующую страницу" (/news/page/2), которая возвращает ошибку 404.

Есть ли идеи, как это исправить / что я делаю неправильно?

Я буквально провел весь день в поисках решения, просматривая Google и форумы WordPress. Нашел много решений, но ни одно из них пока не сработало.

Моя функция регистрации произвольного типа записей: http://pastebin.com/uG1L6YNu
Мои правила перезаписи: http://pastebin.com/jbaDANYr

1
Комментарии

и еще... Мой файл news-archive.php: http://pastebin.com/vjcx77F7

Dale-Anthony Dale-Anthony
10 июл. 2011 г. 04:09:55
Все ответы на вопрос 4
5
21

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

Проблема заключалась в том, что WordPress по умолчанию настроен на отображение 10 записей на странице, что конфликтовало с моим запросом (ограничивающим вывод до 2 записей). Чтобы исправить это, я изменил настройку WordPress (Настройки / Чтение в админ-панели) на 1.

11 июл. 2011 г. 23:39:37
Комментарии

Эта проблема возникает постоянно. По моему мнению, пользовательские типы записей — это не обычные записи, поэтому для каждого типа записей должен быть отдельный параметр запроса posts_per_page. В любом случае, вот ответ, который показывает, как изменить значение posts_per_page на лету, не затрагивая настройки в админке: http://wordpress.stackexchange.com/questions/30757/change-posts-per-page-count/30763#30763

Dave Romsey Dave Romsey
4 февр. 2012 г. 02:41:26

Вопрос от goto10 работает отлично, и это лучше, если вы всё ещё хотите использовать настройку posts per page для других страниц. Мне всё ещё интересно, почему это происходит — впервые столкнулся с такой ситуацией. Раньше я мог использовать posts_per_page как обычно, без конфликтов с настройками WordPress.

Javier Villanueva Javier Villanueva
23 февр. 2012 г. 13:50:17

Огромное спасибо за эту информацию! Я уже голову ломал, разбираясь с правилами перезаписи и всем прочим, а оказывается, проблема в этом.

Chaser324 Chaser324
27 авг. 2012 г. 22:11:31

2019 год, а этот ответ всё ещё актуален! Потрясающе.

Cenlan Cenlan
17 дек. 2019 г. 15:13:50

Спасибо, очень полезно.

user1032559 user1032559
19 апр. 2022 г. 23:19:45
2
10

Я нашел решение здесь: http://walrusinacanoe.com/web-development/742

Оно элегантное и функциональное:

add_action( 'parse_query','changept' );
function changept() {
    if( is_category() && !is_admin() )
        set_query_var( 'post_type', array( 'post', 'your_custom_type' ) );
    return;
}
26 сент. 2011 г. 20:40:42
Комментарии

Это действительно сработало для меня. Другое решение (WP-Admin / Настройки / Чтение / 1) вообще не помогло.

Спасибо за это! (часы потрачены на отладку и поиски)

Esteban Esteban
15 окт. 2014 г. 01:03:03

Много лет спустя, и эта функция решила мою проблему. 3 дня вырывания волос! Огромное спасибо.

Edvin Uddfalk Edvin Uddfalk
21 мая 2024 г. 21:31:53
1

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

10 июл. 2011 г. 05:21:07
Комментарии

Спасибо, я попробовал это, но проблема осталась.

Dale-Anthony Dale-Anthony
10 июл. 2011 г. 12:51:52
2

Попробуйте этот вариант:

// Добавляем действие для изменения запроса перед получением постов
add_action('pre_get_posts','custom_pre_get_posts'); 
function custom_pre_get_posts( $query ) 
{  
    // Проверяем, что это основной запрос, не RSS-лента и не админка
    if( $query->is_main_query() && !$query->is_feed() && !is_admin()) {
        // Устанавливаем номер страницы, удаляя слэши из параметра page
        $query->set( 'paged', str_replace( '/', '', get_query_var( 'page' ) ) );  
    }  
} 

// Добавляем фильтр для модификации строки запроса
add_filter('request', 'custom_request');
function custom_request($query_string )
{ 
    // Если есть параметр page в запросе
    if( isset( $query_string['page'] ) ) { 
        if( ''!=$query_string['page'] ) { 
            // Удаляем параметр name, если он есть
            if( isset( $query_string['name'] ) ) { 
                unset( $query_string['name'] ); 
            } 
        } 
    } 
    return $query_string; 
}
5 мая 2021 г. 16:56:08
Комментарии

Можете объяснить ваше решение?

tehlivi tehlivi
13 мая 2021 г. 04:32:34

Код, кажется, отображает всё правильно, он корректно перестраивает строку запроса. Если какая-то страница открыта, но это ошибочно не отражено в URL, он перестраивает и добавляет недостающий slug в раздел.

ktscript ktscript
13 мая 2021 г. 07:28:30