関連記事
固定ページ一覧を最適化しよう!プラグインの導入とAdmin Columnsの活用
固定ページ一覧の管理を効率化するために、Admin Columnsプラグインを導入し、「スラッグ」や「順序」を一覧に表示する方法を解説します。プラグインの基本概念から導入手順、実践的な順序設定テクニックまでを丁寧に紹介し、効率的なページ管理を実現します。
前編・後編を通してカスタム投稿タイプ「カフェメニュー」の基本的な作成と表示方法を学習してきました。
今回は総仕上げとして、商品情報の充実を図ります。抜粋(概要)、アイキャッチ(サムネイル)、サイズ別価格(カスタムフィールド)の実装を通して、より実用的なメニューシステムを完成させましょう。
今回の目標
現在のカフェメニューは、メニュー名とカテゴリー分類のみの基本的な情報しか表示できません。これを以下の機能を追加して、より実用的な商品情報システムに発展させます。
これにより、実際のカフェサイトで使用できるレベルのメニューが完成します。
目次
現在のカスタム投稿「カフェメニュー」では、タイトル・本文・並び順のみが使用できる状態です。今回実装する抜粋・アイキャッチ・カスタムフィールドを使用するには、register_post_type
のsupports
パラメーターでこれらの機能を有効化する必要があります。
functions.phpのregister_post_type
のsupports
パラメーターを以下のように修正してください。
// functions.php内のregister_post_type部分を修正
add_action('init', function() {
register_post_type(
'menu_post',
array(
'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' => __('ゴミ箱にカフェメニューはありません'),
),
'public' => true,
'hierarchical' => false,
'supports' => array(
'title', // タイトル(従来通り)
'editor', // 本文(従来通り)
'page-attributes', // 並び順(従来通り)
'excerpt', // 抜粋を有効化【新規追加】
'thumbnail', // アイキャッチを有効化【新規追加】
'custom-fields' // カスタムフィールドを有効化【新規追加】
),
'rewrite' => array(
'slug' => 'menu',
'with_front' => false,
),
'menu_icon' => 'dashicons-food',
)
);
});
PHP上記でthumbnail
を有効にしましたが、これだけではアイキャッチ機能は使用できません。テーマ全体でアイキャッチ画像をサポートする設定も必要です。
functions.php
に以下のコードを追加してください。
// アイキャッチ画像サポートを有効化
add_theme_support('post-thumbnails');
PHPこれで抜粋・アイキャッチ・カスタムフィールドを設定する準備が整いました。
抜粋(excerpt
)は、投稿の要約や概要を表示するためのWordPress標準機能です。一覧ページで全文を表示する代わりに、短い説明文を表示することで、ユーザーに概要を伝えることができます。今回は各メニューの特徴や魅力を伝える説明文として活用します。
WordPress管理画面から「カフェメニュー」の編集画面を開きます。supports
でexcerpt
を有効にしたことで、編集画面に「抜粋」欄が表示されるようになります。
各メニューに以下のような抜粋を追加してください。
カフェメニュー一覧ページ(page-cafe-menu.php)に抜粋を表示するよう修正します。
各メニュー項目の表示部分で、メニュー名の下に抜粋を追加します。具体的には以下の変更を行います。
<li>
内の構造を整理して<div class="menu-content">
で囲む<h3>
タグに変更has_excerpt()
で抜粋の有無を確認し、the_excerpt()
で表示<ul class="menu-list">
<?php
while ($menu_query->have_posts()) :
$menu_query->the_post();
?>
<li class="menu-item">
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
?>
</ul>
PHPカテゴリー別一覧ページにも同様に抜粋を追加します。
カテゴリー別一覧ページ(taxonomy-tax-menu.php)にも抜粋を表示します。
page-cafe-menu.phpと同様に、各メニュー項目に抜粋を追加します。前回作成した簡単なリスト表示から、構造化された表示に変更します。
<ul class="menu-list">
<?php
while ($query->have_posts()) :
$query->the_post();
?>
<li class="menu-item">
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
PHPアイキャッチ画像は、投稿やページを代表する画像です。一覧ページでのサムネイル表示や、記事のヘッダー画像として使用されます。メニューの場合は、商品の写真として活用できます。
アイキャッチ画像を表示するよう、さらに修正します。
各メニュー項目に画像表示エリアを追加します。
has_post_thumbnail()
でアイキャッチの有無を確認<div class="menu-thumbnail">
でサムネイル表示エリアを作成the_post_thumbnail('thumbnail')
でサムネイルサイズの画像を表示<ul class="menu-list">
<?php
while ($menu_query->have_posts()) :
$menu_query->the_post();
?>
<li class="menu-item">
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_post_thumbnail()) : ?>
<div class="menu-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('thumbnail'); ?>
</a>
</div>
<?php endif; ?>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
?>
</ul>
PHPWordPressでは、以下のサイズを指定することができます。
サイズ名 | 指定方法 | 初期値 |
---|---|---|
サムネイル | ‘thumbnail ‘ | 150×150 |
中サイズ | ‘medium ‘ | 300×300 |
大サイズ | ‘large ‘ | 1024×1024 |
フルサイズ | ‘full ‘ | – |
任意 | [幅,高さ] | – |
フルサイズは、画像のサイズそのままです。
任意は the_post_thumbnail([1024,768])
のように直接サイズを指定できます。
画像のサイズは正方形になるわけではありません。縦横比率を維持しながら、最大の幅、最大の高さに制限がかかります。
元の画像が1920×1080で中サイズを指定した場合、the_post_thumbnail
が取得するサイズは300×168となります。
同様にカテゴリー別一覧ページにもアイキャッチ画像を追加します。
page-cafe-menu.phpと同じアイキャッチ表示機能を追加します。
<ul class="menu-list">
<?php
while ($query->have_posts()) :
$query->the_post();
?>
<li class="menu-item">
<?php if (has_post_thumbnail()) : ?>
<div class="menu-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium'); ?>
</a>
</div>
<?php endif; ?>
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
wp_reset_postdata();
?>
</ul>
PHP価格は商品に対して1つではなく、Sサイズ300円、Mサイズ400円のような複数価格の管理・表示をしたいと思います。そこで1つの商品に対して「行」を管理できるプラグインを導入します。
カスタムフィールドを簡単に管理するため、「Smart Custom Fields
」プラグインをインストール・有効化してください。
これでカフェメニューにサイズ別価格を入力する準備ができました。
各カフェメニューの編集画面で、以下のような価格情報を登録してください。
繰り返しフィールドから先頭の価格を取得して表示する機能を追加します。
各メニュー項目に価格表示を追加します。
SCF::get('price_group')
で価格データを取得[0]['price']
から最初の価格を取得<ul class="menu-list">
<?php
while ($menu_query->have_posts()) :
$menu_query->the_post();
// Smart Custom Fieldsの繰り返しフィールドから価格を取得
$prices = SCF::get('price_group');
$first_price = '';
if (!empty($prices) && !empty($prices[0]['price'])) {
$first_price = $prices[0]['price'] . '円〜';
}
?>
<li class="menu-item">
<?php if (has_post_thumbnail()) : ?>
<div class="menu-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium'); ?>
</a>
</div>
<?php endif; ?>
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
<?php if ($first_price) : ?>
<p class="menu-price"><?php echo $first_price; ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
wp_reset_postdata();
?>
</ul>
PHPカテゴリー別一覧も同じ様に修正します。
<ul class="menu-list">
<?php
while ($query->have_posts()) :
$query->the_post();
// Smart Custom Fieldsの繰り返しフィールドから価格を取得
$prices = SCF::get('price_group');
$first_price = '';
if (!empty($prices) && !empty($prices[0]['price'])) {
$first_price = $prices[0]['price'] . '円〜';
}
?>
<li class="menu-item">
<?php if (has_post_thumbnail()) : ?>
<div class="menu-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium'); ?>
</a>
</div>
<?php endif; ?>
<div class="menu-content">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php if (has_excerpt()) : ?>
<p class="menu-excerpt"><?php the_excerpt(); ?></p>
<?php endif; ?>
<?php if ($first_price) : ?>
<p class="menu-price"><?php echo $first_price; ?></p>
<?php endif; ?>
</div>
</li>
<?php
endwhile;
wp_reset_postdata();
?>
</ul>
PHP続けて、個別メニューページ(single-menu_post.php)で、本文、アイキャッチ、サイズと価格のリストを表示します。
<?php get_header(); ?>
<?php if (has_post_thumbnail()) : ?>
<div class="menu-image">
<?php the_post_thumbnail('large'); ?>
</div>
<?php endif; ?>
<div class="menu-description">
<?php the_content(); ?>
</div>
<?php
// Smart Custom Fieldsの繰り返しフィールドから価格情報を取得
$prices = SCF::get('price_group');
if (!empty($prices)) :
?>
<div class="menu-prices">
<h3>価格表</h3>
<ul class="price-list">
<?php
foreach ($prices as $price_data) :
if ( !empty($price_data['price']) ) :
?>
<li class="price-item">
<span class="size"><?php echo $price_data['size']; ?></span>
<span class="price"><?php echo $price_data['price']; ?>円</span>
</li>
<?php endif; ?>
<?php
endforeach;
?>
</ul>
</div>
<?php
endif;
?>
<p>※この投稿は single-menu_post.php テンプレートで表示されています</p>
<?php get_footer(); ?>
PHP<?php if (has_post_thumbnail()) : ?>
<div class="menu-image">
<?php the_post_thumbnail('large'); ?>
</div>
<?php endif; ?>
PHPhas_post_thumbnailでアイキャッチの有無を判定。the_post_thumbnaildで表示しています。largeを指定することで大きな画像を表示します。
<?php
// Smart Custom Fieldsの繰り返しフィールドから価格情報を取得
$prices = SCF::get('price_group');
if (!empty($prices)) :
?>
<div class="menu-prices">
<h3>価格表</h3>
<ul class="price-list">
<?php
foreach ($prices as $price_data) :
if ( !empty($price_data['price']) ) :
?>
<li class="price-item">
<span class="size"><?php echo $price_data['size']; ?></span>
<span class="price"><?php echo $price_data['price']; ?>円</span>
</li>
<?php endif; ?>
<?php
endforeach;
?>
</ul>
</div>
<?php
endif;
?>
PHPSCF::get('price_group')
でSmart Custom Fields
プラグインで設定した価格を取得します。価格は複数データあるためforeach
ループで繰り返し表示します
これで、メニュー一覧、個別メニューに抜粋、画像、価格を表示することができました。お疲れ様でした。
最後にカフェメニューの管理画面にもアイキャッチと価格を表示して、管理効率を向上させてみましょう。
管理画面の一覧に項目を追加する方法は、以前の記事で紹介したAdmin Columns
プラグインを使用します。
今回の学習で、カスタム投稿タイプ「カフェメニュー」に以下の機能を追加しました。
Smart Custom Fields
を使った繰り返しフィールドSCF::get()
を使ったカスタムフィールドの取得これで実用的なカフェメニューシステムが完成しました。抜粋、画像、価格情報を含む充実したメニュー表示が可能になります。
学習が進むにつれて、各テンプレートファイルに同じようなコードが重複して記述されてきました。また、functions.phpに様々なカスタマイズ用のコードが蓄積されて、メンテナンスが困難になっています。
次回は、コードの整理整頓により保守性を向上させる技術について学習します。
これらの整理により機能追加や修正が格段に行いやすくなり、保守性の高いWordPressテーマ開発の基盤が整います。
この記事で作成した成果物は、以下のページでまとめて確認することができます。
Webサイトにカフェメニューを表示するシステムを構築します。一覧ページ、個別ページ、カテゴリー別表示の実装から、パーマリンク設定によるページ表示エラーの解決まで、実際の開発で遭遇するトラブルシューティングも含めて詳しく解説。実用的なメニュー管理システムを完成させる実践的な内容です。
テーマ開発が進むと複数のテンプレートでコードが重複し、管理ファイルも肥大化してメンテナンスが困難になります。重複コードの解消と機能別ファイル分割による整理整頓技術を学び、保守性が高く効率的で管理しやすい開発環境を構築する方法を詳しく解説していきます。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第39話まで掲載中