在下一個相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相相相相相相相相相相相相相相關相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相

有20分了 有五份文件. A create-next-app 專案取出 WordPress 在 WPGraphQL 上安裝的相關文章, 編輯器仍然擁有每個段落, next build 有固定頁面的船舶 revalidate 隨你怎麼打 就怎麼打 在下行走指向: woographqldemo.wpengine.com 有同樣的六步相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相相接相接相接相相相接相相相相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相

盒子里有啥?

@axistaylor/nextpress 有一副npm相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 它有三塊被你接通到下一個Js 16應用程式:

  • withWCR — — a NextConfig 建立 WP 倒置代碼域和前置的包 /wp-content, /wp-admin/graphql 在下回跑道上
  • <Content> 相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相關相關相相關相關相關相關相關相關相關相關相相相相關相相相關相關相相相相相相相相相相相相相相相相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相
  • nextImageParser 有相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相取相相取相相相相相取相相相取相相相相相取相相相取相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 <img> 在WP內容中: a next/imagewidth, heightsizes 从區塊屬性取出.

后端需要: WordPress with WPGraphQL 相接相通 有活性。 有出自自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自管自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自自 /graphql 有回覆了.


第1步- 下一個應用程式的啟動

股票 create-next-app 有 TypeScript 樣本后再添加 @axistaylor/nextpress 从 npm :

npx create-next-app@latest nextpress-quickstart
cd nextpress-quickstart
npm install @axistaylor/nextpress

第 二 步 — next.config.ts

withWCR 有三個參數:下一個設定、WordPress出自和公開取自。 包裝器重寫了編輯器所撰寫的每一個絕對的 WordPress URL 在前端相關的路由中被連接到后一通路由上 。

next.config.ts
import type { NextConfig } from "next";
import { withWCR } from "@axistaylor/nextpress/withWCR";

const wpDomain = "woographqldemo.wpengine.com";
const wpProtocol = "https";

const nextConfig: NextConfig = {
  images: {
    formats: ["image/avif", "image/webp"],
    remotePatterns: [{ protocol: "https", hostname: wpDomain }],
  },
  env: {
    GRAPHQL_ENDPOINT: `${wpProtocol}://${wpDomain}/graphql`,
  },
};

export default withWCR(
  nextConfig,
  {
    wpDomain,
    wpProtocol,
    wpHomeUrl: `${wpProtocol}://${wpDomain}`,
    wpSiteUrl: `${wpProtocol}://${wpDomain}`,
  },
  {
    frontendDomain: "localhost:3000",
    frontendProtocol: "http",
  },
);

第3步 — src/proxy.ts

下十六個已更名 middleware.tsproxy.ts有出自”相克”一出 有出自”相克”一出 有兩件事: /wp-* 路由 proxyByWCR 因此瀏覽器從不觸碰 WordPress 出處并設定了 x-uri 在每個非相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相當相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相

src/proxy.ts
import { NextResponse, NextRequest } from "next/server";
import { proxyByWCR, isProxiedRoute } from "@axistaylor/nextpress/proxyByWCR";

export const proxy = async (request: NextRequest) => {
  const pathname = request.nextUrl.pathname;

  if (isProxiedRoute(pathname)) {
    return proxyByWCR(request);
  }

  const headers = new Headers(request.headers);
  headers.set("x-uri", pathname);
  return NextResponse.next({ request: { headers } });
};

export const config = {
  matcher: [
    "/atx/:instance/proxiee",
    "/atx/:instance/wp",
    "/atx/:instance/wc",
    "/atx/:instance/wp-internal-assets/:path*",
    "/atx/:instance/wp-assets/:path*",
    "/atx/:instance/wp-json/:path*",
    "/((?!_next|api|favicon.ico|sw.js|.*\\.).*)",
  ],
};

第4步 — src/lib/wp.ts

三相同步函數, 一相共享 fetch 有包. fetchPosts 提供索引頁面, fetchPostBySlug 提供文章頁面, fetchPostSlugs 驱动器 generateStaticParamsnext: { revalidate: 60 } 在提示上 fetch 它是唯一需要的快取控制 :

src/lib/wp.ts
const ENDPOINT = process.env.GRAPHQL_ENDPOINT!;

async function gql<T>(query: string, variables: Record<string, unknown> = {}): Promise<T> {
  const res = await fetch(ENDPOINT, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ query, variables }),
    next: { revalidate: 60 },
  });
  if (!res.ok) throw new Error(`WPGraphQL ${res.status}`);
  const { data, errors } = await res.json();
  if (errors?.length) throw new Error(errors[0].message);
  return data as T;
}

export interface PostSummary {
  slug: string;
  title: string;
  date: string;
  excerpt: string | null;
  featuredImage: { sourceUrl: string; altText: string } | null;
}

export interface Post extends PostSummary {
  content: string;
  contentCssClasses: string;
}

export async function fetchPosts(first = 20): Promise<PostSummary[]> {
  const data = await gql<{ posts: { nodes: PostSummary[] } }>(`
    query Posts($first: Int!) {
      posts(first: $first, where: { status: PUBLISH, orderby: { field: DATE, order: DESC } }) {
        nodes {
          slug title date excerpt
          featuredImage { node { sourceUrl altText } }
        }
      }
    }`, { first });
  return data.posts.nodes;
}

export async function fetchPostSlugs(): Promise<string[]> {
  const data = await gql<{ posts: { nodes: { slug: string }[] } }>(`
    { posts(first: 100, where: { status: PUBLISH }) { nodes { slug } } }`);
  return data.posts.nodes.map(n => n.slug);
}

export async function fetchPostBySlug(slug: string): Promise<Post | null> {
  const data = await gql<{ post: Post | null }>(`
    query Post($slug: ID!) {
      post(id: $slug, idType: SLUG) {
        slug title date excerpt
        content(format: RENDERED)
        contentCssClasses
        featuredImage { node { sourceUrl altText } }
      }
    }`, { slug });
  return data.post;
}

第5步 — /blog 索引

伺服器元件, 一 await有被取走的被取走被取走被取走的被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取走被取去被取走被取走被取走被取回被取回被取回被取回被取回被取回被被取回被被取回被取回被取回被被取回被被被取回被被被被取取取入被被被取入被被被取入被被取入被被被被取取入被被被取入被被被被被取入被取入被被被被被取入被被被被被被被被被被被被取入被被被被被被被被被 相當相當相當相當相當相當相當相當相當相關:

src/app/blog/page.tsx
import Link from "next/link";
import { fetchPosts } from "@/lib/wp";

export const metadata = { title: "Blog" };

export default async function BlogIndex() {
  const posts = await fetchPosts(20);
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.slug}>
          <Link href={`/blog/${post.slug}`}>{post.title}</Link>
          <time>{new Date(post.date).toLocaleDateString()}</time>
        </li>
      ))}
    </ul>
  );
}

第6步 — — /blog/[slug]

generateStaticParams 把所出出的每一條彈道都變成了建築時刻的路由. 有兩行:一行取出一行取出一行取出一行取出一行取出一行取出一行取出一行取出一行取出一行取出一行取出一行取出. <Content>有活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活

src/app/blog/[slug]/page.tsx
import { notFound } from "next/navigation";
import { Content, nextImageParser } from "@axistaylor/nextpress";
import { fetchPostBySlug, fetchPostSlugs } from "@/lib/wp";

export async function generateStaticParams() {
  const slugs = await fetchPostSlugs();
  return slugs.map((slug) => ({ slug }));
}

export default async function PostPage({ params }: {
  params: Promise<{ slug: string }>;
}) {
  const { slug } = await params;
  const post = await fetchPostBySlug(slug);
  if (!post) notFound();

  return (
    <article>
      <h1>{post.title}</h1>
      <Content
        content={post.content}
        contentCssClasses={post.contentCssClasses}
        parsers={[nextImageParser()]}
      />
    </article>
  );
}

有5份文件 有2個領域 有1个npx 編輯器從不動; 送出地層會在下方變更 。

The WordPress block editor on the left and the same content rendered through Next.js on the right — paragraph, heading, and list blocks come across identically with no template duplication.

什么? <Content> 有你做

信箱是一串 WordPress 區塊 HTML 。 就被收起來了 dangerouslySetInnerHTML 但會有三件事被弄丟了 <Content> 處理它們:

  • 將 HTML 分解为回應樹 。<p>, <figure>, <blockquote> 有相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相關相關相關相關相關相關相關相相關相相相相相相相相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 nextImageParser 互換 <img> 为: next/image 有零平分相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相相相去相去相去相去相去相去相去相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相
  • 把每個地區的CSS接通回應 Block- supports inline rules, side.json splette sorders, 插件注入的工作表相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相相相接相相接相接相相相接相相相接相接相相相接相接相相相相相接相相相相相接相接相相相接相相相相相相相相
  • <script type="application/json"> 有活活活活活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活口活 有相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相相關相關相關相關相關相關相關相關相關相關相關相相相相關相關相關相關相關相相相相相關相相相相相關相相相關相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相

下一步

有同6個檔案相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相相接相接相接相接相接相接相接相相相相相接相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 分類和標籤是又一款WPGraphQL wherefetchPosts有同樣的查詢相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 搜索被打中 search 相爭相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相相爭取相爭取相爭取相爭取相相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相爭取相相爭取相爭取相相爭取相爭取相爭取相爭取相爭取相爭取相相爭取相相相相相相相相把相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 /search?q=... 二十分钟后出發

完整來源已開啟 二相相二. 包文件 (多克/下部)如果想取出建築物 就把WordPress放入下一個出品地圖 就快出品了



Leave a Reply

Your email address will not be published. Required fields are marked *