2025年12月14日[日曜日]

カフェメニュー用のカスタム投稿を作る – WordPress実践制作【WPCafe編】

  • 2025/10/29
  • PRACTICE
  • カフェサイトを作ろう
  • 0comments
  • 100views
  • 約26分で読めます
  • 11

前回、headタグの整理とセキュリティ対策でWordPressの不要な機能を無効化し、セキュリティを強化しました。

今回は、カフェサイトの核となる「提供メニュー」を管理するためのカスタム投稿タイプを作成します。コーヒー、フード、デザートなどのメニューを効率的に管理し、柔軟に表示できるようにしましょう。

今回の記事では、カスタム投稿タイプとタクソノミーを作成し、実際にメニューデータを登録するところまでを行います。次回の記事で、登録したメニューを実際にページとして表示する方法を解説します。

なぜカスタム投稿が必要なのか

固定ページでメニューを管理するデメリット

WordPressで情報を管理する方法として、固定ページを使うこともできます。しかし、固定ページには以下のような制限があります。

  • 固定ページでメニューを管理すると、カテゴリー分類やタグ付けなどができません
  • メニューを「ドリンク」「デザート」「前菜」などで分類したり、「ホット」「アイス」「おすすめ」などのタグで絞り込むことができないため、メニュー数が増えると管理が煩雑になります。

標準の投稿ではダメなのか

WordPressには標準で「投稿」という機能がありますが、今回のカフェサイトでは標準の投稿はブログに使用します。

メニュー情報とブログ記事は、データの性質が異なります。メニューには価格やサイズなどの構造化されたデータが必要ですが、ブログ記事にはそれらは不要です。別々に管理することで、それぞれに適した管理画面を用意できます。

カスタム投稿でカフェメニューを管理するメリット

カスタム投稿を使うことで、以下のようなメリットがあります。

  • カテゴリー分類やタグ付けができる:メニューを体系的に管理できる
  • オススメや新作などカスタムタクソノミーで効率よくPRできる:独自の分類軸を持てる
  • 編集者が簡単に更新できる管理画面を作れる:カスタムフィールドと組み合わせることで、専門知識がなくても更新可能な仕組みを構築できる

すべてのコンテンツをダッシュボードで管理する

このカフェサイト制作では、重要な設計思想があります。それは、すべてのコンテンツをダッシュボード(管理画面)で管理するということです。

よくある方法:本文エディタに価格を書く

ブロックエディタ(Gutenberg)の本文に、以下のように価格を書くことができます。

当店自慢のオリジナルブレンドは、厳選した豆を...

【価格】
S: 300円
M: 400円
L: 500円

この方法でも管理画面から編集できますが、以下のような問題があります。

  1. 表記ゆれが発生する:「S:300円」「S:300円」「S 300円」など、編集者によって書き方がバラバラになる
  2. 表示形式の一括変更ができない:「300円」を「¥300」や「300円(税込)」に変更したい場合、全メニューを手作業で修正する必要がある
  3. 価格での並び替えや検索ができない:テキストとして書かれているため、「500円以下のメニュー」のような検索ができない
  4. 入力ミスに気づきにくい:「S: 30円」のような桁の入力ミスがあっても、システムがチェックできない

カスタムフィールドでデータとして管理

SCFを使って、サイズと価格を個別のフィールドとして管理します。

  • サイズ:S / 価格:300
  • サイズ:M / 価格:400
  • サイズ:L / 価格:500

このようにデータとして管理することで、以下のメリットがあります。

  1. 表記が統一される:入力フォームが決まっているので、表記ゆれが起きない
  2. 表示形式を後から一括変更できる:テンプレート側を修正するだけで、全メニューの表示形式を変更できる
  3. データの並び替えや検索が可能:価格順に並べたり、特定の価格帯を検索したりできる
  4. 編集者が迷わず入力できる:「サイズ」「価格」と明確に分かれているので、何を入力すればいいか一目瞭然

これが、カスタム投稿とカスタムフィールドを組み合わせる大きな理由です。

他のサイト制作でも応用できる

今回学ぶカスタム投稿タイプの実装方法は、カフェサイトだけでなく、以下のような様々なサイト制作で応用できます。

  • 飲食店サイト:メニュー、コース料理、店舗情報
  • 不動産サイト:物件情報、エリア情報
  • 採用サイト:求人情報、社員インタビュー
  • ECサイト:商品情報、ブランド情報

カスタム投稿タイプは、WordPressでオリジナルサイトを作る上で必須のスキルです。この記事でしっかりと理解しましょう。

カフェメニューの構想

実装に入る前に、カフェメニューをどのように管理するか設計します。

管理する情報の整理

カフェメニューで管理したい情報を整理します。

基本情報

  • タイトル:メニュー名(例:ブレンド・コーヒー)
  • スラッグ:URL用(例:blend-coffee
  • 本文:メニューの詳細説明
  • 抜粋:短い説明文(一覧表示用)
  • アイキャッチ画像:メニューの写真

分類情報

メニューを以下の3つの軸で分類します。

1. メニューカテゴリー(menu_category)

カスタムタクソノミー(カテゴリー型)で「ドリンク」「デザート」など分類する。基本的に1メニュー1カテゴリー

  • タクソノミー名:「メニューカテゴリー(menu_category)」
  • URLスラッグ:menu/category
  • 階層構造:あり(カテゴリー型)
2. メニュータグ(menu_tag)

カスタムタクソノミー(タグ型)で「ホット」「アイス」「アルコール」などタグ付けする。1メニュー複数タグ可

  • タクソノミー名:「メニュータグ(menu_tag)」
  • URLスラッグ:menu/tag
  • 階層構造:なし(タグ型)
3. おすすめメニュー(menu_recommend)

カスタムタクソノミー(カテゴリー型)で「おすすめ」を管理する。「おすすめ」には「新作」「今月のおすすめ」「店長のおすすめ」など複数パターン用意する。1メニュー複数カテゴリー可

  • タクソノミー名:「おすすめメニュー(menu_recommend)」
  • URLスラッグ:menu/recommend
  • 階層構造:あり(カテゴリー型)

価格情報

  • サイズ別の価格(カスタムフィールド)
    • 例:S 300円、M 400円、L 500円
    • Smart Custom Fields(SCF)を使って、1つのメニューに対して複数の価格を設定できるようにし、主にサイズ別の価格として使う

固定ページの構成

固定ページとしてmenuを用意。menuの下階層にmenu_categorymenu_tagmenu_recommendの固定ページがある。

固定ページとしてmenu
  • メニューカテゴリーの一覧、メニュータグの一覧、おすすめメニューの一覧を表示
menu_category
  • メニューカテゴリーの一覧のみ表示
menu_tag
  • メニュータグの一覧のみ表示
menu_recommend
  • おすすめメニューの一覧のみ表示

URL構造

具体的なURL構造は以下のようになります。

URL説明
https://wpcafe.local/トップページ
https://wpcafe.local/menu/カテゴリー一覧、タグ一覧、おすすめ一覧
https://wpcafe.local/menu/メニュースラッグ/個別メニュー
https://wpcafe.local/menu/category/カテゴリーの一覧
https://wpcafe.local/menu/category/カテゴリースラッグ/特定カテゴリーに属するメニューの一覧
https://wpcafe.local/menu/tag/タグの一覧
https://wpcafe.local/menu/tag/タグスラッグ/特定タグに属するメニューの一覧
https://wpcafe.local/menu/recommend/おすすめの一覧
https://wpcafe.local/menu/recommend/おすすめスラッグ/特定のおすすめに属するメニューの一覧

具体例

例えば、以下のようなURLでアクセスできます。

  • https://wpcafe.local/menu/blend-coffee/ ブレンド・コーヒーの詳細ページ
  • https://wpcafe.local/menu/category/drink/ 飲料カテゴリーのメニュー一覧
  • https://wpcafe.local/menu/tag/hot/ ホットのメニュー一覧
  • https://wpcafe.local/menu/recommend/recommend-new/ 新商品のメニュー一覧

カスタム投稿を作る

ファイルの作成

前回作成したfunctions-theme-reset.phpfunctions-theme-security.phpと同様に、カスタム投稿タイプ用のファイルを作成します。

テーマディレクトリにfunctions-theme-custom.phpを作成してください。

functions.phpで読み込み

functions.phpに以下を追加して、作成したファイルを読み込みます。

functions.php
<?php
// headタグの整理
require_once 'functions-theme-reset.php';

// セキュリティ対策
require_once 'functions-theme-security.php';

// 初期化
require_once 'functions-theme-init.php';

// JS/CSS読み込み
require_once 'functions-theme-load.php';

// カスタム投稿タイプ
require_once 'functions-theme-custom.php';

// コンテンツ関連
require_once 'functions-theme-contents.php';
PHP

カスタム投稿タイプは、コンテンツ関連の前に読み込むようにします。

functions-theme-custom.phpの内容

後に他のカスタム投稿も作るのでfunction化します。

functions-theme-custom.phpに以下のコードを記述します。

functions-theme-custom.php
<?php
/******************************
カスタム投稿
******************************/
add_action('init',function() {

    // カスタム投稿「メニュー」
    set_register_post_type('menu_post', 'メニュー', 'menu','dashicons-food', true);

});

/******************************
タクソノミー
******************************/
add_action('init',function() {

    // メニューのタクソノミー(カテゴリー)
    set_register_taxonomy('tax_menu_category', 'menu_post', 'カテゴリー','menu/category', true);

    // メニューのタクソノミー(タグ)
    set_register_taxonomy('tax_menu_tag', 'menu_post', 'タグ','menu/tag', false);

    // メニューのタクソノミー(おすすめ)
    set_register_taxonomy('tax_menu_recommend', 'menu_post', 'おすすめ','menu/recommend', true);

});

/******************************
register_post_type の共通化
******************************/
function set_register_post_type($post_type, $post_label, $post_slug, $post_icon,$post_public ){

    register_post_type(
        $post_type,
        array(
            'labels' => array(
                'name' => __($post_label),
                'all_items'=> __($post_label.'一覧'),
                'add_new' => __($post_label.'を追加する'),
                'add_new_item' => __($post_label.'の追加'),
                'edit_item' => __($post_label.'の編集'),
                'singular_name' => __($post_label.'タイプ'),
                'new_item' => __('新しい'.$post_label),
                'view_item' => __($post_label.'を見る'),
                'search_items' => __($post_label.'を探す'),
                'not_found' =>  __($post_label.'はありません'),
                'not_found_in_trash' => __('ゴミ箱に'.$post_label.'はありません'),
                'parent_item_colon' => ''
            ),
            'public' => $post_public,
            'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => false,
            'menu_position' => 4,
            'menu_icon' => $post_icon,
            'supports' => array(
                'title',
                'editor',
                'excerpt',
                'custom-fields',
                'thumbnail',
                'page-attributes'
            ),
            'rewrite' => array('slug' => $post_slug, 'with_front' => false),
            'show_in_rest' => true,
            'description' => $post_label.'の一覧ページです。',
            'show_ui' => true,
            'query_var' => true,
            'capability_type' => 'post',
        )
    );

}

/******************************
set_register_taxonomy の共通化
******************************/
function set_register_taxonomy($tax_slug, $post_type, $tax_label,$url_slug, $is_hierarchical) {
    register_taxonomy(
        $tax_slug,
        $post_type,
        array(
            'labels' => array(
                'name' => $tax_label,
                'add_new_item' => $tax_label.'を追加',
                'edit_item' => $tax_label.'の編集',
            ),
            'public' => true,
            'hierarchical' => $is_hierarchical,
            'show_admin_column' => true,
            'show_in_rest' => true,
            'rewrite' => array(
                'slug' => $url_slug,
                'with_front' => false,
            ),
        )
    );
}
PHP

コードの解説

カスタム投稿の登録部分

add_action('init', function() {
    set_register_post_type('menu_post', 'メニュー', 'menu', 'dashicons-food', true);
});
PHP

initフックのタイミングで、カスタム投稿タイプを登録します。set_register_post_type()は後述する共通化された関数です。

引数の説明

  • 'menu_post':投稿タイプのスラッグ(内部で使用される識別子)
  • 'メニュー':管理画面で表示されるラベル
  • 'menu':URLに使用されるスラッグ
  • 'dashicons-food':管理画面のアイコン(Dashiconsから選択)
  • true:公開するかどうか(trueで一般公開、falseで管理画面のみ)

タクソノミーの登録部分

add_action('init', function() {
    // メニューのタクソノミー(カテゴリー)
    set_register_taxonomy('tax_menu_category', 'menu_post', 'カテゴリー', 'menu/category', true);
    
    // メニューのタクソノミー(タグ)
    set_register_taxonomy('tax_menu_tag', 'menu_post', 'タグ', 'menu/tag', false);
    
    // メニューのタクソノミー(おすすめ)
    set_register_taxonomy('tax_menu_recommend', 'menu_post', 'おすすめ', 'menu/recommend', true);
});
PHP

3つのタクソノミーを登録します。set_register_taxonomy()は共通化された関数です。

引数の説明

  • 第1引数:タクソノミーのスラッグ
  • 第2引数:紐づける投稿タイプ('menu_post'
  • 第3引数:管理画面で表示されるラベル
  • 第4引数:URLに使用されるスラッグ
  • 第5引数:階層構造の有無(trueでカテゴリー型、falseでタグ型)

register_post_type()の共通化

function set_register_post_type($post_type, $post_label, $post_slug, $post_icon, $post_public) {
    register_post_type(
        $post_type,
        array(
            'labels' => array(
                'name' => __($post_label),
                'all_items' => __($post_label.'一覧'),
                // ... 省略 ...
            ),
            'public' => $post_public,
            'menu_position' => 4,
            'menu_icon' => $post_icon,
            // ... 省略 ...
        )
    );
}
PHP

WordPressのregister_post_type()関数をラップして、共通化しています。

register_post_type()とは

register_post_type()は、WordPressにカスタム投稿タイプを登録するための関数です。WordPressには標準で「投稿」と「固定ページ」という2つの投稿タイプがありますが、この関数を使うことで独自の投稿タイプを追加できます。

第1引数:投稿タイプのスラッグ

register_post_type('menu_post', array(...));
PHP

投稿タイプを識別するためのスラッグを指定します。この例ではmenu_postとしています。このスラッグは以下の場所で使用されます。

  • データベース内での識別子
  • テンプレートファイルの命名(single-menu_post.phpなど)
  • WordPressの内部処理

第2引数:設定配列

投稿タイプの詳細な設定を配列で指定します。

labels(ラベル設定)

'labels' => array(
    'name' => __('メニュー'),
    'all_items' => __('メニュー一覧'),
    'add_new' => __('メニューを追加する'),
    'add_new_item' => __('メニューの追加'),
    'edit_item' => __('メニューの編集'),
    'singular_name' => __('メニュータイプ'),
    'new_item' => __('新しいメニュー'),
    'view_item' => __('メニューを見る'),
    'search_items' => __('メニューを探す'),
    'not_found' => __('メニューはありません'),
    'not_found_in_trash' => __('ゴミ箱にメニューはありません'),
    'parent_item_colon' => ''
),
PHP

管理画面で表示される各種ラベルを設定します。ここで設定した文字列が、管理画面のメニューやボタンに表示されます。

public(公開設定)

'public' => true,
PHP

この投稿タイプを一般公開するかどうかを指定します。

  • true:フロントエンドで表示可能(通常はこちら)
  • false:管理画面のみで使用(フロントエンドでは表示しない)

hierarchical(階層構造)

'hierarchical' => false,
PHP

投稿に親子関係を持たせるかどうかを指定します。

  • true:固定ページのように階層構造を持つ
  • false:投稿のようにフラットな構造(今回はこちら)

メニューは階層構造を持たないため、falseにしています。

has_archive(アーカイブページ)

'has_archive' => false,
PHP

投稿タイプのアーカイブページを持つかどうかを指定します。

  • true/menu_post/のようなアーカイブページを生成
  • false:アーカイブページを生成しない(今回はこちら)

今回は固定ページでメニュー一覧を表示するため、falseにしています。

menu_position(メニューの位置)

'menu_position' => 4,
PHP

管理画面の左メニューに表示される位置を数値で指定します。

  • 5:投稿の下
  • 10:メディアの下
  • 15:リンクの下
  • 20:固定ページの下

今回は4を指定し、投稿の上に表示されるようにしています。

menu_icon(メニューアイコン)

'menu_icon' => 'dashicons-food',
PHP

管理画面のメニューに表示されるアイコンを指定します。Dashiconsから選択できます。

supports(サポート機能)

'supports' => array(
    'title',           // タイトル
    'editor',          // 本文エディタ
    'excerpt',         // 抜粋
    'custom-fields',   // カスタムフィールド
    'thumbnail',       // アイキャッチ画像
    'page-attributes'  // ページ属性(順序など)
),
PHP

この投稿タイプで使用する機能を配列で指定します。必要な機能だけを指定することで、編集画面をシンプルに保てます。

rewrite(URL書き換え)

'rewrite' => array('slug' => 'menu', 'with_front' => false),
PHP

URLの構造を指定します。

  • slug:URLに使用するスラッグ(/menu/blend-coffee/のように表示される)
  • with_front:パーマリンク設定のプレフィックスを使うかどうか

show_in_rest(REST API)

'show_in_rest' => true,
PHP

REST APIで使用可能にするかどうかを指定します。ブロックエディタ(Gutenberg)を使用する場合はtrueにする必要があります。

共通化のメリット

この関数を作成することで、以下のメリットがあります。

  • コードの重複を削減:同じようなコードを何度も書かなくて済む
  • 保守性の向上:修正が必要な場合、1箇所を変更すれば全体に反映される
  • 可読性の向上:パラメータが明確で分かりやすい

今後、他のカスタム投稿タイプ(例:お知らせ、スタッフ紹介など)を作る際も、この関数を使えば簡単に追加できます。

register_taxonomy()の共通化

function set_register_taxonomy($tax_slug, $post_type, $tax_label, $url_slug, $is_hierarchical) {
    register_taxonomy(
        $tax_slug,
        $post_type,
        array(
            'labels' => array(
                'name' => $tax_label,
                'add_new_item' => $tax_label.'を追加',
                'edit_item' => $tax_label.'の編集',
            ),
            'public' => true,
            'hierarchical' => $is_hierarchical,
            'show_admin_column' => true,
            'show_in_rest' => true,
            // ... 省略 ...
        )
    );
}
PHP

WordPressのregister_taxonomy()関数も共通化しています。

register_taxonomy()とは

register_taxonomy()は、WordPressにカスタムタクソノミーを登録するための関数です。タクソノミーとは、投稿を分類するための仕組みです。WordPressには標準で「カテゴリー」と「タグ」という2つのタクソノミーがありますが、この関数を使うことで独自のタクソノミーを追加できます。

第1引数:タクソノミーのスラッグ

register_taxonomy('tax_menu_category', 'menu_post', array(...));
PHP

タクソノミーを識別するためのスラッグを指定します。この例ではtax_menu_categoryとしています。

第2引数:紐づける投稿タイプ

register_taxonomy('tax_menu_category', 'menu_post', array(...));
PHP

このタクソノミーをどの投稿タイプに紐づけるかを指定します。配列で複数の投稿タイプを指定することもできます。

第3引数:設定配列

タクソノミーの詳細な設定を配列で指定します。

hierarchical(階層構造)

'hierarchical' => true,  // または false
PHP

タクソノミーの種類を指定します。

  • true:カテゴリー型(親子関係を持つ階層構造)
  • false:タグ型(フラットな構造)

今回の例では、以下のように使い分けています。

  • メニューカテゴリー:true(階層構造が必要な場合に備えて)
  • メニュータグ:false(タグ型)
  • おすすめメニュー:true(複数選択可能なカテゴリー型)

show_admin_column(管理画面のカラム表示)

'show_admin_column' => true,
PHP

管理画面の投稿一覧ページに、このタクソノミーのカラムを表示するかどうかを指定します。trueにすることで、一覧画面でどのカテゴリーやタグに属しているか一目で分かります。

show_in_rest(REST API)

'show_in_rest' => true,
PHP

REST APIで使用可能にするかどうかを指定します。ブロックエディタで使用する場合はtrueにする必要があります。

rewrite(URL書き換え)

'rewrite' => array(
    'slug' => 'menu/category',
    'with_front' => false,
),
PHP

タクソノミーアーカイブのURLを指定します。

  • slug:URLに使用するスラッグ(/menu/category/drink/のように表示される)
  • with_front:パーマリンク設定のプレフィックスを使うかどうか

パーマリンクの更新

カスタム投稿タイプとタクソノミーを追加した後は、必ずパーマリンクの更新が必要です。

  1. WordPress管理画面にログイン
  2. 設定 > パーマリンク を開く
  3. 何も変更せず、変更を保存 ボタンをクリック

これにより、WordPressがURL書き換えルールを再生成します。この操作を忘れると、カスタム投稿タイプのページが404エラーになるので注意してください。

管理画面の確認

管理画面を確認してみましょう。左メニューに「メニュー」という項目が追加されているはずです。

クリックすると、以下のサブメニューが表示されます。

  • メニュー一覧
  • メニューの追加
  • カテゴリー
  • タグ
  • おすすめ

カスタムフィールドの追加

メニューにサイズ別の価格を登録できるように、カスタムフィールドを追加します。

SCFでメニュー価格フィールドを作成

SCFを使って、サイズ別の価格を登録できるフィールドを作成します。

  1. 管理画面で Smart Custom Fields新規追加 をクリック
  2. 以下のように設定します

基本設定

  • タイトル:メニューの価格
  • フィールド追加をクリック

繰り返し設定

  • 繰り返し:ON(チェックを入れる)
  • グループ名price_group

サブフィールド1(サイズ)

  • タイプ:テキスト
  • ラベル:サイズ
  • 名前size

サブフィールド2(価格)

  • サブフィールドを追加をクリック
  • タイプ:テキスト
  • ラベル:価格
  • 名前price

表示条件

  • ページ右側の表示条件(投稿)で「メニュータイプ」をONにする

設定したら、公開をクリックします。

これで、メニューの編集画面に「メニューの価格」フィールドが表示されるようになります。

ACFでメニューカテゴリーにアイキャッチを追加

メニューカテゴリー一覧を表示する際に、各カテゴリーに画像を表示したいと考えています。しかし、WordPressの標準機能では、タクソノミーに画像を設定することができません

そこで、ACFを使ってメニューカテゴリーにアイキャッチ画像を追加します。

なぜACFを使うのか

SCFはタクソノミーへのフィールド追加に対応していないため、ACFを使用します。

カテゴリーアイキャッチフィールドの作成

  1. 管理画面で ACFフィールドグループ をクリック
  2. +新規追加をクリック
  3. 以下のように設定します

基本設定

  • タイトル:メニューカテゴリーアイキャッチ

フィールド1

  • フィールドタイプ:画像
  • フィールドラベル:アイキャッチ
  • フィールド名tax_eyecatch
  • 戻り値の形式:画像URL

表示設定

  • ページ中央の設定ロケーションルールルールで以下を設定
  • タクソノミー等しい カテゴリー(tax_menu_category

設定したら、変更内容を保存 をクリックします。

これで、メニューカテゴリーの編集画面に「アイキャッチ」フィールドが表示されるようになります。

メニューカテゴリーを登録する

管理画面で メニューカテゴリー を開き、以下のカテゴリーを登録します。

名前スラッグ説明
飲料drinkカフェの各種ドリンクメニュー
前菜appetizer軽食やおつまみメニュー
朝食breakfastsモーニングメニュー
デザートdessertsスイーツメニュー

アイキャッチ画像の設定

各カテゴリーに適した画像を設定します。無料素材サイトからダウンロードするか、自分で撮影した画像を使用しましょう。

アイキャッチに任意の画像を設定します。

私は素材サイト(https://www.photo-ac.com/)からカテゴリーに合った画像を設定しました。

おすすめの無料素材サイト:

画像を選んだら、各カテゴリーの編集画面で「アイキャッチ」フィールドにアップロードします。

おすすめメニューを登録する

管理画面で メニューおすすめ を開き、以下を登録します。

名前スラッグ説明
今月のおすすめrecommend-monthly季節や時期に応じたおすすめメニュー
新商品recommend-new新しく追加されたメニュー

これらは好みに応じて追加・変更できます。

メニューを登録する(お好きなように)

それでは、実際にメニューを登録してみましょう。

メニューの登録方法

管理画面で メニュー新規追加 をクリックします。

サンプル:ブレンド・コーヒー

以下の内容で登録してみましょう。

基本情報
  • タイトル:ブレンド・コーヒー
  • スラッグblend-coffee
  • 本文:当店自慢のオリジナルブレンドは、厳選した豆を絶妙にブレンドし、深みのあるコクと豊かな香りを実現しました。バランスの良い味わいで、毎日の一杯にふさわしい特別なコーヒーです。ぜひ、香り高い一杯でリラックスした時間をお楽しみください。
  • 抜粋:厳選した豆を絶妙にブレンドし、深みのあるコクと豊かな香りを実現しました。バランスの良い味わいで、毎日の一杯にふさわしい特別なコーヒーです。
分類
  • カテゴリー:飲料
  • タグ:コーヒー、ホット、ノンアルコール
  • おすすめ:今月のおすすめ

価格設定(メニューの価格フィールド)

「メニューの価格」フィールドで「+」ボタンをクリックして、以下を追加します。

  • 1行目:サイズ:S / 価格:300
  • 2行目:サイズ:M / 価格:400
  • 3行目:サイズ:L / 価格:500

アイキャッチ画像

コーヒーの写真をアップロードして設定します。

設定したら、公開 ボタンをクリックします。

さらにメニューを追加

同様の方法で、いくつか登録してください。

例えば以下のようなメニューを追加してみましょう。

ドリンク系の例

  • アイスコーヒー(飲料、アイス、コーヒー、ノンアルコール)
  • カフェラテ(飲料、ホット、ミルク、ノンアルコール)
  • 抹茶ラテ(飲料、ホット、ミルク、ノンアルコール)

フード系の例

  • サンドイッチ(前菜、パン)
  • サラダプレート(前菜、サラダ)
  • モーニングセット(朝食、セットメニュー)

デザート系の例

  • ティラミス(デザート、スイーツ)
  • チーズケーキ(デザート、スイーツ)

最低でも数件程度のメニューを登録しておくと、後のページ制作で動作確認がしやすくなります。

まとめ

今回は、カフェサイトの核となる「メニュー管理機能」をカスタム投稿タイプで実装しました。

学んだこと

カスタム投稿タイプ

  • 固定ページや標準の投稿では難しい、専用のデータ管理ができる
  • register_post_type()を使って登録する
  • 共通化することで保守性が向上する

カスタムタクソノミー

  • カテゴリー型とタグ型の2種類がある
  • register_taxonomy()を使って登録する
  • 1つの投稿に複数の分類軸を持たせられる

カスタムフィールド

  • SCFで繰り返しフィールドを実装(価格設定)
  • ACFでタクソノミーにフィールドを追加(カテゴリーアイキャッチ)
  • データとして管理することで、表記統一や一括変更が可能

共通化のテクニック

  • 関数化することでコードの重複を削減
  • 保守性の向上:修正が必要な場合、1箇所を変更すれば全体に反映される

重要なポイント

  1. 固定ページではカテゴリー分類ができない
    • カスタム投稿タイプを使うことで柔軟な管理が可能
  2. 標準の投稿はブログ用に使う
    • メニューとブログを分けることで、それぞれに適した管理画面を用意できる
  3. タクソノミーは「分類の軸」
    • カテゴリー型は階層構造、タグ型はフラット
    • 1つの投稿に複数の分類軸を持たせられる
  4. カスタムフィールドでデータとして管理
    • 本文に価格を書くのではなく、フィールドで管理
    • 表記統一、一括変更、並び替えが可能
  5. パーマリンクの更新を忘れずに
    • カスタム投稿タイプ追加後は必ず実行
    • 忘れると404エラーになる

今後の展開

今回作成したメニューデータは、次回以降の記事で実際にページとして表示していきます。

  • メニュー一覧ページ:全メニューを一覧表示
  • カテゴリー別ページ:ドリンクのみ、デザートのみ表示
  • おすすめメニュー:トップページで新作や今月のおすすめを表示
  • 詳細ページ:メニュー1件の詳細情報を表示

カスタム投稿タイプは、WordPressサイト制作において最も重要な機能の一つです。この記事で学んだ内容は、今後あらゆるサイト制作で活用できます。

次回予告

次回は、今回登録したメニューを実際にページとして表示していきます。

  • メニュー一覧ページの作成
  • カテゴリー別メニュー一覧の表示
  • タグ別メニュー一覧の表示
  • おすすめメニューの表示
  • 個別メニュー詳細ページの作成

カスタム投稿タイプで登録したデータを、WordPressのテンプレート階層を使って柔軟に表示する方法を学びます。引き続き、実際に手を動かしながら進めていきましょう。

この記事の評価をお願いします

評価をすると「既読」となり、まだ読んでいない記事を区別できます。

この投稿をシェアする

コメントを残す

CAPTCHA



headタグの整理とセキュリティ対策 – WordPress実践制作【WPCafe編】

headタグの整理とセキュリティ対策 – WordPress実践制作【WPCafe編】  PRACTICE

WordPressのheadタグ整理とセキュリティ対策を実装します。デフォルトで出力される不要な情報を削除し、自分で必要なタグを適切な順序で出力できるようにします。また、バージョン情報の非表示、ユーザー列挙対策、REST API制限などのセキュリティ対策も実施。今後のサイト制作でも使える重要なノウハウを身につけます。

  • 2025/10/25
  • 0comments
  • 146views

STAY CONNECTED

wp-ch Admin

現役のフリーランスエンジニアがWordPressによるWebサイト構築を基礎から実践テクニックまで徹底解説します。

たくさんの方がフォローしてくれています。あなたもぜひ、情報を受け取ってください。

STORY|ストーリー

WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。

学習ストーリー第40話まで掲載中

全ストーリーを見る

PRACTICE|カフェ編

カフェを題材にした本格的なサイト構築を公開中。実践を通してサイトの構築方法を学べます。

サンプルサイト:WPCafe

実践ストーリー第11話まで掲載中

全ストーリーを見る