カスタムポストタイプとは?
WordPressにはデフォルトで「投稿(post)」と「固定ページ(page)」という2つのコンテンツタイプがあります。カスタムポストタイプを使うと、これらとは別の独自のコンテンツタイプを作成できます。
💡 カスタムポストタイプの活用例
- ポートフォリオサイト: 「作品」ポストタイプで制作実績を管理
- ECサイト: 「商品」ポストタイプで商品情報を管理
- 不動産サイト: 「物件」ポストタイプで物件情報を管理
- イベントサイト: 「イベント」ポストタイプでイベント情報を管理
- レストランサイト: 「メニュー」ポストタイプで料理を管理
基本的なカスタムポストタイプの登録
functions.phpに以下のコードを追加して、カスタムポストタイプを登録します。
例: ポートフォリオ作品用のポストタイプ
functions.phpfunction create_portfolio_post_type() {
$args = array(
'labels' => array(
'name' => '作品',
'singular_name' => '作品',
'add_new' => '新規追加',
'add_new_item' => '新しい作品を追加',
'edit_item' => '作品を編集',
'new_item' => '新しい作品',
'view_item' => '作品を表示',
'search_items' => '作品を検索',
'not_found' => '作品が見つかりませんでした',
'not_found_in_trash' => 'ゴミ箱に作品はありません',
),
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'rewrite' => array('slug' => 'portfolio'),
);
register_post_type('portfolio', $args);
}
add_action('init', 'create_portfolio_post_type');
✅ 登録完了後の確認
コードを保存すると、WordPress管理画面の左メニューに「作品」という項目が追加されます。通常の投稿と同じように、作品を追加・編集できるようになります。
パラメータの詳細解説
主要なパラメータ
labels(ラベル設定)
管理画面に表示される文言を設定します。日本語化するために必須です。
- name: メニューに表示される名前
- singular_name: 単数形の名前
- add_new_item: 「新規追加」ボタンのテキスト
public(公開設定)
true にすると、フロントエンドで表示可能になります。管理画面専用の場合は false にします。
has_archive(アーカイブページ)
true にすると、一覧ページが自動生成されます。例: /portfolio/
supports(サポート機能)
このポストタイプでサポートする機能を配列で指定します。
- title: タイトル
- editor: 本文エディタ
- thumbnail: アイキャッチ画像
- excerpt: 抜粋
- comments: コメント
- custom-fields: カスタムフィールド
menu_icon(メニューアイコン)
管理画面メニューに表示されるアイコンを指定します。Dashiconsから選択できます。
dashicons-portfolio
dashicons-products
dashicons-calendar-alt
dashicons-store
→ Dashicons一覧
rewrite(パーマリンク設定)
URLのスラッグ(パス)をカスタマイズします。
'rewrite' => array('slug' => 'works'),
// 例: https://example.com/works/sample-work/
実践例:商品管理システム
ECサイトでよく使われる「商品」ポストタイプの実装例です。
functions.phpfunction create_product_post_type() {
$args = array(
'labels' => array(
'name' => '商品',
'singular_name' => '商品',
'add_new' => '新規追加',
'add_new_item' => '新しい商品を追加',
'edit_item' => '商品を編集',
'view_item' => '商品を表示',
'search_items' => '商品を検索',
),
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-products',
'menu_position' => 5,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
'rewrite' => array('slug' => 'products'),
'show_in_rest' => true, // ブロックエディタ対応
'taxonomies' => array('product_category'), // カスタムタクソノミーと連携
);
register_post_type('product', $args);
}
add_action('init', 'create_product_post_type');
テンプレートファイルの作成
カスタムポストタイプ専用のテンプレートファイルを作成できます。
テンプレート階層
WordPressは以下の順序でテンプレートファイルを探します:
- single-{post-type}-{slug}.php - 特定のスラッグ用
- single-{post-type}.php - ポストタイプ専用(例: single-portfolio.php)
- single.php - 通常の個別記事テンプレート
- singular.php - 記事・固定ページ共通
- index.php - フォールバック
例: single-portfolio.php
single-portfolio.php<?php get_header(); ?>
<main class="portfolio-single">
<?php while (have_posts()) : the_post(); ?>
<article id="portfolio-<?php the_ID(); ?>" <?php post_class(); ?>>
<h1><?php the_title(); ?></h1>
<?php if (has_post_thumbnail()) : ?>
<div class="portfolio-image">
<?php the_post_thumbnail('large'); ?>
</div>
<?php endif; ?>
<div class="portfolio-content">
<?php the_content(); ?>
</div>
<!-- カスタムフィールドの表示例 -->
<?php if (get_post_meta(get_the_ID(), 'client_name', true)) : ?>
<div class="portfolio-meta">
<p><strong>クライアント:</strong>
<?php echo esc_html(get_post_meta(get_the_ID(), 'client_name', true)); ?>
</p>
</div>
<?php endif; ?>
</article>
<?php endwhile; ?>
</main>
<?php get_footer(); ?>
アーカイブページ: archive-portfolio.php
archive-portfolio.php<?php get_header(); ?>
<main class="portfolio-archive">
<h1>作品一覧</h1>
<?php if (have_posts()) : ?>
<div class="portfolio-grid">
<?php while (have_posts()) : the_post(); ?>
<article class="portfolio-item">
<a href="<?php the_permalink(); ?>">
<?php if (has_post_thumbnail()) : ?>
<?php the_post_thumbnail('medium'); ?>
<?php endif; ?>
<h2><?php the_title(); ?></h2>
</a>
</article>
<?php endwhile; ?>
</div>
<?php the_posts_pagination(); ?>
<?php endif; ?>
</main>
<?php get_footer(); ?>
カスタムクエリでの使用
任意の場所でカスタムポストタイプの投稿を表示できます。
例: トップページに最新作品を3件表示<?php
$args = array(
'post_type' => 'portfolio',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
);
$portfolio_query = new WP_Query($args);
if ($portfolio_query->have_posts()) :
while ($portfolio_query->have_posts()) : $portfolio_query->the_post();
?>
<article>
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php the_excerpt(); ?>
</article>
<?php
endwhile;
wp_reset_postdata(); // 重要: クエリをリセット
endif;
?>
⚠️ wp_reset_postdata()を忘れずに
カスタムクエリ(WP_Query)を使った後は、必ず wp_reset_postdata() を呼び出してください。これを忘れると、その後のループが正しく動作しません。
パーマリンクの更新
⚠️ 必須手順
カスタムポストタイプを登録した後は、必ずパーマリンクの再保存が必要です。
- WordPress管理画面 → 設定 → パーマリンク設定
- 何も変更せずに「変更を保存」ボタンをクリック
これをしないと、カスタムポストタイプのページが404エラーになります。
よくある使い方のパターン
パターン1: イベント管理
'supports' => array('title', 'editor', 'thumbnail'),
'menu_icon' => 'dashicons-calendar-alt',
'rewrite' => array('slug' => 'events'),
カスタムフィールドで開催日時、会場、参加費などを管理
パターン2: スタッフ紹介
'supports' => array('title', 'editor', 'thumbnail'),
'menu_icon' => 'dashicons-groups',
'rewrite' => array('slug' => 'staff'),
カスタムフィールドで役職、SNSリンクなどを管理
パターン3: FAQ(よくある質問)
'supports' => array('title', 'editor'),
'menu_icon' => 'dashicons-format-chat',
'rewrite' => array('slug' => 'faq'),
タイトルが質問、本文が回答として使用
プラグインとの比較
💡 コードで実装 vs プラグイン
| 方法 |
メリット |
デメリット |
| コードで実装 |
軽量、カスタマイズ自由 |
コード知識が必要 |
| Custom Post Type UI |
GUI で簡単設定 |
プラグイン依存 |
まとめ
カスタムポストタイプを習得すると、以下のことができるようになります:
- ✅ 用途別にコンテンツを整理できる
- ✅ 管理画面が使いやすくなる
- ✅ 専用のテンプレートで表示をカスタマイズできる
- ✅ プロフェッショナルなサイト構築が可能に