1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🗂️ Sanity Studioカスタマイズ:Structure Builderで管理画面を「神」階層にする

Posted at

こんにちは😊
株式会社プロドウガ@YushiYamamotoです!
JapanLifeStart.comの開発・運営を担当しながら、React.js・Next.js専門のフリーランスエンジニアとしても活動しています❗️

ヘッドレスCMSの導入でよくある失敗が、「ドキュメントタイプが増えすぎて管理画面がカオスになる」 ことです。
記事、著者、カテゴリ、タグ、SEO設定、サイト設定…これらが全部フラットに並んでいると、編集者は「どこを触ればいいの?」と迷子になってしまいます。

Sanityなら、「Structure Builder」 を使って管理画面のメニュー構造を自由自在にカスタマイズできます。
今回は、デフォルトのリスト表示を卒業し、編集者が感動する使いやすい階層構造を作る方法を解説します。

1. Structure Builder とは? 🏗️

Sanity Studioの左側に表示されるリスト(Structure Tool)の見た目や挙動を定義するAPIです。

デフォルトでは「定義したスキーマタイプがアルファベット順に並ぶだけ」ですが、これを使うと以下のようなことができます。

  • グルーピング: 「ブログ関連」「設定関連」のようにフォルダ分けする。
  • シングルトン: 「サイト設定」のように1つしか存在しないドキュメントを、リストではなく直接編集画面として開く。
  • フィルタリング: 特定の条件(例:自分の書いた記事だけ)でリストを表示する。

2. 基本のセットアップ ⚙️

まずは sanity.config.ts で Structure Builder を有効化(カスタム関数を適用)します。

// sanity.config.ts
import { defineConfig } from 'sanity'
import { structureTool } from 'sanity/structure'
import { schemaTypes } from './schemas'
import { myStructure } from './src/structure' // カスタム設定ファイルを読み込み

export default defineConfig({
  // ...
  plugins: [
    structureTool({
      structure: myStructure, // ここで適用!
    }),
  ],
  schema: {
    types: schemaTypes,
  },
})

次に、設定ファイル src/structure.ts を作成します。


3. 実践!管理画面を整理する3つのテクニック 🧹

① 不要なものを隠してグルーピング

「サイト設定」などの管理系項目と、「記事」などのコンテンツ系項目を分けましょう。

// src/structure.ts
import type { StructureResolver } from 'sanity/structure'

export const myStructure: StructureResolver = (S) =>
  S.list()
    .title('コンテンツ管理') // リストのタイトル
    .items([
      // 1. 通常のコンテンツ(記事、著者など)
      // S.documentTypeListItems() は全タイプを返すので、
      // フィルタで「設定系」を除外して表示します。
      ...S.documentTypeListItems().filter(
        (listItem) => !['siteSettings', 'navigation'].includes(listItem.getId()!)
      ),

      S.divider(), // 区切り線

      // 2. 設定系をフォルダにまとめる
      S.listItem()
        .title('サイト設定')
        .child(
          S.list()
            .title('設定メニュー')
            .items([
              S.documentTypeListItem('navigation').title('ナビゲーション'),
              // 他の設定項目...
            ])
        ),
    ])

これで、左側のメニューがスッキリし、「サイト設定」フォルダの中に細かい設定が入る階層構造になります。

② シングルトン(1枚だけのページ)を作る

「トップページのFV設定」や「SEO共通設定」などは、サイトに1つあれば十分ですよね。
デフォルトだと「新規作成」ボタンが出てしまいますが、これを消して直接編集画面に飛ばすようにします。

// src/structure.ts
export const myStructure: StructureResolver = (S) =>
  S.list()
    .title('コンテンツ')
    .items([
      // ...他の項目
      
      S.listItem()
        .title('共通SEO設定')
        .child(
          S.document() // list() ではなく document() を指定
            .schemaType('siteSettings')
            .documentId('siteSettings') // 固定IDを指定
        ),
    ])

これでクリックすると即座に編集画面が開きます。「あれ?記事一覧どこ?」と迷うことがなくなります。

③ タブ(Views)を追加してプレビューを強化

記事の編集画面に、「編集フォーム」だけでなく「プレビュー」や「SEOチェック」などのタブを追加できます。

// src/structure.ts
import { Iframe } from 'sanity-plugin-iframe-pane' // プラグインが必要

export const getDefaultDocumentNode = (S, { schemaType }) => {
  // 'post' タイプの時だけビューを追加
  if (schemaType === 'post') {
    return S.document().views([
      S.view.form(), // デフォルトの編集フォーム
      
      S.view
        .component(Iframe)
        .options({
          url: 'http://localhost:3000/api/preview', // Next.jsのプレビューURL
        })
        .title('リアルタイムプレビュー'),
    ])
  }
}

これを sanity.config.tsdefaultDocumentNode に渡せば、記事編集画面の上部にタブが出現し、ワンクリックでプレビュー画面に切り替えられます。


4. まとめ:編集者のためのUIを作ろう 🎨

SanityのStructure Builderを使えば、単なるデータ入力画面が、「そのプロジェクト専用のCMS」 に進化します。

  1. グルーピング: 頻繁に更新するものと、たまにしか触らないものを分ける。
  2. シングルトン: 設定項目は「1つだけ」にする。
  3. タブ機能: プレビューや独自ツールを埋め込む。

これらを駆使して、クライアントやチームメンバーが「使いやすい!」と感動する管理画面を構築してみてください。


最後に:業務委託のご相談を承ります

私は業務委託エンジニアとしてWEB制作やシステム開発を請け負っています。最新技術を活用したレスポンシブなWebサイト制作、インタラクティブなアプリケーション開発、API連携など幅広いご要望に対応可能です。

「課題解決に向けた即戦力が欲しい」「高品質なWeb制作を依頼したい」という方は、お気軽にご相談ください。一緒にビジネスの成長を目指しましょう!



👦 在留外国人のためのメディア(JapanLifeStart.com)


👉 ポートフォリオ

────────────────────────────

🚀 エンジニアの方へ:10万円もらえる特別キャンペーン

現在、フリーランスエージェントの 「クラウドワークステック」 が、紹介経由での登録&稼働で「10万円(税込)」がもらえる 異例のキャンペーンを実施中です。

「自分の市場価値(単価)を知りたい」「週3日からの副業・リモート案件を探している」という方は、ぜひこの機会に登録してみてください。

👉 【限定特典付き】10万円キャンペーンに参加する

※キャンペーンは予告なく終了する場合があります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?