Как пофиксить пагинацию в таксономии?

Ссылка скопирована
PHP
1 ответ

На других страницах она работает, а в таксомии при переходе с первой страницы на 2,3 итд выдает 404.
Код пагинации для страницы таксономии

$al_cat_slug = get_queried_object()->slug;     $al_cat_name = get_queried_object()->name;?>        <div class="book-items row">                 <?php global $post;    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  $args = array (      'post_type' => 'book',     'sortby'=>'name',      'caller_get_posts'=>1,     'posts_per_page'=> 2,     'paged'=>$paged,     'tax_query' => array(                 array(                     'taxonomy' => 'book-categories',                     'field' => 'slug',                     'terms' => $al_cat_slug                 )             ) ); query_posts( $args );  if ( have_posts() ):     while ( have_posts() ) :         the_post();?>       <div class="book-item col-12">         <a href="<?php the_permalink()?>">         <h2 class="book-title">             <?php if( get_field('catalog_order') ): ?>             <span class="catalog-order"><?php the_field('catalog_order')?></span>             <?php endif; ?>             <?php the_title(); ?>         <?php if( get_field('book_author') ): ?>             <span class="book-author"><?php the_field('book_author')?></span>         <?php endif; ?>             </h2>          </a>         </div>  <?php    endwhile; echo the_posts_pagination();     endif;  wp_reset_query();?>              </div>

$al_cat_slug = get_queried_object()->slug; $al_cat_name = get_queried_object()->name;?> <div class="book-items row"> <?php global $post; $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array ( 'post_type' => 'book', 'sortby'=>'name', 'caller_get_posts'=>1, 'posts_per_page'=> 2, 'paged'=>$paged, 'tax_query' => array( array( 'taxonomy' => 'book-categories', 'field' => 'slug', 'terms' => $al_cat_slug ) ) ); query_posts( $args ); if ( have_posts() ): while ( have_posts() ) : the_post();?> <div class="book-item col-12"> <a href="<?php the_permalink()?>"> <h2 class="book-title"> <?php if( get_field('catalog_order') ): ?> <span class="catalog-order"><?php the_field('catalog_order')?></span> <?php endif; ?> <?php the_title(); ?> <?php if( get_field('book_author') ): ?> <span class="book-author"> — <?php the_field('book_author')?></span> <?php endif; ?> </h2> </a> </div> <?php endwhile; echo the_posts_pagination(); endif; wp_reset_query();?> </div>

Гуглил проблему, вот это добавить в functions.php не помогло.

function taxonomy_rewrite_fix($wp_rewrite) {     $r = array();     foreach($wp_rewrite->rules as $k=>$v){         $r[$k] = str_replace('catalog=$matches[1]&paged=','catalog=$matches[1]&page=',$v);     }     $wp_rewrite->rules = $r; } add_filter('generate_rewrite_rules', 'taxonomy_rewrite_fix');

function taxonomy_rewrite_fix($wp_rewrite) { $r = array(); foreach($wp_rewrite->rules as $k=>$v){ $r[$k] = str_replace('catalog=$matches[1]&paged=','catalog=$matches[1]&page=',$v); } $wp_rewrite->rules = $r; } add_filter('generate_rewrite_rules', 'taxonomy_rewrite_fix');

Есть рабочее решене?

Дополнительно:

Извиняюсь за банальный вариант, но пробовали сменить структуру ссылок? У WP же частая беда с этим.

  • Smirator, я пересохранял пермалинки, или как-то по-другому поменять их?
  • alexiusgrey, имел ввиду данный вариант, да.
  • Функция the_posts_pagination() работает только с глобальным запросом, query_posts() использовать нельзя, это функция ядра. Правильно глобальный запрос изменять хуком pre_get_posts
  • Артем Золин, я что-то про него читаю, но не понимаю. там set-get задают параметры вывода, а сам цикл как прописать? в моем случае что делать, чтобы был цикл с такими параметрами и работала пагинация на таксономии?
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Пагинация в таксономии обычно ломается из-за одного из трёх факторов: неверный параметр paged, конфликт rewrite slug или кастомный WP_Query, который не передаёт общее количество страниц в paginate_links(). Исправлять нужно не шаблон ссылок вслепую, а сам запрос и rewrite.

    В шаблоне таксономии для кастомного запроса используйте:

    $paged = max(1, get_query_var('paged'), get_query_var('page'));
     
    $query = new WP_Query([
        'post_type'      => 'product',
        'posts_per_page' => 12,
        'paged'          => $paged,
        'tax_query'      => [
            [
                'taxonomy' => 'brand',
                'field'    => 'slug',
                'terms'    => get_queried_object()->slug,
            ],
        ],
    ]);
     
    echo paginate_links([
        'total'   => $query->max_num_pages,
        'current' => $paged,
    ]);

    $paged = max(1, get_query_var('paged'), get_query_var('page')); $query = new WP_Query([ 'post_type' => 'product', 'posts_per_page' => 12, 'paged' => $paged, 'tax_query' => [ [ 'taxonomy' => 'brand', 'field' => 'slug', 'terms' => get_queried_object()->slug, ], ], ]); echo paginate_links([ 'total' => $query->max_num_pages, 'current' => $paged, ]);

    Если используется главный запрос таксономии, лучше не создавать новый WP_Query, а менять его через pre_get_posts:

    add_action('pre_get_posts', function (WP_Query $query) {
        if (is_admin() || ! $query->is_main_query()) {
            return;
        }
     
        if (is_tax('brand')) {
            $query->set('posts_per_page', 12);
        }
    });

    add_action('pre_get_posts', function (WP_Query $query) { if (is_admin() || ! $query->is_main_query()) { return; } if (is_tax('brand')) { $query->set('posts_per_page', 12); } });

    Проверьте также, не совпадает ли slug таксономии со slug страницы или post type. После изменения rewrite-настроек один раз пересохраните постоянные ссылки. Если на странице /taxonomy/page/2/ 404, проблема чаще в rewrite. Если открывается первая страница вместо второй — обычно неверный paged или кастомный запрос.

    Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.

    Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно