
21 сентября 2019 WordPress Ajax
Кнопка «Показать ещё» и бесконечный скроллинг — это по сути постраничная навигация, которая подгружает следующую страницу с постами без перезагрузки страницы. Подобные примеры часто можно встретить в лентах соц. сетей. В этом примере показана реализация кнопки «Показать ещё» и бесконечного скроллинга постов на Ajax в CMS WordPress.
Кнопка «Показать ещё» в WordPress
Принцип использования сводится к тому, что если на странице есть ещё не показанные посты, т.е. следующая страница, то будет выведена кнопка «Показать ещё». При нажатии на неё посылается стандартный Ajax-запрос к обработчику, который отдает посты следующей страницы и они отображаются ниже уже показанных.
Давайте создадим кнопку в списке постов рубрики. Для этого в файле category.php после цикла while, добавляем следующий код:
var ajaxurl = '/wp-admin/admin-ajax.php';
var posts_vars = '';
var current_page = ;
var max_pages = '';
Показать ещё
При первом вызове этот код выводит кнопку, если общее число страниц max_num_pages больше 1. А так же задает нужные JS переменные ajaxurl — ссылка на стандартный обработчик WP, posts_vars — данные запроса, current_page — номер текущей страницы, max_pages — максимальное кол-во страниц.
Теперь необходимо создать JS-скрипт, который отправляет Ajax запросы и выводит посты при нажатии на кнопку. Назовем его loadmore.js и поместим его в папку js текущей темы. Про основы Ajax в WordPress можно почитать в этой статье.
jQuery(function($){
$('#loadmore').click(function(){ // клик на кнопку
$(this).text('Загрузка...'); // меняем текст на кнопке
// получаем нужные переменные
var data = {
'action': 'loadmore',
'query': posts_vars,
'page' : current_page
};
// отправляем Ajax запрос
$.ajax({
url:ajaxurl,
data:data,
type:'POST',
success:function(data){
if(data) {
$('#loadmore').text('Показать ещё').before(data); // добавляем новые посты
current_page++; // записываем новый номер страницы
if (current_page == max_pages) $("#loadmore").remove(); // если последняя страница, удаляем кнопку
} else {
$('#loadmore').remove(); // если посты не были получены так же удаляем кнопку
}
}
});
});
});
Теперь нужно подключить этот скрипт в теме WordPress. В файле functions.php добавляем следующий код:
function loadmore_script() {
wp_enqueue_script('jquery'); // подключает библиотеку jQuery необходимую для работы скрипта
wp_enqueue_script('loadmore', get_stylesheet_directory_uri() . '/js/loadmore.js', array('jquery')); // подключаем loadmore.js
}
add_action('wp_enqueue_scripts', 'loadmore_script');
Ну и последний шаг — это создание PHP функции, которая будет вызываться Ajax-запросом и отдавать нужные посты. Все в том же файле functions.php добавляем код:
function loadmore_get_posts(){
$args = unserialize(stripslashes($_POST['query']));
$args['paged'] = $_POST['page'] + 1; // следующая страница
$args['post_status'] = 'publish';
query_posts($args);
// если посты есть
if(have_posts()) :
while(have_posts()): the_post();
the_post();?>
var ajaxurl = '/wp-admin/admin-ajax.php';
var posts_vars = '';
var current_page = ;
И изменяем код файла loadmore.js, чтобы он вызывал Ajax-запрос не по нажатию кнопки, а при прокручивании страницы до нижней части сайта.
jQuery(function($){
$(window).scroll(function(){
var bottomOffset = 2000; // отступ от нижней части сайта, достигнув которой будет вызвана подгрузка следующих постов
var data = {
'action': 'loadmore',
'query': posts_vars,
'page' : current_page
};
if($(document).scrollTop() > ($(document).height() - bottomOffset) && !$('body').hasClass('loading')) {
$.ajax({
url:ajaxurl,
data:data,
type:'POST',
beforeSend: function(xhr){
$('body').addClass('loading');
},
success:function(data){
if(data) {
$('#loadmore').before(data);
$('body').removeClass('loading');
current_page++;
}
}
});
}
});
});