$paged всегда 0

Вопрос или проблема

У меня проблема с пагинацией. Для страницы архива пагинация работает идеально.

Пример URL: https://www.example.com/tum-urunler/page/2/ (tum-urunler — это слаг архива для настроенного типа постов “urun”)

Но если я добавляю параметры таксономии, пагинация не работает.

Пример URL:https://www.example.com/tur/bebek/page/2/
(tur — это таксономия, а bebek — термин)

Меня перенаправляет на 404.php. Поэтому я сделал дамп wp_query в 404.php и увидел, что paged равен 0.
Вот мой дамп wp_query, когда пагинация не работает:

object(WP_Query)#73 (50) { ["query"]=> array(2) { ["post_type"]=> string(4) "urun" ["tur"]=> string(1) "2" } ["query_vars"]=> array(67) { ["post_type"]=> string(4) "urun" ["tur"]=> string(1) "2" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["static"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["category_name"]=> string(0) "" ["tag"]=> string(0) "" ["cat"]=> string(0) "" ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["taxonomy"]=> string(3) "tur" ["term"]=> string(1) "2" ["order"]=> string(4) "DESC" } ["tax_query"]=> object(WP_Tax_Query)#2946 (6) { ["queries"]=> array(1) { [0]=> array(5) { ["taxonomy"]=> string(3) "tur" ["terms"]=> array(1) { [0]=> string(1) "2" } ["field"]=> string(4) "slug" ["operator"]=> string(2) "IN" ["include_children"]=> bool(true) } } ["relation"]=> string(3) "AND" ["table_aliases":protected]=> array(0) { } ["queried_terms"]=> array(1) { ["tur"]=> array(2) { ["terms"]=> array(1) { [0]=> string(1) "2" } ["field"]=> string(4) "slug" } } ["primary_table"]=> string(8) "tr_posts" ["primary_id_column"]=> string(2) "ID" } ["meta_query"]=> object(WP_Meta_Query)#2947 (9) { ["queries"]=> array(0) { } ["relation"]=> NULL ["meta_table"]=> NULL ["meta_id_column"]=> NULL ["primary_table"]=> NULL ["primary_id_column"]=> NULL ["table_aliases":protected]=> array(0) { } ["clauses":protected]=> array(0) { } ["has_or_relation":protected]=> bool(false) } ["date_query"]=> bool(false) ["queried_object"]=> NULL ["queried_object_id"]=> NULL ["request"]=> string(296) "SELECT SQL_CALC_FOUND_ROWS tr_posts.ID FROM tr_posts WHERE 1=1 AND ( 0 = 1 ) AND tr_posts.post_type="urun" AND (tr_posts.post_status="publish" OR tr_posts.post_status="acf-disabled" OR tr_posts.post_status="private") GROUP BY tr_posts.ID ORDER BY tr_posts.post_date DESC LIMIT 0, 10" ["posts"]=> &array(0) { } ["post_count"]=> int(0) ["current_post"]=> int(-1) ["in_the_loop"]=> bool(false) ["comment_count"]=> int(0) ["current_comment"]=> int(-1) ["found_posts"]=> int(0) ["max_num_pages"]=> int(0) ["max_num_comment_pages"]=> int(0) ["is_single"]=> bool(false) ["is_preview"]=> bool(false) ["is_page"]=> bool(false) ["is_archive"]=> bool(false) ["is_date"]=> bool(false) ["is_year"]=> bool(false) ["is_month"]=> bool(false) ["is_day"]=> bool(false) ["is_time"]=> bool(false) ["is_author"]=> bool(false) ["is_category"]=> bool(false) ["is_tag"]=> bool(false) ["is_tax"]=> bool(false) ["is_search"]=> bool(false) ["is_feed"]=> bool(false) ["is_comment_feed"]=> bool(false) ["is_trackback"]=> bool(false) ["is_home"]=> bool(false) ["is_404"]=> bool(true) ["is_embed"]=> bool(false) ["is_paged"]=> bool(false) ["is_admin"]=> bool(false) ["is_attachment"]=> bool(false) ["is_singular"]=> bool(false) ["is_robots"]=> bool(false) ["is_posts_page"]=> bool(false) ["is_post_type_archive"]=> bool(false) ["query_vars_hash":"WP_Query":private]=> string(32) "51d66ab84e27563088d67225fda32f66" ["query_vars_changed":"WP_Query":private]=> bool(false) ["thumbnails_cached"]=> bool(false) ["stopwords":"WP_Query":private]=> NULL ["compat_fields":"WP_Query":private]=> array(2) { [0]=> string(15) "query_vars_hash" [1]=> string(18) "query_vars_changed" } ["compat_methods":"WP_Query":private]=> array(2) { [0]=> string(16) "init_query_flags" [1]=> string(15) "parse_tax_query" } }

Я не знаю, почему WordPress не обрабатывает параметр страницы в URL. Мне нужна помощь. Большое спасибо

function eg_add_rewrite_rules() {
    global $wp_rewrite;

    $new_rules = array( 

        '(tur|tip|tedarikci|beden|mevsim)/(.+)/?$' => 'index.php?post_type=urun&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)

    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' );

У меня было это правило перезаписи в файле functions.php. Оно перезаписывает переменную страницы. Поэтому я добавил ещё одно правило перезаписи, чтобы обработать переменную страницы. Вот последняя версия функции:

function eg_add_rewrite_rules() {
    global $wp_rewrite;

    $new_rules = array( 
        '(tur|tip|tedarikci|beden|mevsim)/(.+)/(page|paged)/(.+)/?$' => 'index.php?post_type=urun&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2) .'&paged=' . $wp_rewrite->preg_index(4),

        '(tur|tip|tedarikci|beden|mevsim)/(.+)/?$' => 'index.php?post_type=urun&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)

    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' );

Ответ или решение

Чтобы решить проблему, связанную с пагинацией на страницах таксономий, необходимо детально разобраться в работе механизма переписывания URL (rewrite rules) в WordPress и как он влияет на параметры пагинации, такие как "paged".

Теория

В WordPress система управления URL-адресами и маршрутизацией запросов осуществляется через механизм переписывания правил (rewrite rules). Эти правила определяют, как должны обрабатываться определённые URL-адреса и какие параметры они должны передавать в WP_Query — класс, отвечающий за выполнение запросов к базе данных.

Зачастую проблемы с пагинацией возникают из-за неправильно настроенных rewrite rules, когда параметры paged либо вовсе не распознаются, либо перезаписываются другими параметрами. В представленном описании вашей проблемы paged всегда выставляется в 0 при попадании на страницы таксономий, что говорит о том, что соответствующее правило для пагинации не установлено или перезаписано неправильно.

Пример

На примере описанной проблемы видно, что при отсутствии параметров таксономии пагинация работает корректно, т.е. URL-адрес https://www.example.com/tum-urunler/page/2/ обрабатывается ожидаемо. Но, если к URL добавляется параметр таксономии, как в https://www.example.com/tur/bebek/page/2/, происходит редирект на страницу 404, и WP_Query показывает paged равным 0.

Это может произойти из-за того, что в вашем functions.php старое правило для переписывания URL сбрасывало параметр paged, переопределяя его структуру, и, следовательно, WordPress не воспринимает эти страницы как пагинированные.

Применение

Решение проблемы требует добавления корректного правила для обработки paged в URL таксономий. Ваша заключительная версия функции переписывания выглядит правильно, но необходимо сделать несколько важных уточнений.

  1. Перепишите правила: Убедитесь, что новые правила регистрируются перед остальными, так как порядок выполнения критически важен. Используйте метод добавления в начало массива $wp_rewrite->rules.

  2. Обеспечьте регистрацию всех структур: Для URL, содержащих пагинацию, добавьте альтернативное правило, как вы это сделали:

    function eg_add_rewrite_rules() {
        global $wp_rewrite;
    
        $new_rules = array(
            '(tur|tip|tedarikci|beden|mevsim)/(.+)/(page|paged)/([0-9]{1,})/?$' => 'index.php?post_type=urun&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2) .'&paged=' . $wp_rewrite->preg_index(4),
            '(tur|tip|tedarikci|beden|mevsim)/(.+)/?$' => 'index.php?post_type=urun&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)
        );
        $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    }
    add_action('generate_rewrite_rules', 'eg_add_rewrite_rules');
  3. Пересоздайте правила: После внесения изменений в правила рекомендуется пересоздать структуру перезаписи. Это можно сделать в админ-панели WordPress, нажав "Save changes" на странице "Permalinks", что инициирует обновление правил перезаписи.

  4. Тестирование: После обновления убедитесь, что функция работает корректно. Проверьте несколько URL с различными page параметрами, чтобы убедиться, что ошибка 404 больше не возникает и paged устанавливается корректно.

Используя данный подход, вы сможете убедиться, что ваши страницы таксономий будут корректно обрабатывать параметры пагинации, а WordPress сможет выдавать правильные результаты.

Оцените материал
Добавить комментарий

Капча загружается...