WordPress ACF Pro 移行手順(メニュー・バナー編集UI最適化)¶
本手順は Issue
24「ACF有料版への移行と編集UI最適化+Storefront連携」に対応する。ヘッダー/フッターメニューを ACF¶
Pro のリピーター+クローン構造に統合し、Storefront から GraphQL で安全に取得できるようにする。
前提・入力ファイル¶
- 正本スキーマ:
apps/wordpress-local/themes/ritsubi-cms/acf-json/field-groups.json(バックアップしてから更新) - 参照ドメイン: WordPress(WPGraphQL + ACF Pro)
- 目的: 編集UIの一元化と Storefront のナビゲーション/バナー連携の安定化
リポジトリ配置とマウント¶
- Git 管理の正本:
apps/wordpress-local/themes/ritsubi-cms/acf-json/*.json - ローカル/コンテナの WordPress では
apps/wordpress-local/themesをwp-content/themesにマウントするため、Local JSON は正本へ直接保存される。 - スキーマは
apps/wordpress-local/themes/ritsubi-cms/acf-json/のみを正本とし、他の場所にコピーを作らない。
スキーマ更新手順(ACF Local JSON)¶
- 正本JSON(
apps/wordpress-local/themes/ritsubi-cms/acf-json/*.json)を編集する。 git status/git diffで JSON の差分を確認し、不要ファイルがないことをレビューする。- 必要に応じて ACF > ツール > インポート で同一ファイルを適用する。
手順¶
- ライセンス適用
- WordPress 管理画面 → Custom Fields > ライセンス に ACF Pro キーを入力。
- コード管理の場合は
wp-config.phpにdefine('ACF_PRO_KEY', '***');を追加(環境変数運用でも可)。 - 現行スキーマのバックアップ
- 管理画面 → ACF > ツール > エクスポート で JSON を取得し、リポジトリに一時保存してからインポートを実施。
- 新スキーマのインポート
- 分割管理に移行済みのため、
apps/wordpress-local/themes/ritsubi-cms/acf-json/field-groups.jsonを管理画面の ACF > ツール > インポート で適用(必要に応じて他の分割ファイルとマージしても可)。 - 適用後、ヘッダー/フッターのオプションページに以下が反映されていることを確認。
- display_type に
text_blockが追加されている(フッター用テキストカラム) - display_type=
staticのときのみ「リンクタイプ/ページ/ストア内パス/カスタムURL/子メニュー」が表示される - display_type=
text_blockのときのみ「テキスト本文(body)」が表示される(リッチテキスト・basicツールバー)
- display_type に
-
データ分離:
options-pages.jsonでヘッダー/フッターの post_id をheader_menu_options/footer_menu_optionsに設定済み。WP同期後、ヘッダー編集がフッターに上書きされないことを確認する。 -
GraphQL 連携確認
- WPGraphQL Playground で以下を実行し、エラーがないことを確認。
query HeaderFooterMenu {
headerMenu {
items {
label
description
displayType
linkType
storePath
customUrl
openInNewTab
dynamicSourceKey
body
page {
slug
uri
}
children {
label
description
displayType
linkType
storePath
customUrl
openInNewTab
dynamicSourceKey
body
page {
slug
uri
}
}
}
}
footerMenu {
items {
label
description
displayType
linkType
storePath
customUrl
openInNewTab
dynamicSourceKey
body
page {
slug
uri
}
children {
label
displayType
linkType
storePath
customUrl
openInNewTab
dynamicSourceKey
body
page {
slug
uri
}
}
}
}
}
- Storefront 側スモーク
.envでWORDPRESS_GRAPHQL_ENDPOINTが指す環境を起動した状態で以下を実行:pnpm --filter ritsubi-storefront test -- src/lib/cms/wordpress/menus.test.ts- 必要に応じてホームページを開き、ヘッダー/フッターのメニューがCMS値に置き換わることを確認。
変更サマリー(ACF)¶
- ヘッダー/フッターメニュー
- 表示タイプ:
static/collection/text_block(デフォルト static) - 動的ソースキー: display_type=
collectionのとき必須。Vendure Collection の slug を入力(例:series-xxx)。Storefront 側で slug によってコレクション一覧を取得。 - 静的リンク用:
linkType(store_path/page/custom_url) + 各入力フィールド(display_type=static のときのみ表示) - 子メニュー: display_type=static のときのみ表示。display_type=collection の場合は入力不可&Storefront 側でも無視。
- テキストブロック: display_type=
text_blockのときbodyを入力(リッチテキスト)。フッターでのみ使用され、ヘッダーでは無視される。 - UI最適化: 親・子リピーターとも
collapsed=ラベル、rows_per_page=10、layout=row - メインバナー(既存)
- オプションページ
MainBannerOptions > homeHero.slidesは既存のまま。CPT ベースの旧メインバナーは UI から利用しない。 - 共通ACF部品
- CTAセット/リンクセット/メディアセット/表示期間/トラッキング/オーバーレイ/ソート順を「共通部品」カテゴリとして追加。再利用するブロックはこれらをクローンで利用する。
フッターメニュー設定手順(text_block対応)¶
- WP管理画面 → ストア設定 > フッターメニュー を開く
- 行を追加し、以下いずれかを選択
static/collection:リンクカラム(第1階層がカラム見出し、第2階層がリンク)staticのときlinkTypeを選択し、必要に応じてstorePath/page/customUrlを入力- 子リンクは「子メニュー」で追加(2階層まで)
text_block:テキストカラム(フッター専用)bodyにリッチテキスト(基本タグのみ)。箇条書きもここで入力可能。
- 並び順はドラッグで変更できる(第1階層の並びがカラム順になる)
- 保存後、WPGraphQL Playground で以下を実行し、エラーなく値が返ることを確認:
footerMenu {
items {
label
displayType
body
notes { text }
children { label href:storePath }
}
}
- Storefront で表示確認し、未設定の場合は従来のデフォルトフッターにフォールバックすることを確認する
Storefront マッピング¶
- 取得ロジック:
apps/storefront/src/lib/cms/wordpress/menus.tsのfetchMenus()がHeaderFooterMenuクエリを呼び出し、NavigationItem[]に正規化 - 適用先:
Headerコンポーネントは CMS メニューを優先し、未取得時は従来のハードコードにフォールバックFooterコンポーネントは第1階層をカラム見出しとして扱い、第2階層リンクを表示。display_type=text_blockの項目はテキストカラムとしてレンダリングし、未設定時は従来の固定リンクを使用- 動的メニュー:
dynamicSource = { type: 'collection', key }のみを許容。keyが未入力の場合は/collectionsを表示。子メニューは生成しない。
運用メモ¶
- フィールドキー・名前は変更せず、追加のみを行っているため既存データは保持される。不要になった旧メインバナーCPTは非表示運用とする。
- ACF インポート前後で WPGraphQL のキャッシュが残る場合、
wp graphql clear-cacheなどでクリアしてから再取得する。