šŸ‘‹ Next.js Conf 2024: Come build, party, run, and connect with us! See all events

Querying categories and posts in Sanity.io using GROQ

7 replies
Last updated: Jun 10, 2021
Hi! First project w/ Sanity and since it seemed easiest (because it was the example in the tutorial šŸ¤·ā€ā™€ļø) and I thought I could modify it later I chose Blog as a template.I'm doing a site where I'm going to display different categories of handicrafts - with name/title and an image (used Post to set up this).
I've added all the different categories in Category and connected each post to the correct category.
My question is, is it possible to query on category, and how do I do that?
Jun 10, 2021, 8:42 AM
What exactly do you want to do? Do you want to get all categories and their posts? In GROQ that would be this query
*[ _type == "category"]{ ..., "posts": *[_type=="post" && references(^._id ) }
This gets every category, and for each category it gets every
post
that references that category. This is done using the
^
parent-operator ( https://www.sanity.io/docs/groq-operators#3715ad969fce ) and the
references
-function ( https://www.sanity.io/docs/groq-functions#5759ed6ff047 ).
Jun 10, 2021, 9:26 AM
I will have links to each category and when I click a specific link I want to query and see all posts for that category. For example this one:
Jun 10, 2021, 9:34 AM
Do note that this query will also include drafts unless you explicitly exclude them with
&& !(_id in path("drafts.*"))
inside the filter-component (
[ ]
). Path: https://www.sanity.io/docs/groq-functions#0ecd1b7eac78 In:
https://www.sanity.io/docs/groq-operators#c06332116311 filter:
https://www.sanity.io/docs/how-queries-work#e9a260f5e979
Jun 10, 2021, 9:34 AM
In that case the first query seems like it should match. It can be extended with
*[ _type == "category" && _id == $id]{ ..., "posts": *[_type=="post" && references(^._id ) }
and you pass in the
_id
of the category you want to find all posts for in order to only get the relevant data for that category.
A simpler version could be:

*[ _type=="post" && references($id)]
depending on if you need any information on the given category this could be extended to

*[ _type=="post" && references($id)]{..., category-> }
dereference:
https://www.sanity.io/docs/groq-operators#dae298fc7952
Jun 10, 2021, 9:38 AM
Thank you! Will try it out šŸ™ƒ
Jun 10, 2021, 9:39 AM
docs on parameters that I used: https://www.sanity.io/docs/groq-parameters
Jun 10, 2021, 9:40 AM
Good luck šŸ˜„
Jun 10, 2021, 9:40 AM

Sanityā€“ build remarkable experiences at scale

Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Was this answer helpful?