Skip to content
Dynamic blog filtering illustration using HubL and JavaScript in HubSpot CMS
Deepak Jha10 November 20251 min read

Building Dynamic Blog Filters in HubSpot Using HubL and JavaScript

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.

1. Structuring Blog Data with HubL

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.

2. Creating a Simple Filter Interface

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.

3. Filtering and Rendering with JavaScript

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.

4. Styling for Modern UX

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.

Final Thoughts

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.

avatar

Deepak Jha

Building custom HubSpot CMS themes, HUBL modules, smart forms, and dynamic quote templates—optimized for speed, scalability, and CRM integration.

RELATED ARTICLES