You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建无头WordPress+Gatsby站点:获取页面数据函数报错问题

问题解决与优化方案

1. 先修复当前代码错误

你遇到的no-unused-expressions错误,是因为箭头函数内部的模板字符串没有被返回——箭头函数如果用大括号包裹代码块,必须显式写return语句。另外,字符串拼接可以用模板字符串的插值语法简化,不用手动+拼接。修复后的代码如下:

const GetPage = {
  graphql: ({ id }) => {
    return `query GetPage {
        pages(where: {id: ${id}}) {
          edges {
            node {
              title
              content
              featuredImage {
                node {
                  uri
                }
              }
            }
          }
        }
    }`
  }
}

或者省略大括号,让箭头函数自动返回表达式:

const GetPage = {
  graphql: ({ id }) => `query GetPage {
        pages(where: {id: ${id}}) {
          edges {
            node {
              title
              content
              featuredImage {
                node {
                  uri
                }
              }
            }
          }
        }
    }`
}

2. 你的实现思路可以优化,并非最优方案

在Gatsby+无头WordPress的架构中,通常不会单独封装这样的查询字符串生成函数,而是结合Gatsby的查询机制来处理:

场景一:静态页面查询(固定id的页面)

如果是固定id的页面,直接在页面组件中使用pageQuery或者useStaticQuery,Gatsby会在构建时自动执行查询并注入数据:

// 页面组件中
import { graphql } from "gatsby"

export const query = graphql`
  query GetPage {
    pages(where: {id: 1}) {
      edges {
        node {
          title
          content
          featuredImage {
            node {
              uri
            }
          }
        }
      }
    }
  }
`

const PageComponent = ({ data }) => {
  const page = data.pages.edges[0].node
  return (
    <div>
      <h1>{page.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: page.content }} />
    </div>
  )
}

export default PageComponent

场景二:动态生成页面(根据不同id生成多个页面)

如果需要根据WordPress中的多个页面动态生成Gatsby页面,应该在gatsby-node.js中使用createPage API,结合查询获取所有页面的id,再为每个页面生成路由:

// gatsby-node.js
exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions

  // 查询所有WordPress页面
  const result = await graphql(`
    query AllPages {
      pages {
        edges {
          node {
            id
            slug
          }
        }
      }
    }
  `)

  // 为每个页面生成路由
  result.data.pages.edges.forEach(({ node }) => {
    createPage({
      path: `/page/${node.slug}`,
      component: require.resolve("./src/templates/page-template.js"),
      context: {
        id: node.id,
      },
    })
  })
}

然后在页面模板page-template.js中,通过pageQuery接收context中的id参数:

// src/templates/page-template.js
import { graphql } from "gatsby"

export const query = graphql`
  query GetPageById($id: String!) {
    pages(where: {id: $id}) {
      edges {
        node {
          title
          content
          featuredImage {
            node {
              uri
            }
          }
        }
      }
    }
  }
`

const PageTemplate = ({ data }) => {
  const page = data.pages.edges[0].node
  return (
    <div>
      <h1>{page.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: page.content }} />
    </div>
  )
}

export default PageTemplate

这种方式更贴合Gatsby的构建流程,能充分利用Gatsby的静态生成优势,比单独封装查询字符串函数更高效、更符合框架规范。

内容的提问来源于stack exchange,提问作者Emrys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:27:45