カスタム投稿タイプとは?

WordPressにはデフォルトで投稿機能が備わっています。投稿はカテゴリ分けをするなどしてそれだけでも十分使うことができます。

しかし管理するコンテンツの種類が多くなるとどうしても違った使い方をしたいコンテンツが出てきたり、管理しにくくなったりします。

そんな時は投稿機能と同じようなメニューをオリジナルで追加することができます。カスタム投稿はプラグインでも追加することができますが、無駄にプラグインを増やすとコンフリクトを起こしたり、脆弱性が増すこともあるため今回はテーマのfunctions.phpを使ってカスタム投稿を追加します。

functions.phpでカスタム投稿を設定

今回は「ニュース」という名前のカスタム投稿を追加します。まずコードをみてみましょう。

functions.php

function create_news_post_type() {
  $newsSupports = [
    'title',  // 記事タイトル
    'editor', // エディタ
    'excerpt', // 抜粋文
    'thumbnail',  // アイキャッチ画像
    'revisions'  // リビジョン
  ];
  register_post_type( 'news',  // カスタム投稿名
    array(
      'label' => 'NEWS',  // 管理画面の左メニューに表示されるテキスト
      'public' => true,  // 投稿タイプをパブリックにするか否か
      'has_archive' => true,  // アーカイブを有効にするか否か
      'menu_position' => 5,  // 管理画面上でどこに配置するか
      'show_in_rest' => true, // ブロックエディタを使用、REST APIからのデータ取得の許可
      'rest_base' => 'news', // /wp-json/wp/v2/newsのようにデータを取得できるURLの末尾の設定
      'supports' => $newsSupports  // 編集画面でどの機能を使うかの設定
    )
  );
  //カスタムタクソノミーの設定
  register_taxonomy(
    'newscat', //カテゴリー名(任意)
    'news', //カスタム投稿名
    array(
      'hierarchical' => true, // カテゴリーの親子関係の有無
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー', // メニューでの表示文字列
      'show_admin_column' => true, // 管理画面の一覧に表示
      'public' => true,
      'show_ui' => true,
      'show_in_rest' => true
    )
  );
}
add_action( 'init', 'create_news_post_type' );

順番にコードの中身をみていきます。

カスタム投稿の編集画面で利用する機能の設定

$newsSupports = [
    'title',  // 記事タイトル
    'editor', // エディタ
    'excerpt', // 抜粋文
    'thumbnail',  // アイキャッチ画像
    'revisions'  // リビジョン
];

まず編集画面で使用するモジュールを設定します。タイトルとエディタ以外にも必要なものがあれば随時追加してください。

今回は抜粋文とアイキャッチとリビジョンを入れています。

カスタム投稿タイプの諸設定

  register_post_type( 'news',  // カスタム投稿名
    array(
      'label' => 'NEWS',  // 管理画面の左メニューに表示されるテキスト
      'public' => true,  // 投稿タイプをパブリックにするか否か
      'has_archive' => true,  // アーカイブを有効にするか否か
      'menu_position' => 5,  // 管理画面上でどこに配置するか
      'show_in_rest' => true, // ブロックエディタを使用、REST APIからのデータ取得の許可
      'rest_base' => 'news', // /wp-json/wp/v2/newsのようにデータを取得できるURLの末尾の設定
      'supports' => $newsSupports  // 編集画面でどの機能を使うかの設定
    )
  );

register_post_typeを使ってカスタム投稿タイプの追加設定をします。

まずカスタム投稿名を設定します。今回はnewsにしています。

その他の設定を配列で設定します。

labelは管理画面のメニューで表示されるテキストです。

publicはtrueにしましょう。管理画面とフロントでカスタム投稿タイプが利用可能になります。

has_archiveはtrueにするとアーカイブが有効になります。アーカイブのスラッグは設定した投稿名、ここではnewsになります。

menu_positionはメニューの表示位置です。ここでは投稿の下に表示させています。

show_in_restはREST APIを有効にするかどうかです。有効化するとエディタがブロックエディタになります。REST API使いつつクラシックエディタを使用したい場合はクラシックエディタのプラグインを入れると良いです。

rest_baseはカスタム投稿タイプのREST APIのエンドポイントを設定できます。newsとするとhttps://sample-site.com/wp-json/wp/v2/newsでjson形式のデータにアクセスできます。

supportsは先ほどまとめた編集画面での使用モジュールの設定です。$newsSupportsを入れておきます。

カスタムタクソノミー の設定

  register_taxonomy(
    'newscat', //タクソノミー名(任意)
    'news', //カスタム投稿名
    array(
      'hierarchical' => true, // カテゴリーの親子関係の有無
      'update_count_callback' => '_update_post_term_count',
      'label' => 'カテゴリー', // メニューでの表示文字列
      'show_admin_column' => true, // 管理画面の一覧に表示
      'public' => true,
      'show_ui' => true,
      'show_in_rest' => true
    )
  );

次にカスタムタクソノミーの設定です。今回はカテゴリーとして使います。

タクソノミー の名前を好きなように決めてください。次にカスタム投稿タイプの名前を入れて、タクソノミー の設定をしていきます。

今回は親子関係ありでメニューにはカテゴリーと表記させています。

まとめ

以上がfunctions.phpでカスタム投稿タイプを設定する方法です。コピペして一部名称など変えるだけで簡単にカスタム投稿タイプが作れると思います。

ACF(Advanced Custom Fields)でカスタムフィールドを設定するとその投稿タイプ特有の入力欄などが設定できるので、用途が基本の投稿と分かれてしまったり、管理が大変な場合は是非使ってみてください。