In today’s competitive digital space, visitors expect speed, personalization, and seamless navigation. A dynamic blog filtering system in HubSpot CMS helps readers instantly find relevant content by category, tag, or author — improving engagement, dwell time, and overall website performance. Here’s how to build one using HubL and JavaScript for a modern, interactive experience.
First, use HubL to convert your blog posts into structured JSON. This lets JavaScript manipulate and display them dynamically on the frontend.
{% set posts = blog_recent_posts('default', 100) %}
{% set data = posts|map(post => {
'title': post.name,
'url': post.absolute_url,
'tags': post.topic_list|map('name'),
'author': post.blog_author.display_name,
'date': post.publish_date|datetimeformat('%b %e, %Y')
}) %}
<script>
const blogPosts = {{ data|tojson }};
</script>
This approach creates a clean, ready-to-use dataset that JavaScript can filter instantly without reloading the page — crucial for fast-loading HubSpot blogs.
Now, set up minimal markup for filter options and a container to display posts.
<div id="filter-section">
<select id="tagFilter">
<option value="">All Topics</option>
</select>
</div>
<div id="blogList"></div>
This clean layout ensures full flexibility for responsive styling while keeping the DOM light and accessible.
Next, use JavaScript to populate tag filters and dynamically render filtered blog posts.
<script>
const tags = [...new Set(blogPosts.flatMap(p => p.tags))];
const filter = document.getElementById('tagFilter');
const list = document.getElementById('blogList');
tags.forEach(t => {
const o = document.createElement('option');
o.value = t; o.textContent = t;
filter.appendChild(o);
});
function showPosts(data) {
list.innerHTML = data.map(p => `
<article>
<h4><a href="${p.url}">${p.title}</a></h4>
<p>${p.author} — ${p.date}</p>
</article>
`).join('');
}
filter.addEventListener('change', e => {
const v = e.target.value;
showPosts(v ? blogPosts.filter(p => p.tags.includes(v)) : blogPosts);
});
showPosts(blogPosts);
</script>
This enables smooth, instant filtering powered by client-side rendering, reducing server load and improving HubSpot CMS site performance.
Keep styling clean, minimal, and mobile-friendly to complement the HubSpot theme.
<style>
#filter-section { margin-bottom: 1rem; }
#tagFilter { padding: .5rem; border-radius: 6px; }
article { border-bottom: 1px solid #eee; padding: 1rem 0; }
h4 a { color: #222; text-decoration: none; }
h4 a:hover { color: #0066cc; }
</style>
This ensures a consistent, visually polished layout that aligns with modern UI/UX best practices.
Adding a dynamic blog filter in HubSpot CMS is one of the most effective ways to deliver a fast, intuitive content experience. By combining HubL for data preparation and JavaScript for interactivity, you can achieve a seamless and professional-level result that enhances user satisfaction and SEO performance.
If you’re exploring advanced HubSpot CMS development, website performance upgrades, or interactive UI integrations — feel free to reach out with your questions or project ideas. Fill out the form below; I’d be glad to help.