无头WordPress中如何通过GraphQL按分类获取相关文章?
问题排查与修复方案
核心问题分析
你的过滤逻辑存在两个关键错误:
filter回调里用了map,map始终返回数组(哪怕是空数组,在布尔判断里也会被视为true),导致所有文章都会被保留,完全起不到过滤作用。- 没有排除当前文章本身,最终会把当前文章也混入相关文章列表。
另外还有个潜在问题:你只取了当前文章的第一个分类(edges[0]),如果文章属于多个分类,会丢失其他分类的匹配可能。
修复后的代码
情况1:仅匹配当前文章的第一个分类
// 获取当前文章第一个分类名称 const postCategory = post.categories.edges[0].node.name; // 过滤同分类且排除当前文章的内容 const relatedPosts = posts.filter((currentPost) => { // 跳过当前文章本身 if (currentPost.id === post.id) return false; // 检查当前文章是否包含目标分类 return currentPost.categories.edges.some(edge => edge.node.name === postCategory); });
情况2:匹配当前文章的所有分类(更合理)
如果文章属于多个分类,想要匹配其中任意一个分类的文章:
// 获取当前文章的所有分类名称 const postCategories = post.categories.edges.map(edge => edge.node.name); // 过滤同分类且排除当前文章的内容 const relatedPosts = posts.filter((currentPost) => { if (currentPost.id === post.id) return false; // 检查当前文章是否有任意一个分类在目标列表中 return currentPost.categories.edges.some(edge => postCategories.includes(edge.node.name)); });
额外调试建议
- 用
console.log(post.categories, posts)打印数据结构,确认edges数组不为空、字段名称(比如name、id)和你获取的一致,避免因数据层级或字段错误导致逻辑失效。 - 优先用分类ID而非名称做匹配(GraphQL查询时可以请求
node.id),ID是唯一标识,比名称更可靠,也能避免重名分类的干扰。
内容的提问来源于stack exchange,提问作者Kasia Strzempek
相关产品推荐
相关产品推荐

