Josh Lind
Build it to be explored, the value is the flexibility. Don't get obsolete.
Josh is located at Seattle, WA
Suggest relevant content based on category tags.
exports.createSchemaCustomization = ({ actions, schema }) => {
actions.createTypes([
schema.buildObjectType({
interfaces: ["Node"],
name: "SanityPost",
fields: {
relatedPosts: {
type: "[SanityPost]",
resolve: async (source, args, context, info) => {
const categories = source._rawDataCategories
? source._rawDataCategories.map((c) => c._ref)
: [];
if (!categories.length) return [];
const posts = await context.nodeModel.runQuery({
query: {
filter: {
categories: {
elemMatch: {
_id: { in: categories },
},
},
// exclude current node
_id: { ne: source._id },
},
sort: {
fields: ["publishedAt"],
order: ["DESC"],
},
// no way to limit results in runQuery
// see: https://github.com/gatsbyjs/gatsby/issues/15453
},
type: "SanityPost",
});
return posts && posts.length > 0 ? posts : [];
},
},
},
})
]);
};
You may already be generating category pages (listing posts referencing a given category tag). But the other side can be tricky.
Then be sure to put relatedPosts
into your page query as if it was another field (with subfields of course).
NOTE: You must use _rawDataCategories
in your query to get the id
via _ref
otherwise it’s that reference is a hash instead.
Credit to for plenty of this solution, though it needed some updates... https://nimblewebdeveloper.com/blog/gatsby-generate-related-posts-at-build-time
Build it to be explored, the value is the flexibility. Don't get obsolete.