Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WordPressで Headlessフロントエンド / kansaiwp-meetup-20...
Search
Hidetaka Okamoto
November 22, 2020
Programming
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WordPressで Headlessフロントエンド / kansaiwp-meetup-202011
Hidetaka Okamoto
November 22, 2020
More Decks by Hidetaka Okamoto
See All by Hidetaka Okamoto
OpenAI APIで API Changelogを要約してみた話 / chatgpt-osaka-1
hideokamoto
0
730
コミュニティ運営から 中の人に変わって感じたこと
hideokamoto
0
150
Developerが Developer Advocateになった話 / dev-rel-meetup-tokyo-71
hideokamoto
0
400
Jamstack開発者のための App Runner入門
hideokamoto
1
560
WordPressでの webサイト制作2022 / ngk2022s
hideokamoto
0
500
JavaScript(TypeScript)で メディアサイトを インフラから構築する方法 / jsconf-jp-2021
hideokamoto
2
4.4k
AWS上でStripeを利用したアプリをより安全にデプロイする方法 /jaws-pankration-2021
hideokamoto
1
250
Shifter Headlessと Headless WordPressの紹介
hideokamoto
0
2.2k
Stripe & Next.js + AWS Amplify で会員 + 定期課金機能 / JP_Stripes20210903
hideokamoto
7
3.3k
Other Decks in Programming
See All in Programming
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
200
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
350
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
400
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
190
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
30
14k
setup-vp GitLab対応の裏側
naokihaba
0
140
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
260
すこし踏み込む CancellationToken
htkym
2
1.5k
一人だけ、Kiroが静止する日
hideg
0
140
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
270
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
510
The Invisible Side of Design
smashingmag
301
52k
Speed Design
sergeychernyshev
33
2.1k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing for humans not robots
tammielis
254
26k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Why Our Code Smells
bkeepers
PRO
340
58k
Producing Creativity
orderedlist
PRO
348
41k
Optimising Largest Contentful Paint
csswizardry
37
4k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Chasing Engaging Ingredients in Design
codingconduct
0
340
Transcript
WordPressͰ HeadlessϑϩϯτΤϯυ Kansai WordPress Meetup 2020/11 Okamoto Hidetaka #WPmeetupOsaka
TL;DR • webαΠτදࣔํ๏SSR / SPA / SSGͷ3ͭ • SEO /
Մ༻ੑॏࢹͳΒSSG • Paywall / ձһઐ༻ίϯςϯπͳͲSPA • ύϑΥʔϚϯεͱߋ৽ͷఱṝ࣍ୈͰSSR #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
“Why Headlessʁ”ҎԼͷεϥΠυ https://speakerdeck.com/hideokamoto/shifter-meetup-202011 #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
Headless = ֎͔ΒWPͷσʔλΛऔಘ͢Δ • HTTP(S) APIΛར༻ͯ͠ɺ֎෦͔ΒWPͷσʔλΛऔಘ • REST API /
GraphQL API / XMLRPC APIͷ3ͭ • XMLRPC APIͷ͜ͱΕ·͠ΐ͏ • REST API: ͍ΘΏΔWP API • GraphQL: WP GraphQL ϓϥάΠϯʢ࠷͍ۙͭʹv1ϦϦʔεʣ #WPmeetupOsaka
WP API • WPίΞ͕ఏڙ͢ΔREST API • GET͍͍ͩͨೝূͳ͠ͰOK • HookͰΧελϚΠζՄೳ •
ΧελϜϑΟʔϧυͳͲͷ֦ு ϓϥάΠϯ͔HookͰରԠ https://developer.wordpress.org/rest-api/reference/ #WPmeetupOsaka
WP GraphQL • ϓϥάΠϯͱͯ͠Πϯετʔϧ • WordPressͷσʔλΛGraphQLͰ • HookϓϥάΠϯͰ֦ுՄೳ • ഁյతมߋ͕ଟ͔ͬͨͷͰ
v0࣌ͷهࣄʹཁҙ https://wordpress.org/plugins/wp-graphql/ #WPmeetupOsaka
REST API or GraphQL • ໔ڐऔಘલ͔ΒϨʔγϯάΧʔʹΔඞཁͳ͍ • γϯϓϧͳBlog / websiteͳΒREST
APIͰ͍͍ͩͨࣄΓΔ • ΧελϜߘ / ϑΟʔϧυͳͲ͕૿͑ͯ͘ΔͱɺGraphQLݕ౼ର • REST APIΛ3ͭ4ͭಉ࣌ʹୟ͔ͳ͍ͱ͍͚ͳ͍ or HookͰΧελϜ͠·͘Βͳ͍ͱ͍͚ͳ͍ͳΒGraphQLͷग़൪ • ࠷ऴతʹHTTPͰGET(REST)͔POST(GraphQL)͢ΔͷʹมΘΓͳ͠ʢWebSocketͷ͜ͱ͍ͬͨΜΕΖʣ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S ingle P age A pplication • ࠷ۙͷWebΞϓϦʹଟ͍ • AjaxͰσʔλΛऔಘͯ͠දࣔ
• νϡʔτϦΞϧೖॻ ͍͍ͩͨ͜ΕΛ࡞Δ͜ͱ͕ଟ͍ https://ja.reactjs.org/ #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
SPAͰWebαΠτΛ࡞Δ • ೖ͍͢͠ • ॻ੶ͳͲͷϦιʔεଟΊ • શ෦ϑϩϯτͰ࣮ߦͳͷͰ ൺֱతγϯϓϧʹ࡞ΕΔ • CapacitorͳͲͰiOS
/ AndroidରԠ ϝϦοτ • SEO / OGPͰҰखؒඞཁ • ϧʔςΟϯά͋Δఔࣗલ࣮ • First Meaningful Paint͕Ί • ίʔυׂ͠ͳ͍ͱ JSͷಡΈࠐΈαΠζ͕ංେ͕ͪ͠ σϝϦοτ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S tatic S ite G enerator • JekyllHugoͳͲ • දࣔ͢ΔHTMLΛࣄલʹੜ͢Δ
• MovableTypeͷGenerate͍ۙ • FW / Tool͕܈༤ׂڌঢ়ଶ Vue / React + Ruby / Go / etc… https://jamstack.org/generators/ #WPmeetupOsaka
ReactͰͷSSG 2TOP: Next.js / Gatsby
SSGͰWebαΠτΛ࡞Δ • ࣄલʹHTMLΛϏϧυ͢ΔͷͰɺ ද͕ࣔ͘ͳΓ͍͢ • WP / DBʹো͕ى͖ͯɺ webαΠτμϯ͠ͳ͍ •
αʔόʔ͕҆Ձ • FWͷػೳ / API͕๛ ϝϦοτ • Ϗϧυ͠ͳ͍ͱެ։Ͱ͖ͳ͍ • ϖʔδʹൺྫ͢ΔϏϧυ࣌ؒ • FWͷґଘ͕ڧ͘ͳΓ͕ͪ • Ϗϧυͷσόοά͕গ͠େม σϝϦοτ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S erver S ide R endering • WordPressςʔϚͱಉ͡ख๏ • HTMLඳըͳͷͰɺ
ϏϧυΛͭඞཁͳ͠ • αʔόʔଆඳըͳͷͰɺ SEO / OGPͷෆ҆ͳ͠ • WPಛԽFW “Frontity”ͷଘࡏ https://frontity.org/ #WPmeetupOsaka
FrontityͰ WebαΠτ # ΞϓϦͷηοτΞοϓ $ npx frontity create my-app $
cd my-app # ϩʔΧϧͰͷςεταΠτ্ཱͪ͛ $ npx frontity dev -> http://localhost:3000 # σΟϨΫτϦߏ $ tree my-app/ |__ node_modules/ |__ package.json |__ frontity.settings.js |__ favicon.ico |__ packages/ |__ mars-theme/ • جຊతͳૢ࡞CLI͚ͩ • —themeͰςʔϚ͕બΔ • —typescriptαϙʔτ #WPmeetupOsaka
FrontityͰ WebαΠτ "name": "frontity-example", "state": { "frontity": { "url": "https://test.frontity.io",
"title": "WordPress Theme Unittest", "description": "Frontity example site using WordPress Theme Unittest posts" } }, "packages": [ { "name": "@frontity/mars-theme", "state": { "theme": { "menu": [ [ “Home", “/“ ], [ "Edge Case Category”, “/category/edge-case-2/“ ], [ “About”, “/about/“ ] ], "featured": { "showOnList": false, "showOnPost": false } } } }, { "name": "@frontity/wp-source", "state": { "source": { "api": "https://test.frontity.io/wp-json" } } }, • frontity.config.jsͰઃఆ • WPςʔϚͷΑ͏ʹ ίʔυΛ৮Βͤͳ͍ ΧελϚΠζํ๏ • ςʔϚͷࣗ࡞ / ެ։Մೳ #WPmeetupOsaka
S erver S ide R endering • WordPressςʔϚͱಉ͡ख๏ • HTMLඳըͳͷͰɺ
ϏϧυΛͭඞཁͳ͠ • αʔόʔଆඳըͳͷͰɺ SEO / OGPͷෆ҆ͳ͠ • WPಛԽFW “Frontity”ͷଘࡏ https://frontity.org/ #WPmeetupOsaka
FrontityͰ WebαΠτ • VercelHerokuͳͲʹ ެ։ • Node.js͕ಈ͘ඞཁ͋Γ • WPͷαʔόʔʹಉډ https://frontity.org/
SSRͰWebαΠτΛ࡞Δ • SSGͱSPAͷܽΛิ͑Δ • SEO / OGP / HeaderͳͲͷग़ྗ •
ϏϧυʹΑΔެ։·Ͱͷϥά • Ruby / Go / PythonͳͲͰՄೳ ϝϦοτ • ʮWordPressςʔϚͰΑ͘Ͷʁʯ • WPಉ༷ࣄނΕനը໘ͷHTTP500 • ϑϩϯτͷJS + αʔόʔͷJSͷ ೋॏཧ͕ൃੜ͠͏Δ σϝϦοτ #WPmeetupOsaka
SPA / SSG / SSR͓͞Β͍ 41" 44( 443 )5.-ඳը ϒϥβ্
Ϗϧυ࣌ ʢ$*ϩʔΧϧͳͲʣ αʔόʔ্ '8ͳͲ *POJD3FBDU $SFBUF3FBDU"QQ /FYUKT (BUTCZ 'SPOUJUZ XJUI81ͷ αΠτߏங ʮͬͯΈͨʯهࣄ ॻ੶ͳͲΛࢀߟʹ '8ͷνϡʔτϦΞϧ Λࢀߟʹ '8ͷνϡʔτϦΞϧ Λࢀߟʹ ͍͍ͯΔέʔε 8FCΞϓϦ ձһ͚αΠτ ϒϩάϙʔτϑΥϦΦ -1ΩϟϯϖʔϯαΠτ ͦΕҎ֎ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby.js • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
ReactͰͷSSG 2TOP: Next.js / Gatsby
ReactͰͷSSG 2TOP: Next.js / Gatsby /FYUKT (BUTCZ 3FOEFSJOH 44(443 44(
3PVUJOH OFYUSPVUFS !SFBDISPVUFS 0⒏DJBM )PTUJOH 7FSDFM (BUTCZ$MPVE %BUB 3FRVFTU 3&45"1*(SBQI2- (SBQI2-
Next.js / Gatsbyݸਓతൺֱ • σʔλͷऔಘ͕ࣗલ࣮ • SSRซ༻Ͱެ։·ͰͷϥάΛॖ • SSGߴԽ3rd partyґଘ
• SSRՄೳɻ෯͑͘Δ Next.js • ϓϥάΠϯͰ؆୯σʔλऔಘ • ϏϧυඞਢͳͷͰެ։ʹϥά༗ • ࠩϏϧυʹΑΔϏϧυߴԽ • SSGʹಛԽ Gatsby #WPmeetupOsaka
Next.js / Gatsbyʹڞ௨͍ͯ͠Δ͜ͱ ࣗࣾαʔϏε͋Γ͖ͷ ػೳ͕ͨ·ʹؚ·ΕΔ ͍͍ͦͯͩͨ͠୭͔ʹʮNetlify൛ʯΛޙൃͰग़͞ΕΔ #WPmeetupOsaka
Next.jsͱGatsbyͷσʔλऔಘ export const getStaticPaths = async () => { const
posts = await fetcher(url) return { paths: posts.map(post => ({ params: { id: post.id, slug: decodeURI(post.slug) } })), fallback: false } } export const pageQuery = graphql` query SinglePost($slug: String) { wordpressPost(slug: { eq: $slug }) { id slug title content } } ` Next.js Gatsby #WPmeetupOsaka
ࣗͰࢼͯ͠Έ͍ͨਓShifterϒϩά https://www.getshifter.io/ja/blog/category/integration-ja/ #WPmeetupOsaka
SSGͷϏϧυԆ • GatsbyʮࠩͷΈϏϧυ͢Δํ๏ʯΛϕʔλϦϦʔε Incremental Builds: https://www.gatsbyjs.com/blog/2020-04-22-announcing-incremental-builds/ • Next.jsʮͳ͍ͳΒͦͷͰSSG / SSR͠Α͏ʯͱ͍͏ൃ
Fallback mode: https://nextjs.org/docs/basic-features/data-fetching#fallback-true • Next.js͞ΒʹʮఆظతʹཪଆͰSSG͠ͳ͓ͦ͏ʯͱߟ͍͑ͯΔ Incremental Static Regeneration: https://nextjs.org/docs/basic-features/data-fetching#incremental-static-regeneration • GatsbyϏϧυΛߴԽɺNext.jsSSRతൃΛซ༻ͯ͠ߴԽ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby.js • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
ಠࣗλάͷ࡞ / ར༻ͰϚʔΫΞοϓͷڞ௨Խ … <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body <?php
body_class(); ?> <div class="jumbotron"> <h1>Hello, world!</h1> <p> <a class="btn btn-primary btn-lg” role="button">Learn more</a> </p> </div> <div class="row"> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> </div> import React from 'react'; import { Jumbotron, Button, Row, Col } from 'reactstrap'; export const App: FC = () => ( <> <Jumbotron> <h1>Hello, world!</h1> <p className=“lead”> <Button color="primary">Learn More</Button> </p> </Jumbotron> <Row> <Col md={1}>.col</Col> </Row> </> ) WordPress Theme React (Reactstrap) #WPmeetupOsaka
ެ։͞Ε͍ͯΔUIϑϨʔϜϫʔΫͷಋೖ / ެ։ • Bootstrap / Material Design / Foundation
/ etc.. • ଟ͘ͷCSSϑϨʔϜϫʔΫ͍͍ͩͨReactnize͞Εͨͷ͕͋Δ • reactstrap / material-ui / react-foundation / etc.. • Ionic FrameworkͷΑ͏ʹReact / Angular / VueΛԣஅͰ͖Δͷ • AWS NorthstarͷΑ͏ʹɺ σβΠϯΨΠυϥΠϯΛϥΠϒϥϦԽͯ͠γΣΞ͕Ͱ͖Δ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
σʔλͱ ϑϩϯτͷ • HeadlessԽ͢Δ͜ͱͰɺ CMSґଘগͷϑϩϯτ͕࡞ΕΔ • GatsbySource PluginͰ ෳdata source͕ར༻Մೳ
• dataʹґଘ͠ͳ͍ϑϩϯτٕज़ ͱͯ͠ͷJavaScript https://www.gatsbyjs.com/plugins?=source #WPmeetupOsaka
TL;DR • Headlessʹ͢Δ͜ͱͰɺ ͞·͟·ͳํ๏ / ݴޠ / FWͰαΠτ͕࡞ΕΔ • ReactΛ͏߹ɺNext.js
/ GatsbyͳͲΛ͏ͷ͕ ͍·ͷͱ͜ΖఆੴԽͭͭ͋͠Δ • WordPress͚ͩͰαΠτΛ։ൃ / ӡ༻͍ͯ͠ͳ͍߹ʹɺ ڥʹґଘ͠ͳ͍Headless͕׆͖͍͢ #WPmeetupOsaka