Ajax Infinite Scroll В пользовательском цикле WP_Query не работает

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

Я настроил пользовательский цикл WP_Query для шаблона страницы. Я реализую метод бесконечной прокрутки через ajax, и вызов проходит успешно, но по какой-то причине я не могу заставить запрос воспринимать аргумент paged в цикле. Он просто не извлекает ничего.

Вот код для моего ajax действия:

// AJAX Бесконечная прокрутка
function txcap_ajax_scroll() {

    $args = isset( $_POST['query'] ) ? array_map( 'esc_attr', 
    $_POST['query'] ) : array();
    $args['post_type'] = isset( $args['post_type'] ) ? esc_attr( 
    $args['post_type'] ) : 'post';
    $args['paged'] = esc_attr( $_POST['page'] );
    $args['post_status'] = 'publish';

    ob_start();  

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
      $post_count = 1;
      while ( $query->have_posts() ) {
        $query->the_post()
       ?>

        
class="fdm-post fdm-standard last" class="fdm-post fdm-half-left" class="fdm-post fdm-half-right" class="fdm-post fdm-standard" > ">

Вот код для моей регистрации и локализации ajax:

global $wp_query;

$args = array(
  'ajaxurl' => admin_url( 'admin-ajax.php' ),
  'query'   => $wp_query->query
);

wp_enqueue_script( 'ajax_infinite_scroll', get_stylesheet_directory_uri() . '/js/ajax_infinite_scroll.js', array('jquery'), '1.0' ,true );

wp_localize_script( 'ajax_infinite_scroll', 'ajaxinfinitescroll', $args );

Вот мой обработчик ajax для бесконечной прокрутки.

jQuery(function($) {
$('.fdm-blog-container').append( '' );
var button = $('.fdm-blog-container .load-more');
var page = 2;
var loading = false;
var scrollHandling = {
    allow: true,
    reallow: function() {
        scrollHandling.allow = true;
    },
    delay: 400 //(миллисекунды) настройте на самое высокое допустимое значение
};

$(window).scroll(function() {
    if( ! loading && scrollHandling.allow ) {
        scrollHandling.allow = false;
        setTimeout(scrollHandling.reallow, scrollHandling.delay);
        var offset = $(button).offset().top - $(window).scrollTop();
        if ( 2000 > offset ) {
            loading = true;
            $.ajax({
                url: ajaxinfinitescroll.ajaxurl,
                type: 'post',
                data: {
                    action: 'txcap_ajax_scroll',
                    page: page,
                    query: ajaxinfinitescroll.query
                },
                success: function(result) {
                    console.log(result);
                    $('.fdm-blog-container').append( result.data );
                    $('.fdm-blog-container').append( button );
                    page = page + 1;
                    loading = false;
                },
                fail: function( xhr, textStatus, e ) {
                    console.log(xhr.responseText);
                }
            })
        }
    }
});
});

Вот мой основной цикл WP_Query, к которому я добавляю метод бесконечной прокрутки (этот код находится в шаблоне страницы):

'post', 'posts_per_page' => 1, 'paged' => $paged, 'post_status' => 'publish' ); $query_main = new WP_Query( $args_main ); if ( $query_main->have_posts() ) { $post_count = 1; while ( $query_main->have_posts() ) { $query_main->the_post(); ?>
class="fdm-post fdm-standard last" class="fdm-post fdm-half-left" class="fdm-post fdm-half-right" class="fdm-post fdm-standard" > ">

Большое спасибо заранее. Я долго мучился с этим!

У вас есть версия вашего сайта с https?
Я спрашиваю это, потому что недавно столкнулся с проектом, который был сайтом, к которому можно было получить доступ как по http, так и по https. Поэтому мне пришлось указать это в функции ajax_url. Таким образом, в вашем случае я предлагаю попробовать:

$protocol = isset( $_SERVER['HTTPS'] ) ? 'https://' : 'http://';

$args = array(
  'ajaxurl' => admin_url( 'admin-ajax.php',$protocol ),
  'query'   => $wp_query->query

в вашей функции регистрации.

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

Ajax Infinite Scroll в кастомном WP_Query: Проблемы и их решение

Введение

Реализация бесконечной прокрутки (infinite scroll) с помощью Ajax в WordPress может стать сложной задачей, особенно если вы настраиваете собственные WP_Query-цикл. В данном руководстве мы разберем основные проблемы, которые могут возникнуть при использовании Ajax для бесконечной прокрутки, и предложим решения с учетом вашего кода.

Проблема с аргументом Пагинации

Как описано в вопросе, вы столкнулись с проблемами при передаче параметра paged в ваш кастомный WP_Query. Это часть функционала, необходимая для правильной обработки постов при загрузке дополнительных данных через Ajax.

Основные аспекты вашего кода:

  • Доступ к правильной пагинации в Ajax запросе.
  • Убедитесь, что значение параметра page корректно передается и используется в новом запросе.
  • Обработка пользовательских запросов.

Анализ кода

  1. Ajax Функция:

    function txcap_ajax_scroll() {
        $args = isset($_POST['query']) ? array_map('esc_attr', $_POST['query']) : array();
        $args['post_type'] = isset($args['post_type']) ? esc_attr($args['post_type']) : 'post';
        $args['paged'] = esc_attr($_POST['page']); // Проверьте, правильно ли значение передается
        $args['post_status'] = 'publish';
    
        ob_start();  
        $query = new WP_Query($args);
    
        // Проверка наличия постов
        ...
    
        wp_reset_postdata();
        $data = ob_get_clean();
        wp_send_json_success($data);
        wp_die();
    }

    Убедитесь, что $_POST['page'] действительно передает корректное значение. Чтобы сделать это, добавьте отладочный вывод, например, error_log($_POST['page']);.

  2. Запрос в функции enqueue:

    $args = array(
       'ajaxurl' => admin_url('admin-ajax.php'),
       'query'   => $wp_query->query,
    );

    На этом этапе убедитесь, что все необходимые данные передаются. Как предложено в комментариях, проверьте протокол (HTTP/HTTPS):

    $protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
    $args = array(
       'ajaxurl' => admin_url('admin-ajax.php', $protocol), // Включите протокол
       'query'   => $wp_query->query,
    );
  3. Handler Ajax Запроса:
    Убедитесь, что у вас корректно настроен Ajax обработчик на стороне клиента. В вашем JavaScript коде тоже могут быть ошибки. Пример измененного обработчика:

    $(window).scroll(function() {
       var offset = $(button).offset().top - $(window).scrollTop();
       if (offset < 2000 && !loading && scrollHandling.allow) {
           loading = true;
           $.ajax({
               url: ajaxinfinitescroll.ajaxurl,
               type: 'post',
               data: {
                   action: 'txcap_ajax_scroll',
                   page: page,
                   query: ajaxinfinitescroll.query
               },
               success: function(result) {
                   if(result.success) {
                       $('.fdm-blog-container').append(result.data);
                       page++;
                       loading = false;
                   }
               },
               error: function(xhr, textStatus, e) {
                   console.log(xhr.responseText);
                   loading = false; // Убедитесь, что loading сбрасывается при ошибках
               }
           });
       }
    });

Заключение

Реализация бесконечной прокрутки с помощью Ajax в WordPress требует внимательного подхода к передаче параметров и конфигурации запросов. Следуйте этим рекомендациям:

  • Убедитесь, что значение paged корректно передается через Ajax.
  • Не забывайте отлаживать и проверять данные, которые поступают на сервер и обратно.
  • Используйте отладочные сообщения для отслеживания проблем.

С применением указанных решений ваша система бесконечной прокрутки должна начать корректно функционировать. Успехов в разработке!

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

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