@alexiusgrey

Как запустить один ajax-запрос внутри другого?

Много букв, сложно - так и отметил, не надо просто так "чтобы было" вставлять 5 копеек советуя плагины, пожалуйста, а за реальную помощь буду очень благодарен, хочу разобраться, но без помощи никак, уже несколько дней гуглю и пытаюсь.

Есть фильтр товаров и loadmore, два больших сложных запроса, которые по отдельности работают. Нужно чтобы бесконечная подгрузка постов работала и после того, как фильтр отфильтровал. Скрипт для подгрузки - от Миши Рудрастых, а фильтр другой, не с его сайта.
jQuery(function($){
    var canBeLoaded = true, // this param allows to initiate the AJAX call only if necessary
        bottomOffset = 2000; // the distance (in px) from the page bottom when you want to load more posts 

    $(window).scroll(function nextAjax(){       
        var data = {
            'action': 'loadmore',
            'query': misha_loadmore_params.posts,
            'page' : misha_loadmore_params.current_page
        };
        if( $(document).scrollTop() > ( $(document).height() - bottomOffset ) && canBeLoaded == true ){
            $.ajax({
                url : misha_loadmore_params.ajaxurl,
                data:data,
                type:'GET',
                beforeSend: function( xhr ){                    
                    canBeLoaded = false;                            
                },
                success:function(data){             
                    if( data ) {                        
                        $('body.post-type-archive-product .non-filter div.products').find('.product.col-lg-3.col-6:last-of-type').after( data );                                
                        canBeLoaded = true; // the ajax is completed, now we can run it again
                        misha_loadmore_params.current_page++;                       
                    }
                }       
            });
        }
    });
});

Фильтр я сокращу, потому что разные переменные для фильтрации meta query, tax query не нужны все сразу. И так большой
jQuery(function($)
{
    $('.side-nav input').on('change',function(e){   
      
     jQuery(this).closest('div, li').toggleClass('attr-selected');    
        e.preventDefault();
        muvre_get_posts();
        jQuery('html, body').animate({scrollTop:0}, 1);
    });    
    function getColor()
    {
        var cats = []; //Setup empty array
        $(".muvre_filter_pa_color_check input:checked").each(function() {
            var val = $(this).val();
            cats.push(val); //Push value onto array
        });
        return cats; //Return all of the selected genres in an array       
    }   
   
    function muvre_get_posts(paged){  
         var paged_value = paged; 
        var ajax_url = woocommerce_params.ajax_url;        
        jQuery.ajax({
            type: 'GET',
            url: ajax_url,
            data: {
                action: 'muvre_filter',
                url : ajax_url,
                pa_color: getColor,                     
                paged: paged_value,             
            },           
            beforeSend: function ()
            {  jQuery('.main-products-wrapper').html('<div class="text-center search-filter" style="height:50vh;">Search...</div>'); 
            },
            success: function(data)
            {   jQuery('.main-products-wrapper').html(data);
                jQuery('aside#secondary').removeClass('opened');                            
            },          
            error: function()
            {               
                jQuery(".main-products-wrapper").html('<div class="text-center" style="height:50vh;">Error</div>');
            }
        })   
    }  
}

Вот сам цикл для товара похож, но отличается именно параметр paged. Там +1, там нет.
function muvre_show_products(){
  $query_data = $_GET;
   $paged = $_GET['page'];
   $pages = $wp_query->max_num_pages; 
    $orderby = 'date';
    $orderby = $query_data['order'];
    $posts_per_page = get_option('woocommerce_catalog_columns') * get_option('woocommerce_catalog_rows');	

  $pa_color = ($query_data['pa_color']) ? explode(',',$query_data['pa_color']) : false;
    $tax_query_pa_color = ($pa_color) ? array( array(
        'taxonomy' => 'pa_color',
        'field' => 'id',
        'terms' => $pa_color
    ) ) : false;
    $args = array(
        'post_type' => ['product'],		
        'paged' => $paged,
        'posts_per_page' => $posts_per_page,        
        'tax_query' => array(
        'relation' => 'AND',
        $tax_query_pa_color,   
    ),
  );    
    $loop = new WP_Query( $args );
    if ( $loop->have_posts() ) {      
    woocommerce_product_loop_start();
       while ( $loop->have_posts() ) : $loop->the_post();
       wc_get_template_part( 'content', 'product' );
    endwhile;   } 
    wp_reset_postdata();
    die();
}    
add_action('wp_ajax_muvre_filter', 'muvre_show_products');
add_action('wp_ajax_nopriv_muvre_filter', 'muvre_show_products');

Мне как раз и надо как-то при скролле дать знать, что "теперь я покрутил - подгружай страницу+1 от той, что сейчас".
function misha_loadmore_ajax_handler(){
   global $woocommerce;
   $pages = $wp_query->max_num_pages; 
   $posts_per_page = get_option('woocommerce_catalog_columns') * get_option('woocommerce_catalog_rows'); 
$args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
		'orderby' => 'date',
		'order'   => 'ASC',
        'posts_per_page' => $posts_per_page,  
        'paged' => $_GET['page'] + 1,
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wc_get_template_part('content', 'product');  
        }
    }
    wp_reset_postdata();
    die();
}
 
add_action('wp_ajax_loadmore', 'misha_loadmore_ajax_handler'); 
add_action('wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler');


Я пробовал вставить в success фильтра прямо весь скрипт loadmore, прямо с misha_loadmore_params. Пробовал console.log(data), и понял, что при прокрутке после фильтрации не ловится параметр 'query': misha_loadmore_params.posts. В loadmore он задается в localize script
wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/myloadmore.js', array('jquery') ); 
	wp_localize_script( 'my_loadmore', 'misha_loadmore_params', array(
		'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php',
		'posts' => json_encode( $wp_query->query_vars ), 
		'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
		'max_page' => $wp_query->max_num_pages
	) ); 
 	wp_enqueue_script( 'my_loadmore' );

У фильтра такого нету, там где я его нашел. Я давно им пользуюсь, не хотелось бы другой, уже столько сделал в нем под себя, хочу еще сильнее идеализировать. Там просто
wp_enqueue_script( 'filter', get_template_directory_uri() . '/assets/js/filter.js', null, ['jquery'], true);

Как правильнее сделать? Как-то надо дать знать, что при прокрутке уже после фильтрации надо добавить html data после отфильтрованного списка товаров. Или тут надо тоже сделать localize script, как-то(как???- я пробовал скопипастить с заменой имени, не прокатило ) задать ему параметр query, и вызывать уже не woocommerce_parems, a например filter_params?
Помогите пожалуйста разобраться, очень хочу продвинуться в знаниях.
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы