Blog Listing With Ajax Pagination and Tag filters
Thu Mar 06 2025 06:36:31 GMT+0000 (Coordinated Universal Time)
Saved by @B2BForever_Dev
<div class="blog_listing">
<div class="blog_nav col_padd">
<div class="page-center">
<div class="smart_hr_wrap">
<div class="smart_hr first">
<hr>
</div>
<div class="smar_btm">
<ul>
<li>{% set href = module.beadcrumbs.link.url.href %}
{% if module.beadcrumbs.link.url.type is equalto "EMAIL_ADDRESS" %}
{% set href = "mailto:" + href %}
{% endif %}
<a
{% if module.beadcrumbs.link.url.type is equalto "CALL_TO_ACTION" %}
href="{{ href }}"
{% else %}
href="{{ href|escape_url }}"
{% endif %}
{% if module.beadcrumbs.link.open_in_new_tab %}
target="_blank"
{% endif %}
{% if module.beadcrumbs.link.rel %}
rel="{{ module.beadcrumbs.link.rel|escape_attr }}"
{% endif %}
>
{{ module.beadcrumbs.link_text }}
</a></li>
<span class="arrow_icn">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.1724 7.50586L15.1768 12.5102L10.1724 17.5146" stroke="#343935" stroke-width="2.00175" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<li><a href="{{group.absolute_url}}">{{group.public_title}}</a></li>
{% if topic %} <span class="arrow_icn">
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.1724 7.50586L15.1768 12.5102L10.1724 17.5146" stroke="#343935" stroke-width="2.00175" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span><li><span>{{ topic|replace('-',' ') }}</span></li>{% endif %}
</ul>
</div>
<div class="smart_hr last">
<hr>
</div>
</div>
</div>
</div>
{% if module.image_field.src %}
<div class="blog_featured col_padd">
<div class="page-center">
<div class="featured_image_wrap">
{% set sizeAttrs = 'width="{{ module.image_field.width|escape_attr }}" height="{{ module.image_field.height|escape_attr }}"' %}
{% if module.image_field.size_type == 'auto' %}
{% set sizeAttrs = 'width="{{ module.image_field.width|escape_attr }}" height="{{ module.image_field.height|escape_attr }}" style="max-width: 100%; height: auto;"' %}
{% elif module.image_field.size_type == 'auto_custom_max' %}
{% set sizeAttrs = 'width="{{ module.image_field.max_width|escape_attr }}" height="{{ module.image_field.max_height|escape_attr }}" style="max-width: 100%; height: auto;"' %}
{% endif %}
{% set loadingAttr = module.image_field.loading != 'disabled' ? 'loading="{{ module.image_field.loading|escape_attr }}"' : '' %}
<img src="{{ module.image_field.src|escape_url }}" alt="{{ module.image_field.alt|escape_attr }}" {{ loadingAttr }} {{ sizeAttrs }}>
</div>
</div>
</div>
{% endif %}
<div class="blog_tags col_padd">
<div class="page-center">
<div class="top_title">
<h3>Blog Tags</h3>
</div>
<div class="topics">
{% set my_topics = blog_topics(group.id, 250) %}
<a href="{{group.absolute_url}}" class="category_filter">All</a>
<svg width="3" height="4" viewBox="0 0 3 4" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="1.5" cy="2" r="1.5" fill="#B2B0B0"/>
</svg>
{% for item in my_topics %}
<a href="{{ blog_tag_url(group.id, item.slug) }}" class="category_filter">{{ item }}</a>
{% if not loop.last %}
<svg width="3" height="4" viewBox="0 0 3 4" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="1.5" cy="2" r="1.5" fill="#B2B0B0"/>
</svg>
{% endif %}
{% endfor %}
</div>
</div>
</div>
<div class="blog_main col4_row">
<div class="page-center">
<div class="blog_list flex_row">
{% for content in contents %}
<div class="post_item col4">
<div class="post_item_inner">
{% if content.featured_image %}
<div class="image">
<a href="{{content.absolute_url}}">
<img src="{{content.featured_image}}" alt="{{content.name|stiptags}}">
</a>
</div>
{% endif %}
<div class="content">
<div class="article">Article</div>
{% if content.title %}
<div class="title">
<h3>
<a href="{{content.absolute_url}}">{{content.title}}</a>
</h3>
</div>
{% endif %}
<div class="subtitle">
<p>{{ content.post_list_content|safe|striptags|truncatehtml(155, '…' , false) }}</p>
</div>
<div class="read_more">
<a href="{{content.absolute_url}}">Read more</a>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="blog_pagination_wrap">
<div class="page-center">
<div class="blog_pagination col_padd">
<div class="blog-pagination">
{% set page_list = [-2, -1, 0, 1, 2] %}
{% if contents.total_page_count - current_page_num == 1 %}{% set offset = -1 %}
{% elif contents.total_page_count - current_page_num == 0 %}{% set offset = -2 %}
{% elif current_page_num == 2 %}{% set offset = 1 %}
{% elif current_page_num == 1 %}{% set offset = 2 %}
{% else %}{% set offset = 0 %}{% endif %}
<div class="blog-pagination-center">
{% for page in page_list %}
{% set this_page = current_page_num + page + offset %}
{% if this_page > 0 and this_page <= contents.total_page_count %}
<a href="{{ blog_page_link(this_page) }}" class="page-link {% if this_page == current_page_num %}active{% endif %}">{{ this_page }}</a>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% require_js %}
<script>
$(document).ready(function () {
function setActiveCategory(categoryURL) {
$('.category_filter').removeClass('active');
$('.category_filter[href="' + categoryURL + '"]').addClass('active');
}
function setActivePage(pageURL) {
$('.page-link').removeClass('active');
var foundMatch = false;
$('.page-link').each(function () {
if ($(this).attr('href') === pageURL) {
$(this).addClass('active');
foundMatch = true;
}
});
// If no match found (like when on the first page without page number in URL), set first page active
if (!foundMatch) {
$('.page-link').first().addClass('active');
}
}
function updateBlogPosts(url) {
$('.blog_main').load(url + " .blog_main .blog_list", function () {
loadPagination(url);
});
}
function loadPagination(url) {
$('.blog_pagination_wrap').load(url + " .blog_pagination_wrap", function () {
setActivePage(window.location.href);
});
}
// Handle category click event
$('.category_filter').on('click', function (e) {
e.preventDefault();
var categoryURL = $(this).attr('href');
history.pushState(null, null, categoryURL);
setActiveCategory(categoryURL);
updateBlogPosts(categoryURL);
});
// Handle pagination click event
$(document).on('click', '.blog-pagination a', function (e) {
e.preventDefault();
var pageURL = $(this).attr('href');
history.pushState(null, null, pageURL);
setActivePage(pageURL);
updateBlogPosts(pageURL);
});
// Preserve active states on load
setActiveCategory(window.location.href);
setActivePage(window.location.href);
});
</script>
{% end_require_js %}
</div>



Comments