DEV Community

Cover image for Displaying all posts for specific Tag [Building Personal Blog Website Part 5]
Michał Hawełka
Michał Hawełka

Posted on • Edited on • Originally published at hwlk.dev

Displaying all posts for specific Tag [Building Personal Blog Website Part 5]

The blog post preview cards on your homepage display not only the cover, title and excerpt, but also a list of tags. It would be great if user could click on any of the tags and then see all blog posts connected to it. And that’s what you’ll implement today.

Let’s start with creating a new route in the Next.js application. Create a new folder tag in your pages directory. Inside create a file [tag].js - the goal is to have a route like YOUR_URL/tag/tag-name.

Blog-5-1.png

Now inside this [tag].js file you have to implement getStaticPaths and getStaticProps similarly to the Blog Post page.

For getStaticPaths you need to get a list of all tags that your CMS has:

export async function getStaticPaths() {
  const { data } = await client.query({
    query: gql`
      query Tags {
        tags {
          data {
            attributes {
              tagId
            }
          }
        }
      }
    `,
  });
  return {
    paths: data.tags.data.map((item) => ({
      params: { tag: item.attributes.tagId },
    })),
    fallback: false,
  };
}
Enter fullscreen mode Exit fullscreen mode

In getStaticProps you’ll get all of the posts with specific tag:

export async function getStaticProps({ params }) {
  const { data } = await client.query({
    query: gql`
      query Tags {
        tags (
          filters: { tagId: { eq: "${params.tag}" } }
        ) {
          data {
            attributes {
              name
              tagId
              posts {
                data {
                  attributes {
                    title
                    slug
                    excerpt
                    publishedAt
                    cover {
                        data {
                            attributes {
                                url
                            }
                        }
                    }
                    tags {
                        data {
                            attributes {
                                tagId
                                name
                            }
                        }
                    }
                  }
                }
              }
            }
          }
        }
      }
    `,
  });

  return {
    props: {
      tagData: data.tags.data[0],
    },
  };
}
Enter fullscreen mode Exit fullscreen mode

And with that out of the way you will display the results in a similar manner as on the homepage:

export default function Tag({ tagData }) {
  return (
    <section className="my-8 mx-4">
      <h2 className="font-mono text-black text-xl md:text-4xl text-center mb-8">
        Articles with &quot;{tagData.attributes.name}&quot; tag
      </h2>
      <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 ">
        {tagData.attributes.posts.data.map((post) => (
          <BlogPostPreview key={post.attributes.slug} post={post} />
        ))}
      </div>
    </section>
  );
}
Enter fullscreen mode Exit fullscreen mode

Most of your work is already done, but you have one more thing to do - hook up this newly created page with Tags on the BlogPostPreview. Adjust components/BlogPostPreview.jsx - instead of a blank <a href=”#”> use the following next/link:

<div className="px-6 pt-4 pb-2">
        {post.attributes.tags.data.map((tag) => (
          <Link
            href={`/tag/${tag.attributes.tagId}`}
            key={tag.attributes.tagId}
          >
            <a>
              <span className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">
                {tag.attributes.name}
              </span>
            </a>
          </Link>
        ))}
      </div>
Enter fullscreen mode Exit fullscreen mode

Now rebuild your app and open it in dev mode:

yarn build
yarn dev
Enter fullscreen mode Exit fullscreen mode

Open your blog and click on any Tag. It should open a list of blog posts with this tag:

Blog-5-2.png

Last thing to do is to make this change live on Netlify. Commit all of your changes and push it to GitHub. Netlify will rebuild your app and in a few minutes you’ll be able to use your new feature online. Well done!

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (3)

Collapse
 
anastasiia_xfr profile image
Anastasiia_Berest

Is it tagId is UID with default title field?

Collapse
 
hwlkdev profile image
Michał Hawełka

This is how it looks in my case:
Image description

Is this the answer to your question? 😅

Collapse
 
anastasiia_xfr profile image
Anastasiia_Berest

Yes, thanks

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay