Добавить Кнопку “Загрузить еще” на AJAX в OpenCart, Joomla, WordPress и другие CMS
- Показывать справа: 0
В современном веб-разработке, особенно на популярных CMS вроде OpenCart, Joomla, WordPress, а также на сайтах с кастомной разработкой, одним из распространенных сценариев является необходимость подгрузки дополнительного контента без перезагрузки всей страницы. Будь то товары в интернет-магазине, статьи в блоге или элементы списка, удобная кнопка "Загрузить еще" с динамической подгрузкой через AJAX может значительно улучшить пользовательский опыт и, при правильной реализации, положительно сказаться на SEO.
Если вам нужна реализация подобного функционала на вашем сайте — вы можете заказать разработку на PHP или разработку на WordPress.
В этой статье мы подробно разберем JavaScript-код на JQuery, который позволяет легко добавить такую функциональность. Вы узнаете, как он работает, как его интегрировать в свои проекты на OpenCart, Joomla, WordPress или любой сайт, где есть пагинация, и какие преимущества это дает.
Сам код функционала: "Загрузить еще"
Прежде чем углубляться в детали, давайте посмотрим на сам код:
JavaScript-код для реализации
$(function(){
const pBlock = ".pagination"; // Селектор для блока пагинации
if ($(pBlock).length) { // Проверяем, есть ли блок пагинации на странице
const btnHtml = `
<div class="uk-margin uk-text-center show-more">
<a class="show-more__btn el-content uk-button uk-button-danger" >
Загрузить еще
</a>
</div>
`; // HTML-код кнопки "Загрузить еще"
// Добавляем кнопку, если есть следующая страница
if ($(pBlock).find(".uk-active").next().length) {
$(pBlock).before(btnHtml);
}
// Наблюдаем за изменениями в пагинации для динамического показа/скрытия кнопки
const observer = new MutationObserver((e) => {
if (!$(".show-more").length) { // Если кнопки нет, добавляем ее
$(pBlock).before(btnHtml);
}
// Показываем кнопку, если есть следующая страница, иначе скрываем
if ($(pBlock).find(".uk-active").next().length) {
$(".show-more").show();
} else {
$(".show-more").hide();
}
});
// Запускаем наблюдение, если есть элемент с классом "pagination-text" (для определения изменений)
if ($(".pagination-text").length) {
observer.observe($(".pagination-text")[0], { childList: true, subtree: true });
}
// Обработчик клика по кнопке "Загрузить еще"
$(document).on("click", ".show-more__btn", function() {
let pagination = $(pBlock);
let pagination_text = $(".pagination-text");
let products = $(".fs-load-more-container"); // Селектор для контейнера, куда будут добавляться товары
// Получаем URL следующей страницы
let url = pagination.find(".uk-active").next().find("a").attr("href");
// Если URL не определен или пуст, выходим
if (typeof url == "undefined" || url == "") return;
// Корректируем URL для HTTPS, если текущий протокол HTTPS
if (document.location.protocol == "https:") {
url = url.replace("http:", "https:");
}
// AJAX-запрос для получения нового контента
$.ajax({
url: url,
type: "get",
dataType: "html",
beforeSend: function() {
// Отображаем прелоадер во время загрузки
$("body").append(`
<div id="preloader" class="preloader-wrapper">
<div uk-spinner="ratio: 3"></div> <!-- uk-spinner - элемент UIkit -->
</div>
`);
},
success: function(data) {
$("#preloader").remove(); // Удаляем прелоадер
let result = $(data); // Парсим полученный HTML
// Добавляем новый контент (например, товары)
products.append(result.find(".fs-load-more-container").html());
// Обновляем блок пагинации
pagination.html(result.find(pBlock).html());
// Обновляем текстовое отображение пагинации (например, "Страница 5 из 10")
let textString = result.find(".pagination-text").text();
pagination_text.text(textString);
// Обновляем URL в адресной строке браузера без перезагрузки страницы (важно для SEO и истории)
window.history.pushState("", "", url);
},
});
});
}
});
Нужна помощь с внедрением?
Если вы не хотите разбираться в реализации AJAX-загрузки или нужно доработать существующий сайт — можно заказать доработку сайта или доработку WordPress.
Пример отрисованной кнопки "Загрузить еще"
Ниже показано, как будет выглядеть кнопка, созданная кодом btnHtml. :
Как Это Работает? Разбираем Код Пошагово
- Инициализация и Поиск Блока Пагинации:
$(function(){ ... });- Весь код обернут в функцию, которая выполняется после полной загрузки DOM.const pBlock = ".pagination";- Определяется переменнаяpBlockс CSS-селектором для вашего основного блока пагинации. Важно: убедитесь, что на ваших страницах OpenCart, Joomla, WordPress или других сайтах этот блок имеет классpagination.if ($(pBlock).length)- Код будет выполняться только если на странице найден элемент с указанным селектором.
- Создание Кнопки "Загрузить еще":
const btnHtml = \`...\`;- Определяется строка с HTML-кодом кнопки. Вы можете настроить классы (uk-margin,uk-text-center,show-more,show-more__btn,el-content,uk-button,uk-button-danger) согласно вашему дизайну и используемому фреймворку (похоже на UIkit).if ($(pBlock).find(".uk-active").next().length)- Проверяется, существует ли следующая страница в пагинации (активный элемент.uk-activeимеет следующий брат). Если да, то кнопка добавляется перед блоком пагинации ($(pBlock).before(btnHtml)).
- Динамическое Управление Кнопкой с
MutationObserver:const observer = new MutationObserver((e) => { ... });- Создается наблюдатель за изменениями в DOM. Это очень полезно, так как пагинация может обновляться динамически (например, после AJAX-запроса).if (!$(".show-more").length)- Если кнопки "Загрузить еще" вдруг нет (например, после какой-то другой динамической модификации страницы), она добавляется.if ($(pBlock).find(".uk-active").next().length)- Опять же, проверяется наличие следующей страницы. Если есть, кнопка.show-moreпоказывается (.show()), иначе — скрывается (.hide()).if ($(".pagination-text").length)- Наблюдатель запускается только если на странице есть элемент с классомpagination-text. Этот элемент, видимо, используется для синхронизации состояния пагинации.observer.observe($(".pagination-text")[0], { childList: !0, subtree: !0 });- Наблюдатель прикрепляется к первому найденному элементу.pagination-textи отслеживает изменения в его дочерних элементах и всех их потомках.
- Обработка Кликов по Кнопке "Загрузить еще":
$(document).on("click", ".show-more__btn", function() { ... });- Используется делегированный обработчик событий. Это значит, что даже если кнопка будет добавлена динамически, клики по ней будут обрабатываться.- Получение Данных:
let pagination = $(pBlock);let pagination_text = $(".pagination-text");let products = $(".fs-load-more-container");- Важно: Этот селектор указывает, куда будет добавлен новый контент. Убедитесь, что в вашем шаблоне OpenCart, Joomla, WordPress или другом сайте есть элемент с классомfs-load-more-container(или измените селектор под свою структуру).let url = pagination.find(".uk-active").next().find("a").attr("href");- Из активного элемента пагинации извлекаетсяhrefследующей ссылки.
- Проверка URL:
if (typeof url == "undefined" || url == "") return;- Если ссылка не найдена, дальнейшие действия не производятся. - Коррекция URL для HTTPS:
if (document.location.protocol == "https:") { url = url.replace("http:", "https:"); }- Обеспечивает правильное формирование URL для HTTPS-сайтов. - AJAX-Запрос (
$.ajax):url: url- Адрес, куда отправляется запрос.type: "get"- Метод запроса.dataType: "html"- Ожидаемый тип данных ответа.beforeSend:$("body").append(\`...\`)- Добавляет на страницу элемент с индикатором загрузки (#preloader). Классыpreloader-wrapperиuk-spinnerуказывают на использование UIkit.
success:$("#preloader").remove();- Убирает индикатор загрузки.let result = $(data);- Полученный HTML-ответ парсится в объект jQuery.products.append(result.find(".fs-load-more-container").html());- Из ответа извлекается HTML из нужного контейнера и добавляется в ваш основной контейнер (.fs-load-more-container).pagination.html(result.find(pBlock).html());- Весь блок пагинации заменяется новым, полученным из ответа.pagination_text.text(textString);- Текстовое отображение пагинации обновляется.window.history.pushState("", "", url);- Очень важный шаг для SEO! Он добавляет новый URL в историю браузера и изменяет адресную строку без перезагрузки страницы. Это позволяет пользователям делиться ссылкой на страницу с уже подгруженным контентом, а поисковым роботам — правильно индексировать контент.
Интеграция в OpenCart, Joomla, WordPress и другие CMS: Практические Шаги
- Подключение jQuery:
- Убедитесь, что библиотека jQuery подключена на ваших страницах. В большинстве современных тем OpenCart, Joomla, WordPress и многих других CMS она уже есть. Если нет, добавьте ссылку на CDN или локальный файл в
<head>вашего шаблона:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
- Убедитесь, что библиотека jQuery подключена на ваших страницах. В большинстве современных тем OpenCart, Joomla, WordPress и многих других CMS она уже есть. Если нет, добавьте ссылку на CDN или локальный файл в
- Подключение Вашего JavaScript-файла:
- Сохраните предоставленный вами код в файл, например,
load-more.js. - Разместите этот файл в папке с вашими скриптами (например,
catalog/view/javascript/в OpenCart,templates/ваша_тема/js/в Joomla, или через админ-панель WordPress, например, в теме или с помощью плагина). - Подключите этот скрипт в шаблоне вашей страницы (или через функции темы WordPress) после подключения jQuery.
<script src="/путь/к/вашему/скрипту/load-more.js"></script>
- Сохраните предоставленный вами код в файл, например,
- Настройка Шаблона (HTML-структура):
- Блок пагинации: Убедитесь, что ваш стандартный блок пагинации имеет класс
pagination. - Контейнер для контента: Создайте элемент с классом
fs-load-more-container, куда будет добавляться новый контент (товары, статьи и т.д.). Изначально он может быть пустым, или содержать первую порцию контента. - Текстовое отображение пагинации: Если ваш шаблон использует элемент для отображения текста пагинации (например, "Страница 1 из 5"), убедитесь, что он имеет класс
pagination-text. Этот элемент нужен для корректной работыMutationObserver. - Структура ссылки пагинации: Код ожидает, что каждая ссылка пагинации будет внутри элемента
.uk-active(для текущей страницы) и его последующего брата (.next()), который содержит ссылку (<a>) с атрибутомhref.
Пример структуры (универсален для большинства сайтов с пагинацией):
<!-- Ваш основной контейнер для элементов --> <div class="fs-load-more-container"> <!-- Здесь будут отображаться товары/статьи --> <div class="product-item">...</div> <div class="product-item">...</div> <!-- ... --> </div> <!-- Ваш блок пагинации --> <div class="pagination"> <ul> <li class="uk-active"><a>1</a></li> <li><a href="/page/2">2</a></li> <li><a href="/page/3">3</a></li> <!-- ... --> </ul> </div> <!-- Если используется отдельный текстовый элемент пагинации --> <div class="pagination-text">Страница 1 из 5</div> - Блок пагинации: Убедитесь, что ваш стандартный блок пагинации имеет класс
- Настройка CSS:
- Убедитесь, что стили для
.show-more,.show-more__btnи#preloaderсоответствуют вашему дизайну. Если вы используете UIkit, то классыuk-margin,uk-text-center,uk-button,uk-button-danger,uk-spinnerдолжны работать "из коробки". - Вы можете стилизовать
#preloaderдля центрирования или другого расположения на экране.
- Убедитесь, что стили для
SEO-Аспекты и Преимущества
- Полная индексация: Благодаря
window.history.pushState, поисковые роботы видят URL, соответствующие подгруженному контенту, что способствует более полной индексации. - Улучшенный UX: Пользователи получают доступ к большему количеству контента без лишних кликов, что снижает показатель отказов и увеличивает время на сайте.
- Актуальность: Динамическое обновление контента помогает поддерживать страницу актуальной.
Заключение
Предоставленный вами JavaScript-код — это эффективное решение для добавления функционала "Загрузить еще" на AJAX. Он хорошо продуман, использует MutationObserver для динамичности и pushState для SEO-дружественности. Следуя этому руководству, вы сможете легко интегрировать его в свои проекты на OpenCart, Joomla, WordPress или любом другом сайте, значительно улучшив взаимодействие пользователей с вашим сайтом.
Не забывайте тестировать функционал после внедрения на разных устройствах и в разных браузерах!
Разработка и доработка сайтов
Реализую подобные решения под ключ: AJAX-загрузка, фильтры, личные кабинеты, интеграции и кастомная логика.