Woocommerce. Витрина с ajax подгрузкой категорий и товаров

Доброго времени суток!

Буду благодарен за помощь или подсказку верного направления. Используется крайний WP и Woo, тема Storefront. Задача следующая: на странице витрины (любая страница) нужно вывести все товары, которые разбиты на категории. Т.е. Категория столы: стол 1, стол 2, стол 3..., ниже Категория стулья: стул 1, стул 2,... и т.д. В связи с тем, что товаров много, сайт грузится по 10-15 сек на ПК и до 1 мин на телефонах. Просьба не писать, что это глупо, не круто и пр. Есть задача, она такая, я понимаю, что это не идеал, тем не менее такие магазины есть и грузятся достаточно быстро. Хочу реализовать следующее, или-или а) загрузка витрины с 4 товарами в каждой категории, после первого скролла ajax грузит следующие 4-8-12 шт в каждой категории б) загрузить первую категорию полностью, а последующие подгружаются после скролла.

Пробовал разные варианты. В итоге обычный ajax запрос, который работает с постами, не работает с товарами.

Так вывожу все товары по категориям:

<?php 
$args_tax = array(
   'taxonomy'     => 'product_cat',
   'hierarchical' => 0,
   'hide_empty'   => 1,
 );
 $all_categories = get_categories( $args_tax );
 foreach ($all_categories as $cat) {
   echo '<h2>' . $cat->name . '</h2>';
   $args_prod = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'product_cat' => $cat -> slug,
        'order' => 'ASC',
   );
   $loop = new WP_Query( $args_prod );
   woocommerce_product_loop_start();
   while ( $loop->have_posts() ) : $loop->the_post();
       wc_get_template_part( 'content', 'product' );
   endwhile;
 wp_reset_query(); ?>

Если я правильно понимаю, то в случае (а) (загрузка 4 товаров в каждой категории, а потом подгрузка после скролла), мне нужно указать в args_prod - posts_per_page=4 и подключить ajax. Но проблема в том, что $loop->max_num_pages всегда равен 1 (даже если товаров 30, а posts_per_page=4), в скрипте

<script>
var ajaxurl = "<?php echo site_url() ?>/wp-admin/admin-ajax.php";
var products_query = "<?php serialize($loop->query_vars) ?>";</script>

получаю ошибку "SyntaxError: Unexpected identifier". И дальше ajax не работает, т.к. изначальный query не правильный. Буду благодарен за подсказку, как правильно написать в данном случае?

В варианте (б) (загрузить первую категорию, а после скролла остальные), в args_tax добавлял number=1, а в запросах offset=1, но тоже не совсем понимаю как правильно написать запрос к БД.

У кого какие мысли, как можно заставить работать? Заранее спасибо!

Update.

В шаблон страницы добавляем кнопку <div id="loadmore"Загрузить ещё</div>

В скрипты обработчик:

jQuery(function($){
    $('#loadmore').click(function(){
        $(this).text('Загружаются...');
        var data = {
            'action': 'loadmore',
            'query': products_query,
        };
        $.ajax({
            url:ajaxurl,
            data:data,
            type:'POST',
            success:function(data){
                if( data ) { 
                    let btn = '#loadmore';
                    let wrapper = '#showcase';
                    $(btn).text('Показать ещё');
                    $(wrapper).append(data);
                }
                    
            }
        });
    });
});

В function.php

function loadmore_posts(){

$args = unserialize( stripslashes( $_POST['query'] ) );

query_posts( $args );

if( have_posts() ) :

  woocommerce_product_loop_start();

    while( have_posts() ): the_post();

       wc_get_template_part( 'content', 'product' );

    endwhile;

  woocommerce_product_loop_end(); 

wp_reset_postdata();

endif;
die();
}

add_action('wp_ajax_loadmore', 'loadmore_posts');
add_action('wp_ajax_nopriv_loadmore', 'loadmore_posts');

Ответы (0 шт):