カスタムポストタイプとは?

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は以下の順序でテンプレートファイルを探します:

  1. single-{post-type}-{slug}.php - 特定のスラッグ用
  2. single-{post-type}.php - ポストタイプ専用(例: single-portfolio.php)
  3. single.php - 通常の個別記事テンプレート
  4. singular.php - 記事・固定ページ共通
  5. 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() を呼び出してください。これを忘れると、その後のループが正しく動作しません。

パーマリンクの更新

⚠️ 必須手順

カスタムポストタイプを登録した後は、必ずパーマリンクの再保存が必要です。

  1. WordPress管理画面 → 設定 → パーマリンク設定
  2. 何も変更せずに「変更を保存」ボタンをクリック

これをしないと、カスタムポストタイプのページが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 で簡単設定 プラグイン依存

まとめ

カスタムポストタイプを習得すると、以下のことができるようになります:

🚀 次のステップ

カスタムポストタイプと組み合わせて、カスタムフィールドカスタムタクソノミーを学ぶと、さらに高度なコンテンツ管理が可能になります。