Вопрос или проблема
Я настроил пользовательский цикл 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
корректно передается и используется в новом запросе. - Обработка пользовательских запросов.
Анализ кода
-
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']);
. -
Запрос в функции 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, );
-
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. - Не забывайте отлаживать и проверять данные, которые поступают на сервер и обратно.
- Используйте отладочные сообщения для отслеживания проблем.
С применением указанных решений ваша система бесконечной прокрутки должна начать корректно функционировать. Успехов в разработке!