カスタム投稿タイプをfunctions.phpだけで作成する方法

カスタム投稿タイプをfunctions.phpだけで作成する方法 ワードプレス

今回は、ワードプレス(WordPress)のカスタム投稿タイプを「functions.php」だけで作成する手順を紹介します。

カスタム投稿タイプとは、ワードプレスの「投稿」や「固定ページ」とは別に、独自の投稿タイプを追加できる機能です。
例えば、「お知らせ」「制作実績」「商品情報」「スタッフ紹介」など、通常の投稿とは別のコンテンツを管理したいときにとても便利です。

カスタム投稿タイプの作成方法はプラグインを使う方法もあります。
ですが、当記事ではプラグインを使わずfunctions.phpで実装する手順を詳しく解説します。

ただ、PHPの知識がない方向けにおすすめのプラグインもあわせて紹介します。

カスタム投稿タイプの設定方法をお探しの方は、ぜひ参考にしてください。

カスタム投稿タイプとは

ワードプレスには、デフォルトで以下の投稿タイプが用意されています。

  • 投稿(post):ブログ記事やニュースなどの更新コンテンツ
  • 固定ページ(page):会社概要やお問い合わせなどの静的コンテンツ
  • 添付ファイル(attachment):メディアライブラリにアップロードしたファイル
  • リビジョン(revision):投稿の編集履歴
  • ナビゲーションメニュー(nav_menu_item):メニュー項目

カスタム投稿タイプは、これらに加えて新しい投稿タイプを独自に追加する機能です。

例えば、「ブログ」として通常の「投稿」を使いながら、別途「お知らせ」や「制作実績」を管理したいとします。
通常の投稿のカテゴリーで分ける方法もありますが、投稿内容が混在して管理しにくくなります。

このような場合にカスタム投稿タイプを使えば、管理画面のメニューが分かれるのでコンテンツの管理がすっきりします。
また、投稿タイプごとに異なるテンプレート(デザイン)を適用することも可能です。

functions.phpでカスタム投稿タイプを作成する手順

それでは、実際にfunctions.phpにコードを書いてカスタム投稿タイプを作成していきましょう。
今回は、「お知らせ(news)」というカスタム投稿タイプを作成する例で解説します。

【事前準備】
functions.phpを編集する前に、必ずバックアップを取ってください。
また、親テーマのfunctions.phpを直接編集するとテーマ更新時に上書きされるため、子テーマのfunctions.phpに記述することをおすすめします。

STEP1:register_post_type()でカスタム投稿タイプを登録する

カスタム投稿タイプの作成には、ワードプレスの関数register_post_type()を使います。
この関数をinitアクションフックに登録して実行します。

以下が、最小限の構成で「お知らせ」を作成するコードです。

■functions.phpに記述(最小構成)

function create_news_post_type() {
  register_post_type( ‘news’, array(
    ‘label’ => ‘お知らせ’,
    ‘public’ => true,
    ‘has_archive’ => true,
  ));
}
add_action( ‘init’, ‘create_news_post_type’ );

このコードをfunctions.phpに追加すると、管理画面の左メニューに「お知らせ」が表示されます。

投稿タイプ名(第1引数)のルール:

  • 最大20文字
  • 小文字の英数字とハイフンのみ使用可能(大文字・スペースは不可)
  • ワードプレスの予約語(post、page、attachment、revisionなど)は使用不可
  • 投稿後の変更はURLが変わるため、最初に慎重に決める

STEP2:詳細なパラメータを設定する

最小構成でも動作しますが、実際の運用ではもう少し詳細な設定が必要です。
以下は、実務でよく使うパラメータをすべて含めたコードです。

■functions.phpに記述(実用的な構成)

function create_news_post_type() {
  register_post_type( ‘news’, array(
    ‘labels’ => array(
      ‘name’ => ‘お知らせ’,
      ‘singular_name’ => ‘お知らせ’,
      ‘add_new’ => ‘新規追加’,
      ‘add_new_item’ => ‘お知らせを追加’,
      ‘edit_item’ => ‘お知らせを編集’,
      ‘view_item’ => ‘お知らせを表示’,
      ‘search_items’ => ‘お知らせを検索’,
      ‘not_found’ => ‘お知らせが見つかりません’,
    ),
    ‘public’ => true,
    ‘has_archive’ => true,
    ‘menu_position’ => 5,
    ‘menu_icon’ => ‘dashicons-megaphone’,
    ‘supports’ => array(
      ‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’, ‘revisions’
    ),
    ‘show_in_rest’ => true,
  ));
}
add_action( ‘init’, ‘create_news_post_type’ );

主要パラメータの解説

上記コードで使用しているパラメータの意味を解説します。

①、labels(ラベル設定)

管理画面上に表示されるテキストの設定です。
ラベルは、日本語でも設定できます。

  • name:管理画面メニューに表示される名前
  • singular_name:単数形の名前
  • add_new:「新規追加」ボタンのテキスト
  • add_new_item:新規追加画面のタイトル
  • edit_item:編集画面のタイトル
  • view_item:「表示」リンクのテキスト
  • search_items:検索ボタンのテキスト
  • not_found:投稿が見つからない場合のメッセージ

②、public(公開設定)

カスタム投稿タイプを管理画面やフロントエンド(サイト表示側)に表示するかどうかの設定です。
true」にすると管理画面にメニューが表示され、サイト上でも閲覧できるようになります。

③、has_archive(アーカイブページ)

一覧ページ(アーカイブページ)を有効にするかどうかの設定です。
true」にすると、「https://あなたのドメイン/news/」で一覧ページが表示されるようになります。

④、menu_position(メニュー位置)

管理画面の左メニューでの表示位置を数字で指定します。

  • 5:「投稿」の下
  • 10:「メディア」の下
  • 20:「固定ページ」の下
  • 25:「コメント」の下

⑤、menu_icon(メニューアイコン)

管理画面のメニューに表示するアイコンを指定します。
ワードプレスに内蔵されているDashiconsのアイコン名を指定します(例:’dashicons-megaphone’)。
使用できるアイコンはワードプレス公式のDashiconsページで確認できます。

⑥、supports(編集画面の項目)

投稿の編集画面で使用できる項目を配列で指定します。

  • title:タイトル入力欄
  • editor:本文エディタ
  • thumbnail:アイキャッチ画像
  • excerpt:抜粋
  • custom-fields:カスタムフィールド
  • revisions:リビジョン(編集履歴)
  • page-attributes:ページ属性(順序、親ページ選択)
  • comments:コメント
supports を省略すると、「タイトル」と「本文エディタ」のみが有効になります。
アイキャッチ画像や抜粋など、使いたい項目は明示的に指定しましょう。

⑦、show_in_rest(REST API / ブロックエディタ対応)

show_in_restを「true」にすると、ブロックエディタ(Gutenberg)でカスタム投稿タイプの編集が可能になります。

この設定を「false」のまま(またはを省略)にすると、旧エディタ(クラシックエディタ)での編集になります。
ブロックエディタを使いたい場合は、必ず‘show_in_rest’ => trueを設定してください。

STEP3:カスタムタクソノミー(カテゴリー・タグ)を追加する

カスタム投稿タイプ専用のカテゴリーやタグを追加するには、register_taxonomy()関数を使います。

以下のコードをSTEP2のregister_post_type()の後に追加します。

■ カテゴリー(階層あり)の追加

register_taxonomy( ‘news-cat’, ‘news’, array(
  ‘labels’ => array(
    ‘name’ => ‘お知らせカテゴリー’,
    ‘add_new_item’ => ‘カテゴリーを追加’,
    ‘edit_item’ => ‘カテゴリーを編集’,
    ‘search_items’ => ‘カテゴリーを検索’,
  ),
  ‘public’ => true,
  ‘hierarchical’ => true,
  ‘show_in_rest’ => true,
));

■ タグ(階層なし)の追加

register_taxonomy( ‘news-tag’, ‘news’, array(
  ‘labels’ => array(
    ‘name’ => ‘お知らせタグ’,
    ‘add_new_item’ => ‘タグを追加’,
    ‘edit_item’ => ‘タグを編集’,
    ‘search_items’ => ‘タグを検索’,
  ),
  ‘public’ => true,
  ‘hierarchical’ => false,
  ‘show_in_rest’ => true,
));

hierarchical(階層化)の設定がポイントです。
true」にするとカテゴリーのように親子関係を持つ分類、「false」にするとタグのようなフラットな分類になります。

STEP4:パーマリンクを更新する

カスタム投稿タイプを作成した後は、必ずパーマリンクの更新を行ってください。

「設定」→「パーマリンク」

画面を開き、何も変更せずに「変更を保存」ボタンをクリックします。

この操作を忘れると、作成したカスタム投稿タイプの記事ページや一覧ページが404エラーになります。
コードを追加した後に一度だけ行えばOKです。

コードの全体像(コピペ用)

ここまでの内容をまとめた、コピペで使える完全なコードを掲載します。

■functions.phpに記述(完全版)

function create_news_post_type() {
  // カスタム投稿タイプの登録
  register_post_type( ‘news’, array(
    ‘labels’ => array(
      ‘name’ => ‘お知らせ’,
      ‘singular_name’ => ‘お知らせ’,
      ‘add_new’ => ‘新規追加’,
      ‘add_new_item’ => ‘お知らせを追加’,
      ‘edit_item’ => ‘お知らせを編集’,
      ‘view_item’ => ‘お知らせを表示’,
      ‘search_items’ => ‘お知らせを検索’,
      ‘not_found’ => ‘お知らせが見つかりません’,
    ),
    ‘public’ => true,
    ‘has_archive’ => true,
    ‘menu_position’ => 5,
    ‘menu_icon’ => ‘dashicons-megaphone’,
    ‘supports’ => array(
      ‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘revisions’
    ),
    ‘show_in_rest’ => true,
  ));

  // カスタムタクソノミー(カテゴリー)の登録
  register_taxonomy( ‘news-cat’, ‘news’, array(
    ‘labels’ => array(
      ‘name’ => ‘お知らせカテゴリー’,
      ‘add_new_item’ => ‘カテゴリーを追加’,
      ‘edit_item’ => ‘カテゴリーを編集’,
    ),
    ‘public’ => true,
    ‘hierarchical’ => true,
    ‘show_in_rest’ => true,
  ));
}
add_action( ‘init’, ‘create_news_post_type’ );

上記コードの「news」や「お知らせ」の部分を変更すれば、「制作実績(works)」「スタッフ紹介(staff)」「商品情報(products)」など、任意のカスタム投稿タイプを作成できます。

コード自体は長くなるので、初めて設定する場合には少し戸惑うかもしれないです。
ですが、難しい設定ではないので、慣れればサクサクと作業を行えるようになると思います。

カスタム投稿タイプ用のテンプレートファイル

カスタム投稿タイプを作成しただけでは、フロントエンドの表示はテーマのデフォルトテンプレートが適用されます。
専用のデザインを適用したい場合は、以下のテンプレートファイルをテーマフォルダに作成します。

一覧ページ
archive-news.php
(存在しなければ archive.php が適用)
個別ページ
single-news.php
(存在しなければ single.php が適用)

ファイル名の「news」の部分は、register_post_type()の第1引数で指定した投稿タイプ名と一致させてください。

カスタム投稿タイプの記事を表示する方法

作成したカスタム投稿タイプの記事を任意の場所に表示するには、WP_Query を使ったサブループを使います。

■ お知らせの最新5件を表示する例

<?php
$args = array(
  ‘post_type’ => ‘news’,
  ‘post_status’ => ‘publish’,
  ‘posts_per_page’ => 5,
);
$news_query = new WP_Query( $args );

if ( $news_query->have_posts() ) :
  while ( $news_query->have_posts() ) : $news_query->the_post();
?>
  <article>
    <time><?php echo get_the_date(); ?></time>
    <h3><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h3>
  </article>
<?php
  endwhile;
  wp_reset_postdata();
endif;
?>

サブループを使った後は、必ずwp_reset_postdata()を呼び出してグローバルの投稿データをリセットしてください。
これを忘れると、サブループ以降のメインループが正しく動作しなくなる場合があります。

functions.phpで作成する場合の注意点

注意すべきポイント
  • テーマを変更するとカスタム投稿タイプが消える:functions.phpに記述したコードはテーマに紐づくため、テーマを切り替えるとカスタム投稿タイプが使えなくなります(データ自体はデータベースに残ります)。テーマ変更の可能性がある場合は、プラグインでの管理も検討してください。
  • 投稿タイプ名は後から変更しない:投稿タイプ名はURLの一部になるため、記事を投稿した後に変更するとURLが変わり、SEOやリンク切れの原因になります。
  • パーマリンクの更新を忘れない:カスタム投稿タイプの追加や変更後は、管理画面の「設定→パーマリンク」で「変更を保存」を必ず実行してください。
  • 子テーマで作業する:親テーマの functions.phpに直接記述すると、テーマ更新で消えてしまいます。

PHPが分からない方向け:おすすめプラグインの紹介

PHPの知識がない方や、コードを書くのに不安がある方は、プラグインを使ってカスタム投稿タイプを作成する方法もあります。
ここでは、よく使われるおすすめのプラグインを紹介します。

Custom Post Type UI

Custom Post Type UI(CPTUI)は、カスタム投稿タイプの作成で最もよく使われている定番プラグインです。

管理画面から直感的にカスタム投稿タイプやカスタムタクソノミーを作成・管理できます。
日本語にも対応しており、PHPの知識がなくても数クリックで設定が完了します。

functions.phpへのコード出力機能もあるため、プラグインで作成した設定をコードに変換して、後からfunctions.phpに移行するといった使い方も可能です。

Custom Post Type Maker

Custom Post Type Makerは、シンプルな操作でカスタム投稿タイプを作成できるプラグインです。

CPTUIと比較するとシンプルな構成で、必要最低限の設定項目に絞られています。
複雑な設定が不要で、手軽にカスタム投稿タイプを追加したい場合におすすめです。

VK All in One Expansion Unit

VK All in One Expansion Unit(ExUnit)は、無料テーマ「Lightning」の開発元であるベクトル社が提供する多機能プラグインです。

カスタム投稿タイプの作成機能のほかに、CTA(コール・トゥ・アクション)、SNS連携、見出し設定など多くの機能がセットになっています。
Lightningテーマを使っている場合は特に相性が良いです。

プラグインとfunctions.phpの使い分け

プラグインがおすすめの方
  • PHPのコードを書くことに不安がある
  • カスタム投稿タイプを頻繁に追加・変更する
  • テーマを変更する可能性がある
functions.phpがおすすめの方
  • プラグインの数を減らして表示速度を重視したい
  • パラメータを細かく制御したい
  • テーマに組み込んで運用する前提である

最後に

今回は、ワードプレスのカスタム投稿タイプを、
プラグインを使用せずにfunctions.phpだけで作成する手順を紹介しました。

カスタム投稿タイプの作成は、register_post_type()関数をinitフックに登録するだけで実装できます。
カテゴリーやタグが必要な場合はregister_taxonomy()も追加し、コード記述後はパーマリンクの更新を忘れないようにしましょう。

PHPに不安がある方は、Custom Post Type UIなどのプラグインを活用すれば、管理画面から簡単にカスタム投稿タイプを作成できます。

当記事のコードを参考に、サイトの用途に合ったカスタム投稿タイプを作成してみてください。

コメント

タイトルとURLをコピーしました