Share
Embed
僕が考える 「HTML サイトを WordPress にする」話 / 2023-11-05 Kansai WordPress Meetup
Kansai WordPress Meetup@大阪『 WordCamp Tokyo 2023 をみんなで振り返る+α (https://www.meetup.com/ja-JP/kansai-wordpress-meetup/events/296857054/) 登壇資料です。
Toro_Unit (Hiroshi Urabe)
November 05, 2023
Transcript
47 slides
-
僕が考える 「HTML サイトを WordPress にする」話 Toro_Unit / 2023.11.05 @ Kansai
WordPress Meetup 1 -
$ whoami Toro_Unit / 占部 紘 Frontend & WordPress Engineer
Github: @torounit Twitter: @Toro_Unit 2 -
Contributions WordPress / Gutenberg Team Shinshu WordPress Meetup WordCamp Tokyo
2023 Speaker WordCamp Kansai 2024 Organizer Team 3 -
長野県松本市からきました Shinshu WordPress Meetup 毎回ピザ食ってます。 11/18 @松本 Wikimedia Commons/File:File:130608_Matsumoto_Ca stle_Matsumoto_Nagano_pref_Japan02bs4
.jpg Author:663highland.License:CC2.5 4 -
WordCamp Tokyo 2015 での懇親会での一幕 登場人物 キタジマタカシ: Snow Monkey 等のテーマ作者。この頃は Snow
Monkey を作 っていない、受託案件をいかに効率良くするか?ということでテーマ開発をし ていたり色々模索してたころ。 ハムさん (´ ºムº `): 札幌で、主に HTML/CSS をやったり、WordPress とか MT とかいろんな CMS でのサイト実装をしていたり。 7 -
(´ ºムº `):HTML / CSS / JS を完成させる -> WordPress
に組み込む! 自分、キタジマ:「HTMLから作るのマジで無駄じゃないですか?」 (´ ºムº `): !!!!!???????? なんかめちゃくちゃびっくりされた。 8 -
そして、WordCamp Tokyo 2016 で 「デザイナーが効率よくテーマ作成を進めるに は? デザインから WordPress のテーマ作成のワークフローを見直す」というセッシ ョンやってました。
https://speakerdeck.com/h2ham/dezainagaxiao-lu-yokutemazuo-cheng-wojin- meruniha-dezainkara-wordpress-falsetemazuo-cheng-falsewakuhurowojian-zhi- su 9 -
自分の感想 手戻りめちゃくちゃ多くね ????? それだと WordPress の HTML とかに合わせるの辛くね????? エディタースタイルどうするんだ????? まぁまぁそうはいっても色んな事情あるしなー。
WordPress 開発する前に HTML でプレビューしたいとかあるらしいし。 案件次第、チームのスキル次第かねぇ。 とは言っても俺は _s とかそういうのベースに作り続けるけど。。。。 10 -
結局 テーマ開発のレールは未整備、みんな好き勝手やってる。 でもなんかデフォルトテーマを見てるとお作法とかはありそう。 alignleft / aligncenter / alignright だけしてればいいわけじゃ無い。ちゃんと WYSIWYG
に対応させるの無理。任意の class を付ける方法は、TinyMCE のカ スタマイズ。 div タグは書けるけどビジュアルエディタモードでは存在が見えない。 14 -
WordPressではHTMLをコントロールするのは結局難しい the_category など、よく出てくる テンプレートタグは、HTML をまとめて吐き 出すが、既に存在する HTML に合わせるのが難しいので使用できない。 get_terms 等で独自実装。
ナビゲーションメニュー、ウィジェットなど、WordPress 側が吐き出す HTML を改変するコストが高い or 不可能なため、カスタムフィールド等で謎の機能が 増える。 WordPress の機能を使い倒そうとすればするほどこの問題が重い。 その結果、カスタムフィールドでの対処が増える。 16 -
現在の開発フロー 1. 初期状態の WordPress を用意 2. _s をコピー / create
block theme で empty テーマを作成 3. Theme Unit Test Data を import 4. CSSとブロックスタイルの追加 / ブロックの開発 / theme.json の設定など 5. 固定ページなどでコンテンツを作成 20 -
「HTML サイトを WordPress にする」ってどういうこと? なんとなくわかるけど、具体的にどういうことだろう。 WordPress テーマ の機能とは、「WordPress サイトの見た目を変更する」 つまり、「HTML
サイトを WordPress にする」 ということは「WordPress テーマ をつくること」とは違う。 「静的サイトを WordPress を用いて、ユーザーが記事を追加したり更新で きるようにする」 ということとここでは定義する。 23 -
「静的サイトを WordPress を用いて、ユーザーが記事を追加したり更新で きるようにする」 「WordPress でサイトを作ること」では無く、 「静的サイトに WordPress の 機能を後付けしたい」
ということだ僕は考える。 思考、設計の主体はあくまでも HTML/CSS で作ったサイト。 静的サイトを作り、それを WordPress に適用するというのは、そういうワーク フローになっている。 24 -
問題点 WordPress は静的な HTML と混在させて使うことを想定して作られていない。 WordPress の "サイト URL" 配下のコンテンツは、WordPress
が管理。 特定のディレクトリだけ WordPress にするとかも不可能では無いが、共通部分 の管理、js の管理の方法等の違い等でソースコードの共通化は困難。 解決策 WordPress から API でデータを引っ張ってきてそれを表示する。そもそもAPIは外部 のサービス、システムと連携させるためのもの。 26 -
具体的な実装 HTML サイトを 静的サイトジェネレーター(SSG)作成し、WordPress と連携さ せる HTML サイトを作ってからそれに後付けするので、何らかの方法で CMS で追
加された記事を生成する必要がある。 別に SSG じゃなくても良いけど、現代の技術だと一番お手軽。 WordPress から API で記事を取得して、SSGで HTML を生成。 他の方法としては、アプリケーションフレームワークを用いたりとかだけど実 装コスト高い。 27 -
Astro 2022年リリース。現在再注目のフレームワ ーク。 React とかを使わずに普通の HTML っぽい 構文で作れる React とか
Vue とかを部分的に混ぜて使っ たりも出来る 28 -
既存の HTML を Astro に移植する 最初から Astro で作った方が本当は快適ですし効率も良いしパーツの使い回しもしや すいしパフォーマンスも良いです。 1.
HTML ファイルは、src/pages に放り込む。中身は特に弄らない。 2. 拡張子を .astro に変更する。 for filename in *.html; do mv $filename ${filename%.html}.astro; done 3. 画像、CSS、JS 等は、public ディレクトリにつっこむ。 4. <script src="....> 、 <script is:inline src="....> に変更する。 30 -
WP-API で記事を取得して、一覧を表示 index.astro --- const res = await fetch("https://[wp-url]/wp-json/wp/v2/posts?_embed") const
posts = await res.json(); --- <div> { posts.map((post) => ( <article> <a href={`/posts/${post.slug}/`}> <h2 set:html={post.title.rendered} /> </a> <Fragment set:html={post.excerpt.rendered} /> </article> )) } </div> 32 -
WP-API で記事を取得して、個別記事を生成 posts/[slug].astro --- const { slug } = Astro.params;
const res = await fetch(`https://[wp-url]/wp-json/wp/v2/posts?slug=${slug}&_embed`) const [post] = await res.json(); export async function getStaticPaths() { const data = await fetch("https://[wp-url]/news/wp-json/wp/v2/posts?_embed") const posts = await data.json(); return posts.map(({slug}) => ({ params: { slug }, })); } --- <article> <h2 set:html={post.title.rendered} /> <Fragment set:html={post.content.rendered} /> </article> 33 -
HTML に WordPress に後付けできた。 WordPress が記事閲覧時に動作しないので、動的な処理は出来ない。フォーム等 は、form.run / Formspree /
SSGForm / Google Form 等の外部サービスを利用したり するのが簡単。 WordPress の一部の機能だけを使いたい、ということであればこれはこれで1つの方 法。 34 -
デプロイしてみる ここでは、Cloudflare Pages にデプロイしてみる。 1. Github に レポジトリを作ってそこに Push 2.
Cloudflare Pages で レポジトリを選択 3. ビルドコマンドの設定。プリセットで Astro を選べばやってくれる。自前で設 定するなら、 npm run build をビルドコマンドに設定して、生成されるディ レクトリをデプロイディレクトリに指定すればOK。 36 -
デプロイ方法、記事の更新方法 Cloudflare Pages / Vercel / Netlify などの Jamstack のホスティングを利用。
Github Actions を用いてレンタルサーバーにデプロイしても良い。 WordPress の 記事更新時に Webhook を叩いて更新。 WordPress.com の無料ホスティングも利用できる。 39 -
この方法のメリット ほぼ落ちないサイトがローコストに作れる。WordPress が落ちてもサイトは落 ちないし、WordPress 側にアクセスがないので、強力なサーバーが必要ない。 (画像などは WordPress 側のホストから読まれる) CMS は違うかもだけど、「しいたけ占い公式サイト」でも採用されている。
「しいたけ占い公式サイト」を支える技術: https://hori- ryota.com/blog/shiitakeuranai-dev/ 40 -
おわりに まぁこんな方法もあるよ。 自分がつくろうとしているモノをちゃんと理解すること、そしてそれに合致し た設計・技術選定・ワークフローになっているのか?という問いにちゃんと向 き合わないと色々歪む。 HTML を書けない人のために CMS を導入してるのに、HTML を記述させ
たりとか。 ページを追加するのに、テーマファイルを編集する必要があるとか。 42 -
何のために CMS 導入するの? 「WordPressを導入する」が目的化していませんか? 変更とかをいちいち依頼してもらう前提なら、本当に必要? 誰のために、どんな課題を解決するために WordPress 導入するの? 全部静的にして、お客さんからの依頼で更新してもいいんですよ。 WordPress
は全てのページを WYSIWYG で編集出来るように、メニューも管理 画面から変更出来るような設計になっているCMS。中途半端に使うと、実装が 大変な割にユーザーが結局更新してくれないという本末転倒なことに。 43