WordPress подгрузка постов кнопкой показать еще или бесконечным скроллом

WordPress подгрузка постов кнопкой показать еще или бесконечным скроллом

21 сентября 2019 WordPress

Кнопка «Показать ещё» и бесконечный скроллинг — это по сути постраничная навигация, которая подгружает следующую страницу с постами без перезагрузки страницы. Подобные примеры часто можно встретить в лентах соц. сетей. В этом примере показана реализация кнопки «Показать ещё» и бесконечного скроллинга постов на Ajax в CMS WordPress.

Кнопка «Показать ещё» в WordPress

Принцип использования сводится к тому, что если на странице есть ещё не показанные посты, т.е. следующая страница, то будет выведена кнопка «Показать ещё». При нажатии на неё посылается стандартный Ajax-запрос к обработчику, который отдает посты следующей страницы и они отображаются ниже уже показанных.

Давайте создадим кнопку в списке постов рубрики. Для этого в файле category.php после цикла while, добавляем следующий код:

<?php if ($wp_query->max_num_pages > 1) : ?>
	<script>
	var ajaxurl = '<?php echo site_url(); ?>/wp-admin/admin-ajax.php';
	var posts_vars = '<?php echo serialize($wp_query->query_vars); ?>';
	var current_page = <?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>;
	var max_pages = '<?php echo $wp_query->max_num_pages; ?>';
	</script>
	<button id="loadmore">Показать ещё</button>
<?php endif; ?>

При первом вызове этот код выводит кнопку, если общее число страниц max_num_pages больше 1. А так же задает нужные JS переменные ajaxurl — ссылка на стандартный обработчик WP, posts_vars — данные запроса, current_page — номер текущей страницы, max_pages — максимальное кол-во страниц.

Теперь необходимо создать JS-скрипт, который отправляет Ajax запросы и выводит посты при нажатии на кнопку. Назовем его loadmore.js и поместим его в папку js текущей темы. Про основы Ajax в WordPress можно почитать в этой статье. JMS University — это каталог онлайн-курсов по профессиям из сферы it и digital, программированию, маркетингу, аналитике, дизайну, менеджменту и Soft Skills https://jms.university/courses/.

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();?>
		<h2><?php the_title();?></h2>
		<?php the_content();?>
		
		<?php
		//get_template_part('content-template');
		
		endwhile;
	endif;
	die();
}
 
add_action('wp_ajax_loadmore', 'loadmore_get_posts');
add_action('wp_ajax_nopriv_loadmore', 'loadmore_get_posts');

В цикле можно сразу указать HTML-разметку поста или загрузить шаблон из папки темы с помощью функции get_template_part('content-template');. В данном случае будет загружен файл content-template.php из папки текущей темы.

Бесконечный скролл на WordPress

Берём за основу пример с кнопкой «Показать ещё» и немного модернизируем код в файлах category.php и loadmore.js. Остальной код оставляем тот же, что и в примере выше. Так как кнопка больше не нужна, то убираем ее из кода с циклом:

<?php if ($wp_query->max_num_pages > 1) : ?>
	<script id="loadmore">
	var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
	var posts_vars = '<?php echo serialize($wp_query->query_vars); ?>';
	var current_page = <?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>;
	</script>
<?php endif; ?>

И изменяем код файла 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++;
					}
				}
			});
		}
	});
});

Если вам понравилась статья, вы можете отблагодарить автора любой суммой, какую сочтете для себя приемлемой:
Остались вопросы по статье? Задайте их прямо сейчас!
Перенос сайта на WordPress на другой домен

В повседневной работе часто приходится сталкиваться с переносом сайта на Wordpress с локального или тестового домена на основной. Для этого необходимо не только скопировать файлы, базу данных и поменять настройки в конфигурационном файле, но и сделать ряд SQL-запросов, чтобы прописать Читать далее

Правильный файл robots.txt для WordPress 2019

Самый оптимальный и простой код файла robots.txt для вашего сайта на WordPress, который подойдет для всех поисковиков. Этот вариант использую на данном сайте. Не забудьте заменить maindot.ru на адрес вашего сайта. Содержание файла robots.txt для WordPress Если вы используете HTTPS, Читать далее

Отправка формы без перезагрузки страницы на PHP и Ajax

Постоянно приходится пользоваться этой заготовкой. Вы можете модернизировать ее под любые нужды, будь то форма обратной связи, форма обратного звонка или заказ какой-либо услуги или товара. Поэтому я не буду украшать ее стилями, применять классы Bootstrap и различные скрипты, как Читать далее

Произвольные типы записей WordPress

Произвольные типы записей позволяют разделить посты не только по категориям, но и по их типу с собственными названиями и рубриками. Это что-то типо инфоблока, как в CMS 1С-Битрикс. По умолчанию в WordPress есть возможность добавлять записи и их рубрики. К Читать далее

Произвольные поля WordPress

Произвольные поля или как их еще называют кастомные или доп. поля в WordPress очень нужная вещь, особенно при создании например сайта-каталога. С помощью доп. полей можно добавить к записям возможность указывать например цену или цвет, а затем выводить сохраненное значение Читать далее

Создание плагина WordPress с нуля

Когда я создавал свой первый плагин, то оказалось, что в сети очень мало информации по этому вопросу. С трудом удалось найти даже основы. Надеюсь эта статья поможет вам научиться писать различные плагины для WordPress. Наверняка вы уже пользовались и знаете, Читать далее

WordPress Ajax

По большей части публикации про применение Ajax в WordPress сложные для понимания, особенно если вы мало знакомы с этой технологией. В этой статье я покажу, как на самом деле просто использовать Ajax в публичной части сайта. Ajax запросы в WordPress Читать далее

5 комментариев на «WordPress подгрузка постов кнопкой показать еще или бесконечным скроллом»

  1. Илья:

    Спасибо за простой и понятный код, все сработало

  2. Костя:

    400 Bad Request что делать?

  3. Денис:

    Подскажите, а как вывести из определенной категории?
    добавил в функцию loadmore_get_posts() аргумент $args[‘category__in’] = 3; а он выводит пустой блок без данных поста.

  4. Сергей:

    У меня после нажатия кнопки выводятся только чётные посты
    function loadmore_get_posts(){
    $args = unserialize(stripslashes($_POST[‘query’]));
    $args[‘paged’] = $_POST[‘page’] + 1; // следующая страница
    $args[‘post_status’] = ‘publish’;

    // query_posts($args);
    $query = new WP_Query( $args );
    // если посты есть
    if($query->have_posts()) :
    while($query->have_posts()): $query->the_post();
    $query->the_post();?>

    <?php
    //get_template_part('content-template');

    endwhile;
    endif;
    die();
    }

  5. Констнатин:

    Добрый день, код сработал, спасибо за понятное описание, у меня есть вопрос один… А как сделать чтобы выводилось допустим по 10 записей и чтобы и четные и нечетные записи выводились? а то сейчас выводится всего 5 записей и только нечетные

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