Palych_tw
@Palych_tw
Типа веб-разработчик

Проблема с порядком товаров при ajax пагинации?

UPD. Выяснил, что проблема ни в сайте, ни в аяксе, ги в моем php коде. Это баг woocommerce. Он не умеет сортировать товары с одинаковой ценой. Он выдает их все время в разном порядке, и, если, они приходятся на разные страницы, то будут повторы.

Всем привет. Столкнулся с такой проблемой. Написал "бесконечный скролл" для woocommerce, но есть неприятная проблема с тем, что некоторые посты могут повториться два раза, может немного нарушиться порядок, и я абсолютно не могу понять почему. Когда-то давно столкнулся ровно с такой же проблемой на другом сайте, но там это было не критично. Там последний товар на одной странице совпадал с первым товаром на следующей.

вот мой текущий код

//Здесь отбор по катсомной таксономии (если задана)
add_action( 'pre_get_posts', 'product_cat_modify_query' );

function product_cat_modify_query( $query ) {
    if ( ! is_admin() && $query->is_main_query() && is_product_category()  ) {
        if (isset($_GET['brand'])) {
            $brandquery = array (
                'taxonomy' => 'product_brand',
                'field' => 'slug',
                'terms' => $_GET['brand']
            );
            $tax_query = get_query_var('tax_query');
            $tax_query[] = $brandquery;
            $query->set('tax_query', $tax_query);
        }
    } 
}

//Сам ajax экшн
add_action('wp_ajax_load_more_products', 'load_more_products');
add_action('wp_ajax_nopriv_load_more_products', 'load_more_products');

function load_more_products() {
    check_ajax_referer( 'qwkugf(Yoaywre9q=530fusefh9295@Tfgw3t*%*=', 'security' );

    $page = $_POST['page'];
    $terms = $_POST['terms'];
    $tax = $_POST['tax'];
    $brand = isset($_POST['brand']) ? $_POST['brand'] : null ;
    $woo_query = new WC_Query();
    $order_args = $woo_query->get_catalog_ordering_args();
    $return_html = '';

    $args = array(
        'post_type' => 'product',
        'posts_per_page' => bodymania_woocommerce_products_per_page(),
        'paged' => $page,
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => $tax,
                'terms' => explode(',',$terms)
            )
        )
    );
    $args = array_merge($args, $order_args);
  	if ($brand) {
  		$args['tax_query'][] = array(
  			'taxonomy' => 'product_brand',
    		'field' => 'slug',
   			'terms' => $brand
   		);
   }

    $return_products = new WP_Query($args);
    if ($return_products->have_posts()) {
        $max_pages = $return_products->max_num_pages;
        ob_start();
        while ($return_products->have_posts()) {
            $return_products->the_post();
            wc_get_template_part( 'content', 'product' );
        }
        wp_reset_postdata();
        $return_html .= ob_get_contents();
        ob_end_clean();
        if ($page < $max_pages)  {
            $next_page = $page + 1;
            $return_html .= '<a id="loadMoreProducts" href="#"  data-page="'. $next_page .'" data-terms="'. $terms .'" data-tax="' . $tax . '">LOAD MORE</a>';
        }
    }
    echo $return_html;
    wp_die();
}

Получается часто такое
5a2e83e418a67326455039.png
-------------------------------------------------------------------------------------------------------------------
5a2e83ee6d154437084024.png

Причем, после каждого обновления страницы, порядок товаров каждый раз меняется.
Общее количество товаров выводится суммарно такое же как забито в БД, но из-за того, что некоторые товары повторяются, в итоге, выводятся не все товары.

UPD. Так. выяснил, что проблема с товарами с одинаковой ценой. Они все время выдаются в произвольном порядке. Т.е. есть 4 товара с ценой 100, 1 выводится на текущей странице, 3 должны попасть на следующую. Вот на следующей странице выводятся три товара с ценой 100, но каждый раз в разном порядке, и один из них может быть тем, что был на предыдущей странице.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
Palych_tw
@Palych_tw Автор вопроса
Типа веб-разработчик
Скинул ишью репорт к ним на гитхаб, обещали пофиксить и включить в версию 3.3
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
an2studio
@an2studio
Если подгружается по скрипту, когда доскроллишь до конца страницы, то проблема в том, что каждая прокрутка колесика запускает свой ajax запрос.
тут либо отказаться от автоматической подгрузки и делать только по клику на load more кнопку или отслеживать завершение запроса, а потом только выполнять следующий. надо менять js, а не php
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы