React中使用WPGraphQL获取排除当前文章的相关文章
回答
WPGraphQL原生支持该需求,无需额外修改后端接口逻辑,只需要给posts字段添加查询过滤参数即可。
你当前的查询没有传入过滤规则,会返回指定分类下的全部文章,包含当前正在浏览的文章。只需要在posts字段的where参数中添加notIn规则,传入要排除的当前文章ID,接口返回时就会自动过滤掉对应文章。
可用查询示例
推荐用变量传参,不要硬编码ID值,方便在不同文章页复用:
query GetRelatedPosts($categoryId: Int!, $currentPostId: Int!) { category(idType: DATABASE_ID, id: $categoryId) { posts( first: 10 # 按需设置返回的相关文章数量 where: { notIn: [$currentPostId] # 排除当前文章 orderby: { field: DATE, order: DESC } # 按发布时间倒序,可按需修改排序规则 } ) { edges { node { id title # 可按需追加摘要、特色图、链接等需要的字段 } } } } }
参数说明
$categoryId:当前文章所属分类的数据库ID,和你原有查询中传入的分类ID逻辑一致$currentPostId:当前浏览文章的数字类型数据库ID,WPGraphQL识别到notIn参数后,会自动映射为WordPress原生WP_Query的post__not_in规则完成过滤,不需要额外处理。
扩展场景
如果当前文章同时归属多个分类,你可以直接从posts根入口查询,传入多个分类ID获取跨分类的相关文章,排除逻辑完全一致:
query GetMultiCategoryRelatedPosts($categoryIds: [Int!]!, $currentPostId: Int!) { posts( first: 10 where: { categoryIn: $categoryIds notIn: [$currentPostId] orderby: { field: DATE, order: DESC } } ) { edges { node { id title } } } }
注意:
notIn参数仅接受纯数字格式的WordPress数据库ID,如果你拿到的是WPGraphQL返回的编码后全局Relay ID(类似cG9zdDoxMjM=格式的长字符串),需要先解码提取出数字ID再传入,否则过滤规则不会生效。
内容的提问来源于stack exchange,提问作者Devbuddy
相关产品推荐
相关产品推荐

