Пагинация не работает в пользовательском цикле WP_Query

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

Пожалуйста, помогите с пагинацией

У меня есть код, который работает нормально (functions.php)

function projects_custom_number_of_posts( $query ) {
    $query->set( 'posts_per_page', 2 );
    return;
}
add_action( 'pre_get_posts', 'projects_custom_number_of_posts');

Когда я изменяю его, пагинация перестает работать

function projects_custom_number_of_posts( $query ) {
    $postsperpage = $query->get( 'posts_per_page' );
    $query->set( 'posts_per_page', $postsperpage );
    return;
}
add_action( 'pre_get_posts', 'projects_custom_number_of_posts');

Необходимо, чтобы данные брались из ‘posts_per_page’

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array('product_cat' => $cat, 'post_type' => 'product',  'posts_per_page' => 2, 'paged' => $paged ); $query = new WP_Query( $args );

if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();

Столкнулся с той же проблемой. В итоге получил следующий код

global $woocommerce_loop;
$woocommerce_loop['paged'] = (isset($woocommerce_loop['paged'])) ? $woocommerce_loop['paged'] : 1;
$woocommerce_loop['total'] = $custom_query->found_posts;
$woocommerce_loop['post_count'] = $custom_query->post_count;
$woocommerce_loop['per_page'] = $per_page;
$woocommerce_loop['total_pages'] = ceil($custom_query->found_posts/$per_page);
$woocommerce_loop['current_page'] = $args['paged'];

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

Почему пагинация не работает в кастомном цикле WP_Query?

Проблема с пагинацией в кастомном цикле WP_Query может возникать из-за неправильного определения параметров запроса, что непосредственно влияет на вывод постов и их пагинацию. Рассмотрим ваш код и основные моменты, которые могли привести к сбою в работе пагинации.

Анализ кода

Исходный код
function projects_custom_number_of_posts( $query ) {
    $query->set( 'posts_per_page', 2 );
    return;
}
add_action( 'pre_get_posts', 'projects_custom_number_of_posts');

Этот код задает фиксированное количество постов на страницу (2) для всех запросов, что позволяет пагинации работать корректно.

Проблемный код
function projects_custom_number_of_posts( $query ) {
    $postsperpage = $query->get( 'posts_per_page' );
    $query->set( 'posts_per_page', $postsperpage );
    return;
}
add_action( 'pre_get_posts', 'projects_custom_number_of_posts');

Смысл этого кода заключается в том, что вы пытаетесь сохранить значение posts_per_page, которое уже было установлено. Однако, при отсутствии явной установки переменной $postsperpage (больше чем 0), возвращается неопределенное число. Это приводит к тому, что ваш запрос не создает необходимую пагинацию.

Ключевые аспекты
  1. Неопределенное значение: Если переменная $postsperpage не задается ранее, то она может быть пустой, что сбивает пагинацию с толку.
  2. Отсутствие параметра paged: Параметр paged отвечает за номер текущей страницы запроса. Если он не установлен корректно, пагинация не будет работать.

Как исправить

Для решения этой проблемы нужно убедиться, что пагинация настроена правильно. Вот несколько шагов, которые можно предпринять:

  1. Проверьте, чтобы paged был установлен:

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
  2. Обновите параметры в вашем WP_Query:

    $args = array(
       'product_cat' => $cat,
       'post_type' => 'product', 
       'posts_per_page' => get_option('posts_per_page', 2), // или ваше фиксированное значение
       'paged' => $paged
    );
    $query = new WP_Query($args);
  3. Измените вашу функцию projects_custom_number_of_posts следующим образом:

    function projects_custom_number_of_posts($query) {
       if (!is_admin() && $query->is_main_query()) {
           $query->set('posts_per_page', 2); // или любое другое значение
       }
    }
    add_action('pre_get_posts', 'projects_custom_number_of_posts');

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

Заключение

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

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

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