EmDashでデザイン・フォーム・SEOを作り直す手順|移行後の仕上げ

連載「WordPressからEmDashへ移行する」の第4回です。第3回で記事を取り込んだサイトを、本番に切り替える前に、元のWordPressと同じ水準まで仕上げます。直すのは、見た目、URL、お問い合わせフォーム、画像の重さ、SEOの5つです。

WordPressのテーマやプラグインの機能は、EmDashには移りません。移らなかったものを1つずつ見つけて、代わりを用意する作業です。

コードの変更はすべてClaude Code(パソコンの中でコマンドを打ったりファイルを書き換えたりしてくれるAI)に頼みました。人が操作したのは、フォームの作成、ロボット判定のキーの設定、送信テストだけです。

✅ この記事で解決できること

  • 移行した記事のボックスの色が消える理由と、直し方がわかる
  • WordPressと同じURLのまま表示できるようにする方法がわかる
  • Contact Form 7の代わりに、EmDash公式のFormsプラグインでお問い合わせフォームを作れる
  • エラーなしで画像が縮小されていない落とし穴に気づける
  • GA・OGP・サイトマップなど、SEOの点検項目がわかる
  • 所要時間:デザインの作り直しは約1時間半(Claude Codeの作業)。フォームとSEOは記録なし

🎯 こんな人に最適です

  • 第3回までで、WordPressの記事をEmDashに取り込んだ人
  • WordPressのテーマやプラグインで作っていた機能を、移行後どうするか迷っている人
  • コードの変更をAI(Claude Code)に任せながら進めたい人

🔧 必要な環境・前提

  • EmDash 1.4.0(第2回で立ち上げ、第3回で記事を取り込んだもの)
  • Formsプラグイン @emdash-cms/plugin-forms 0.2.12
  • Cloudflare Workers Paid(第3回で切り替え)
  • Claude Code(コードの変更役)
  • 検証日:2026年10月30〜31日

⚠️ 先に第3回までを済ませてください

記事の取り込みがまだの人は、先に 第3回「WordPressの記事をEmDashに移す手順」 を済ませてください。この回の作業は、本番のドメインを切り替える前に、仮アドレス(workers.dev)のサイトで行います。

📋 作業全体の流れ

  • 手順1:デザインを作り直す
  • 手順2:記事のボックスとURLを元に戻す
  • 手順3:お問い合わせフォームを作る
  • 手順4:ロボット判定(Turnstile)を設定して、ページに入れる
  • 手順5:送信テストをする
  • 手順6:カード画像を軽くする
  • 手順7:GA・OGP・サイトマップを点検する
移行で消えたものと、作り直したものの対応表(デザイン、ボックスの色、URL、フォーム、SEO、画像の重さ)

この記事で出てくる言葉

言葉意味
スラッグURLの末尾の部分(例:/claude-freee-invoice/ の claude-freee-invoice)
転送(リダイレクト)古いURLに来た人を、新しいURLに自動で案内すること
プラグインあとから足す機能。EmDashにも公式のプラグインがある
TurnstileCloudflareのロボット判定。「私はロボットではありません」の代わりになる
キャッシュ一度作った表示を取っておき、使い回すしくみ
OGPSNSで共有したときに出る画像やタイトル
canonical「このページの正式なURLはこれ」と検索エンジンに伝える印
noindex「このページは検索結果に出さないで」という印
サイトマップ検索エンジン向けのページの一覧

手順1:デザインを作り直す

第2回で選んだテンプレート(サイトのひな形)は、黒が基調の英語のブログでした。これを土台に、今のサイトのスクショを見本にして、Claude Codeに作り直してもらいました。WordPressのテーマのファイルは使っていません。

筆者がClaude Codeに伝えた方針を、頼み方の形にすると次のようになります(実際に打った文そのものではありません)。

今のサイトのスクショを見本に、テンプレートを白基調・青のデザインに作り直して。メニュー・トップ・カテゴリー一覧はコードで固定して、記事の中身からは変えられないようにして
💡
ポイント:メニュー・トップページ・カテゴリー一覧は、管理画面の中身ではなくコード(サイトのプログラムのファイル)で固定しました。あとでAIがMCPで記事を書いても、サイトの骨組みは変わりません。参考にした動画で「AIが壊せない部分」と言っていたのは、この部分です。

できあがったのは、次のような作りです。

  • 共通:白が基調で青(#0065DE)。ロゴと6項目のメニュー、グレーのフッター。スマホではメニューを折りたたみます。
  • トップ:背景画像と検索ボックス、サイトの考え方、カテゴリー3つ、新着マニュアル9件
  • 記事ページ:白いカードと右のサイドバー(検索、最近の投稿、カテゴリー)
  • カテゴリー・タグ・記事一覧:カードの3列表示
  • 検索ページと「見つかりません」のページを日本語にしました。
  • テンプレートにあった読了時間やダークモードの切り替えは消しました。
作り直したトップページ。白と青のメニュー、手書きフローチャートの背景に「マニュアルちゃん」と検索ボックス
トップページのカテゴリー3つ(アイコン付き)と、新着マニュアルのカード

Claude Codeの作業は約1時間半でした。人の操作はありません。

手順2:記事のボックスとURLを元に戻す

手順2-1:ボックスの色と枠を戻す

第3回で見つかったとおり、取り込んだ記事の「✅ この記事で解決できること」などのボックスは、文章は残っているのに、色と枠が消えていました。

💡
ポイント:EmDashは安全のため、記事の中のHTMLから style(色や枠の指定)を消して表示します。マニュアルちゃんのボックスは、WordPressの「カスタムHTML」ブロックに style を直接書いて作っていました。ただし、データの中には style が残っていました。

そこで、記事のHTMLを表示する部品を作り直してもらいました。style だけは残し、スクリプトなどの危険なものは、これまでどおり消します。表の罫線も消えていたので、EmDashの表の部品に合わせて見た目の設定(CSS)を足しました。

作り直した記事ページ。「この記事で解決できること」などのボックスが元の色で表示され、右にサイドバー
記事の中の表。罫線が表示されている

手順2-2:URLをWordPressと同じにする

テンプレートの記事のURLは /posts/記事名 でした。WordPressは /記事名/ です。このままだと、検索結果やSNSに残っている古いURLが「見つかりません」になります。

  • /記事名/ で記事を表示するページを作りました。
  • /posts/記事名 に来た人は、/記事名/ に転送します。
  • あとで、コンテンツタイプ(記事の種類)の設定にあるURLの形も /posts/{slug} から /{slug}/ に直しました。こうしないと、サイトマップやMCPが返すURLが古い形のままになります。

手順2-3:日本語のURLを表示できるようにする

お問い合わせページと、日本語のタグ62件が「見つかりません」になりました。

💡
ポイント:WordPressは日本語のスラッグを %e3%81%8a… のような形に変換して保存していて、EmDashにもその形のまま取り込まれました。一方、ブラウザからは日本語に戻ったURLで届くので、一致しません。両方の形で探すようにして解決しました。お問い合わせページは、スラッグ自体も「お問い合わせ」に直しました。

手順2-4:古いURLを全部確かめる

旧サイトのURL 129件(投稿32、固定ページ3、カテゴリー4、タグ90)を、新しいサイトで1件ずつ開いてもらいました。結果は、129件すべて表示できました。

なお、出し直した(デプロイした)直後に、古い表示や「見つかりません」が残ることがありました。Cloudflareのキャッシュが原因で、数分で直りました。

手順3:お問い合わせフォームを作る

旧サイトは、WordPressのプラグイン「Contact Form 7」でフォームを作っていました。EmDashには中身が移らず、本文に [contact-form-7 …] という文字がそのまま残りました。

調べると、EmDash公式の「Formsプラグイン」がありました。管理画面でフォームを作れて、送信内容は管理画面に保存されます。ロボット判定(Turnstile)と通知メールにも対応しています。自分で作るのをやめて、これを使いました。

💡
ポイント:WordPressのプラグインの機能は、EmDashには移りません。代わりを探すときは、まずEmDash公式のプラグインがないかを調べるのが近道です。

手順3-1:プラグインを入れる(Claude Code)

Claude Codeが次の作業をしました。

npm install @emdash-cms/plugin-forms
  • 設定ファイル astro.config.mjs のプラグインの欄に、formsPlugin({ defaultSpamProtection: "turnstile" }) を足しました。スパム対策の初期値を、Turnstileにする設定です。
  • フォーム用の見た目を読み込み、送信ボタンを旧サイトと同じ青にしました。
  • 出し直しました(デプロイ)。

手順3-2:管理画面でフォームを作る

ここからは人が操作します。管理画面は英語表示です。

  1. 左メニューの「プラグイン」の下に「Forms」と「Submissions」が増えています。「Forms」を開きます。
  2. 「No forms yet」と表示されます。右上の「New Form」を押します。
管理画面の「Forms」。「No forms yet」と右上の「New Form」ボタン。左メニューの下に Forms と Submissions
  1. 「Name」に「お問い合わせ」、「Slug」に「contact」を入れます。
  2. 「Add Field」で項目を足します。
「New Form」の画面。Name「お問い合わせ」、Slug「contact」、Fields と「Add Field」、下に Settings(Spam Protection の初期値は Honeypot)

作った項目は4つです。

  • 氏名(text、必須)
  • メールアドレス(email、必須)
  • 題名(text、必須)
  • メッセージ本文(textarea、任意)
項目を入力した状態。メールアドレス、題名、メッセージ本文と、下の Settings と「Create Form」ボタン
  1. 「Create Form」を押します。
  2. 一覧に「お問い合わせ / contact / active」と表示されれば完成です。
Forms の一覧に「お問い合わせ」「contact」「active」、送信0件

Settingsの初期値は英語(「Thank you for your submission.」「Submit」)です。筆者は最終的に、送信ボタンを「送信」に、完了メッセージを「お問い合わせありがとうございます。内容を確認のうえ、ご連絡いたします。」にしました。

手順4:ロボット判定(Turnstile)を設定して、ページに入れる

⚠️ キーを入れるまで、送信は必ず失敗します

スパム対策をTurnstileにすると、キーを入れるまでは送信が必ず失敗します(「Turnstile is not configured」)。フォームを作ったら、続けてキーを設定してください。

手順4-1:Cloudflareでウィジェットを作る

  1. Cloudflareのダッシュボード(管理画面)で「Application security」→「Turnstile」を開きます。
  2. 「Add widget manually」と「Set up with Spin」(AIに任せる新しい機能)の2つが出ます。筆者は「Add widget manually」でウィジェットを作りました。
  3. 作ると、サイトキーとシークレットキーが表示されます。
Cloudflare の「Turnstile widgets」の画面。右上に「Add widget manually」と「Set up with Spin」

手順4-2:EmDashにキーを入れる

  1. EmDashの管理画面で、「管理者」→「プラグイン」を開きます。
  2. emdash-formsの設定を開きます。
  3. 「Turnstile Site Key」と「Turnstile Secret Key」に、手順4-1のキーを入れます。
  4. 「設定を保存」を押します。
「emdash-formsの設定」の画面。Turnstile Site Key と Turnstile Secret Key の入力欄(入力前の空の状態)と「設定を保存」ボタン

⚠️ キーは貼らない

シークレットキーは秘密の値です。AIとのチャットやブログ、スクショに載せないでください。筆者も、キーは自分で管理画面に入力しました。

手順4-3:お問い合わせページにフォームを入れて公開する

  1. 管理画面で「Pages」→「お問い合わせ」を開きます。
  2. 本文で「/」を入力してコマンドを出し、「Form」を選びます。
  3. 「Formを挿入」の画面で「お問い合わせ」を選び、「Insert」を押します。
お問い合わせページの編集画面に「Formを挿入」のダイアログ。Form で「お問い合わせ」を選び、「Insert」ボタン
  1. 本文にFormのブロックが入ります。
  2. 右上の「今すぐ公開」を押します。
💡
ポイント:「保存済み」と出ても、右の「公開」欄が「下書き版 / この版はサイトに表示されていません」のままでした。EmDashの固定ページは、保存しただけでは公開されません。「今すぐ公開」を押してください。
Form ブロックが入ったお問い合わせページ。上に「保存済み」と「今すぐ公開」、右の公開欄は「下書き版 / この版はサイトに表示されていません」

手順5:送信テストをする

手順5-1:AIが操作するブラウザでは送れない

最初に、Claudeが操作するアプリ内のブラウザ(自動で操作するブラウザ)でテストしました。Turnstileが「検証に失敗しました」になり、送信すると「Something went wrong. Please try again.」と出ました。管理画面に保存された件数は0件のままです。

自動操作のブラウザでの送信テスト。Turnstile が「検証に失敗しました」、下に「Something went wrong. Please try again.」
💡
ポイント:これは故障ではありません。ロボット判定が正しく働いている証拠です。最後の送信テストは、人が普段のブラウザで行ってください。

手順5-2:普段のブラウザで送る

  1. 普段使っているブラウザで、お問い合わせページを開きます。
  2. 項目を入れて「送信」を押します。
  3. Turnstileに「成功しました!」、その下に「お問い合わせありがとうございます。…」と表示されれば成功です。
送信に成功したお問い合わせページ。Turnstile に「成功しました!」、下に緑の「お問い合わせありがとうございます。内容を確認のうえ、ご連絡いたします。」

送信の内容は、管理画面の「Submissions」に保存されていました。

通知メール(送信があったときに自分に届くメール)は、この時点では設定できませんでした。Forms 0.2.12の管理画面には、通知先を入れる欄がありません。また、メールを送るしくみ(Cloudflare Email Sending)も必要です。第5回で、ドメインを切り替えるときに設定しました。それまでは「Submissions」で確認します。

手順6:カード画像を軽くする

トップや記事一覧のカード画像が、元の大きさのまま届いていました。最大で幅1600px、1枚約1MBです。画像を小さく表示する指定(width={480})を書いても、縮小されていませんでした。

原因は2つありました。どちらもClaude Codeが直しました。

  • 原因1:EmDashの画像の部品は、幅と高さの両方がわからないと縮小しません。WordPressから来たアイキャッチには、高さの情報がありませんでした。高さ(height={270}、16:9)を足しました。
  • 原因2:縮小してよい画像のアドレスの一覧(image.remotePatterns)が空でした。
💡
ポイント:EmDashは、サイトのURLが組み立てのときにわかっている場合だけ、この一覧を自動で作ります。この時点では、パスキーの都合でサイトのURLを設定していませんでした(第2回の注意)。そのため一覧が空になり、すべて「縮小しない」扱いになっていました。エラーは何も出ないので、気づきにくい落とし穴です。

設定ファイル astro.config.mjs に、仮アドレスと本番のアドレスの2つを手で足しました。範囲は、EmDashの画像の置き場所(/_emdash/api/media/file/)だけに限っています。

image: {
  remotePatterns: ["<Worker名>.<名前>.workers.dev", "manual-chang.com"].map((hostname) => ({
    protocol: "https",
    hostname,
    pathname: "/_emdash/api/media/file/**",
  })),
},

結果、トップの9枚の合計は、2.76MBから84KBになりました(約33分の1)。形式もWebP(軽い画像の形式)になりました。初回だけ縮小した画像を作るので少し遅いですが、2回目からはキャッシュで速くなります。

縮小は、Cloudflare Imagesの「変換」として数えられます。無料枠は月5,000種類なので、記事が約35本なら余裕があります。

手順7:GA・OGP・サイトマップを点検する

最後に、Claude CodeにSEOまわりを点検してもらいました。見つかったことと、直したことは次のとおりです。

項目見つかったこと直したこと
Googleアナリティクス旧サイトはSite Kit(WordPressのプラグイン)がタグを出していた。新サイトには無かった同じタグを、manual-chang.comで表示されたときだけ出す(テストでの閲覧を数えないため)
Search ConsoleSite Kitがファイルやメタタグで所有者を確認していた。WordPressをやめると確認が切れる第5回で、DNSを使う「ドメイン」方式で確認し直した
説明文SEO PACKの説明文が移っていない。32記事のうち、SEO PACKの説明文あり8本、抜粋あり10本、どちらも無し14本8本をEmDashのSEO欄に入れた。説明文が無い記事は、本文の冒頭120字を使う
OGP・canonical記事は出ていた。トップにはcanonicalとog:urlが無かったcanonicalが無いページは、そのページのURLをcanonicalにする
サイトマップ中のURLが /posts/〇〇 の古い形。旧 /feed/ と /wp-sitemap.xml は「見つかりません」URLの形を直した。/feed/ は /rss.xml、/wp-sitemap.xml は /sitemap.xml に転送
仮アドレスworkers.devのサイトが検索に拾われると、同じ内容が2つになるmanual-chang.com以外では noindex, nofollow にする
※旧トップ用の固定ページ「home」も noindex にした

直したあと、説明文、検索エンジン向けの設定、canonical、転送、サイトマップ(記事32件と固定ページ2件)を確かめました。旧URL 129件も、すべて表示できるままでした。

うまくいかないときは

症状原因対処
移行した記事のボックスの色・枠が消えるEmDashがHTMLのstyleを消して表示する表示用の部品で、styleだけ残す(危険なものは消したまま)
記事のURLが /posts/記事名 になるテンプレートの初期設定/記事名/ のページを作り、/posts/ は転送。コンテンツタイプのURLの形も /{slug}/ に
日本語URLのページやタグが「見つかりません」WordPressで変換されたスラッグのまま取り込まれた両方の形で探す。スラッグを日本語に直す
本文に [contact-form-7 …] の文字が出るWordPressのプラグインの機能は移らないEmDash公式のFormsプラグインで作り直す
フォームの送信が必ず失敗するTurnstileのキーが入っていないFormsの設定に、サイトキーとシークレットキーを入れる
ページにフォームを入れたのに表示されない「保存」だけで、下書き版のまま右上の「今すぐ公開」を押す
AIが操作するブラウザで「検証に失敗しました」ロボット判定が正しく働いている送信テストは、人が普段のブラウザで行う
カード画像が重い(縮小されない)高さの情報が無い。縮小してよいアドレスの一覧が空高さを指定し、image.remotePatterns にサイトのアドレスを足す
※エラーは出ないので、画像の大きさを実際に測って確かめる
出し直した直後に古い表示や「見つかりません」Cloudflareのキャッシュ数分待つ

まとめ

  • WordPressのテーマやプラグインの機能は移りません。移らなかったものを見つけて、1つずつ代わりを用意します。
  • メニューやトップページはコードで固定すると、AIが記事を書いても骨組みが崩れません。
  • 移行した記事のボックスは、styleを残す表示用の部品で元の色に戻せます。
  • URLはWordPressと同じ /記事名/ にそろえ、古いURLを全部開いて確かめます。
  • お問い合わせフォームは、EmDash公式のFormsプラグインとTurnstileで作れます。送信テストは人が普段のブラウザで行います。
  • 画像が縮小されていなくてもエラーは出ません。実際の大きさを測って確かめます。

この回の終わりの時点で、仮アドレスのサイトは、見た目・URL・フォーム・SEOまで元のWordPressと同じ水準になりました。本番のmanual-chang.comは、まだ古いWordPressのままです。

次回は、第5回「ドメインをCloudflareに切り替える手順|EmDash移行の仕上げ」です。ネームサーバーの変更、パスキーの登録し直し、フォームの通知メールの設定を扱います。

連載の他の回

この記事を書いた人

hiroshi