Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

僕が考える 「HTML サイトを WordPress にする」話 / 2023-11-05 K...

Toro_Unit (Hiroshi Urabe)
November 05, 2023
7.3k

僕が考える 「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
Tweet

More Decks by Toro_Unit (Hiroshi Urabe)

Transcript

  1. $ whoami Toro_Unit / 占部 紘 Frontend & WordPress Engineer

    Github: @torounit Twitter: @Toro_Unit 2
  2. WordCamp Tokyo 2015 での懇親会での一幕 登場人物 キタジマタカシ: Snow Monkey 等のテーマ作者。この頃は Snow

    Monkey を作 っていない、受託案件をいかに効率良くするか?ということでテーマ開発をし ていたり色々模索してたころ。 ハムさん (´ ºムº `): 札幌で、主に HTML/CSS をやったり、WordPress とか MT とかいろんな CMS でのサイト実装をしていたり。 7
  3. (´ ºムº `):HTML / CSS / JS を完成させる -> WordPress

    に組み込む! 自分、キタジマ:「HTMLから作るのマジで無駄じゃないですか?」 (´ ºムº `): !!!!!???????? なんかめちゃくちゃびっくりされた。 8
  4. 自分の感想 手戻りめちゃくちゃ多くね ????? それだと WordPress の HTML とかに合わせるの辛くね????? エディタースタイルどうするんだ????? まぁまぁそうはいっても色んな事情あるしなー。

    WordPress 開発する前に HTML でプレビューしたいとかあるらしいし。 案件次第、チームのスキル次第かねぇ。 とは言っても俺は _s とかそういうのベースに作り続けるけど。。。。 10
  5. 結局 テーマ開発のレールは未整備、みんな好き勝手やってる。 でもなんかデフォルトテーマを見てるとお作法とかはありそう。 alignleft / aligncenter / alignright だけしてればいいわけじゃ無い。ちゃんと WYSIWYG

    に対応させるの無理。任意の class を付ける方法は、TinyMCE のカ スタマイズ。 div タグは書けるけどビジュアルエディタモードでは存在が見えない。 14
  6. WordPressではHTMLをコントロールするのは結局難しい the_category など、よく出てくる テンプレートタグは、HTML をまとめて吐き 出すが、既に存在する HTML に合わせるのが難しいので使用できない。 get_terms 等で独自実装。

    ナビゲーションメニュー、ウィジェットなど、WordPress 側が吐き出す HTML を改変するコストが高い or 不可能なため、カスタムフィールド等で謎の機能が 増える。 WordPress の機能を使い倒そうとすればするほどこの問題が重い。 その結果、カスタムフィールドでの対処が増える。 16
  7. 現在の開発フロー 1. 初期状態の WordPress を用意 2. _s をコピー / create

    block theme で empty テーマを作成 3. Theme Unit Test Data を import 4. CSSとブロックスタイルの追加 / ブロックの開発 / theme.json の設定など 5. 固定ページなどでコンテンツを作成 20
  8. 「HTML サイトを WordPress にする」ってどういうこと? なんとなくわかるけど、具体的にどういうことだろう。 WordPress テーマ の機能とは、「WordPress サイトの見た目を変更する」 つまり、「HTML

    サイトを WordPress にする」 ということは「WordPress テーマ をつくること」とは違う。 「静的サイトを WordPress を用いて、ユーザーが記事を追加したり更新で きるようにする」 ということとここでは定義する。 23
  9. 「静的サイトを WordPress を用いて、ユーザーが記事を追加したり更新で きるようにする」 「WordPress でサイトを作ること」では無く、 「静的サイトに WordPress の 機能を後付けしたい」

    ということだ僕は考える。 思考、設計の主体はあくまでも HTML/CSS で作ったサイト。 静的サイトを作り、それを WordPress に適用するというのは、そういうワーク フローになっている。 24
  10. 問題点 WordPress は静的な HTML と混在させて使うことを想定して作られていない。 WordPress の "サイト URL" 配下のコンテンツは、WordPress

    が管理。 特定のディレクトリだけ WordPress にするとかも不可能では無いが、共通部分 の管理、js の管理の方法等の違い等でソースコードの共通化は困難。 解決策 WordPress から API でデータを引っ張ってきてそれを表示する。そもそもAPIは外部 のサービス、システムと連携させるためのもの。 26
  11. 具体的な実装 HTML サイトを 静的サイトジェネレーター(SSG)作成し、WordPress と連携さ せる HTML サイトを作ってからそれに後付けするので、何らかの方法で CMS で追

    加された記事を生成する必要がある。 別に SSG じゃなくても良いけど、現代の技術だと一番お手軽。 WordPress から API で記事を取得して、SSGで HTML を生成。 他の方法としては、アプリケーションフレームワークを用いたりとかだけど実 装コスト高い。 27
  12. 既存の 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
  13. 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
  14. 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
  15. HTML に WordPress に後付けできた。 WordPress が記事閲覧時に動作しないので、動的な処理は出来ない。フォーム等 は、form.run / Formspree /

    SSGForm / Google Form 等の外部サービスを利用したり するのが簡単。 WordPress の一部の機能だけを使いたい、ということであればこれはこれで1つの方 法。 34
  16. デプロイしてみる ここでは、Cloudflare Pages にデプロイしてみる。 1. Github に レポジトリを作ってそこに Push 2.

    Cloudflare Pages で レポジトリを選択 3. ビルドコマンドの設定。プリセットで Astro を選べばやってくれる。自前で設 定するなら、 npm run build をビルドコマンドに設定して、生成されるディ レクトリをデプロイディレクトリに指定すればOK。 36
  17. 37

  18. デプロイ方法、記事の更新方法 Cloudflare Pages / Vercel / Netlify などの Jamstack のホスティングを利用。

    Github Actions を用いてレンタルサーバーにデプロイしても良い。 WordPress の 記事更新時に Webhook を叩いて更新。 WordPress.com の無料ホスティングも利用できる。 39
  19. 何のために CMS 導入するの? 「WordPressを導入する」が目的化していませんか? 変更とかをいちいち依頼してもらう前提なら、本当に必要? 誰のために、どんな課題を解決するために WordPress 導入するの? 全部静的にして、お客さんからの依頼で更新してもいいんですよ。 WordPress

    は全てのページを WYSIWYG で編集出来るように、メニューも管理 画面から変更出来るような設計になっているCMS。中途半端に使うと、実装が 大変な割にユーザーが結局更新してくれないという本末転倒なことに。 43