Гэтсби выбирает пользовательские типы сообщений WordPress и создает страницы

#reactjs #wordpress #gatsby

Вопрос:

Я прочитал документацию и попробовал несколько учебных пособий, но я застрял на выборе пользовательских типов сообщений с помощью GatsbyJS.

Я попробовал несколько подходов, но ни один из них не работает так, как ожидалось. Я всегда получаю 404.

Это часть фрагмента, который я использую, который отлично работает со страницами и сообщениями, но не с пользовательским типом сообщений. Страницы проектов должны быть созданы в подпапке/пути проекта. Например: example.com/project/my-first-project

Та часть, которая gatsby-node.js выглядит так:

 const createSinglePages = async ({ posts, gatsbyUtilities }) =>
  Promise.all(
    posts.map(({ previous, post, next }) =>
      // createPage is an action passed to createPages
      // See https://www.gatsbyjs.com/docs/actions#createPage for more info
      gatsbyUtilities.actions.createPage({
        // Use the WordPress uri as the Gatsby page path
        // This is a good idea so that internal links and menus work 👍
        path: post.uri,

        // use the blog post template as the page component
        component: path.resolve(
          `./src/templates/${post.__typename.replace(`Wp`, ``)}.js`
        ),

        // `context` is available in the template as a prop and
        // as a variable in GraphQL.
        context: {
          // we need to add the post id here
          // so our blog post template knows which blog post
          // the current page is (when you open it in a browser)
          id: post.id,

          // We also use the next and previous id's to query them and add links!
          previousPostId: previous ? previous.id : null,
          nextPostId: next ? next.id : null,
        },
      })
    )
  );
 

В src/template/project.js файл выглядит так:

 import React from "react";
import { Link, graphql } from "gatsby";
import Image from "gatsby-image";
import parse from "html-react-parser";

import Layout from "../components/Layout";
import Seo from "../components/Seo";

const ProjectTemplate = ({ data: { post } }) => {
  const featuredImage = {
    fluid: post.featuredImage?.node?.localFile?.childImageSharp?.fluid,
    alt: post.featuredImage?.node?.alt || ``,
  };

  return (
    <Layout>
      <Seo title={post.title} description={post.excerpt} />

      <article
        className="blog-post"
        itemScope
        itemType="http://schema.org/Article"
      >
        <header>
          <h1 itemProp="headline">{parse(post.title)}</h1>
          <p>{post.date}</p>

          {/* if we have a featured image for this post let's display it */}
          {featuredImage?.fluid amp;amp; (
            <Image
              fluid={featuredImage.fluid}
              alt={featuredImage.alt}
              style={{ marginBottom: 50 }}
            />
          )}
        </header>

        {!!post.content amp;amp; (
          <section itemProp="articleBody">{parse(post.content)}</section>
        )}
      </article>
    </Layout>
  );
};

export default ProjectTemplate;

export const pageQuery = graphql`
  query ProjectById(
    # these variables are passed in via createPage.pageContext in gatsby-node.js
    $id: String!
  ) {
    # selecting the current post by id
    post: wpProject(id: { eq: $id }) {
      id
      content
      title
      date(formatString: "MMMM DD, YYYY")
      featuredImage {
        node {
          altText
          localFile {
            childImageSharp {
              fluid(maxWidth: 1000, quality: 100) {
                ...GatsbyImageSharpFluid_tracedSVG
              }
            }
          }
        }
      }
    }
  }
`;
 

API Gatsby автоматически создает подпапку, или мне нужно где-то определить это для каждого типа записи?

Любая помощь будет признательна!

Комментарии:

1. Что вы имеете в виду под «вложенной папкой»?

2. Я имею в виду Подпространство. У меня есть пользовательский тип записи с именем project , поэтому я хочу перечислить все проекты в подпространстве, например: expample.com/projects/ и динамически создавать страницы в этом подпространстве.

Ответ №1:

Чтобы использовать пользовательские типы записей с WPGraphQL, необходимо настроить тип записи на show_in_graphql, используя следующее поле:

show_in_graphql : верно

При регистрации нового пользовательского типа записи Это пример регистрации нового типа post_type «docs» и включения поддержки GraphQL.

 add_action( 'init', function() {
   register_post_type( 'docs', [
      'show_ui' => true,
      'labels'  => [
        //@see https://developer.wordpress.org/themes/functionality/internationalization/
        'menu_name' => __( 'Docs', 'your-textdomain' ),
      ],
      'show_in_graphql' => true,
      'hierarchical' => true,
      'graphql_single_name' => 'document',
      'graphql_plural_name' => 'documents',
   ] );
} );
 

Ответ №2:

Вы определяете «подпапку» под путем field в:

   gatsbyUtilities.actions.createPage({
        path: post.uri,
            component: path.resolve(
          `./src/templates/${post.__typename.replace(`Wp`, ``)}.js`
        ),

        context: {
          id: post.id,
          previousPostId: previous ? previous.id : null,
          nextPostId: next ? next.id : null,
        },
      })
 

Вам просто нужно сделать что-то вроде:

 path: `projects/${post.id}`
 

Проверьте косые черты и завершающие косые черты здесь.

Вы можете заменить cna projects для своего динамического типа проекта, если вы получите эту информацию для более автоматического подхода (при условии, что это так post.__typename ).