カスタム投稿タイプでオリジナル投稿を作る(プラグインなし)

WordPressのデフォルトでは投稿や固定ページという投稿タイプが用意されており、これらを使用して記事を作成することができます。

カスタム投稿タイプは、このデフォルトで存在する投稿タイプとは別に新たに自分で作成した投稿のことを指します。

作成方法はプラグインを使用する方法もありますが、この記事ではプラグインを使わないでカスタム投稿を作る方法をメモしていきます。

コードに慣れている、プラグインはあまり使いたくない場合は自作していきましょう。
またプラグインは機能が決まっているため、思う通りのカスタム投稿タイプがプラグインでは作れない場合も自作する必要があります。

カスタム投稿タイプを作るコード

カスタム投稿を作成するだけならそんなに難しくはありません。functions.php に以下コードを記述すると管理メニューに「カスタム投稿」が追加され、記事を作成することができます。

add_action('init', 'create_post_type_01');
function create_post_type_01() {
  $args = [
    'label' => 'カスタム投稿',
    'public' => true,
    'has_archive' => true,  
  ];
  register_post_type('custom_post_name',$args);
}

コードを追加したのに投稿タイプが表示されない場合、パーマリンク設定画面で「変更を保存」ボタンをクリックし、リロードして表示されるか確認してみてください。

register_post_type() のコードを追加していけば、複数のカスタム投稿タイプを登録することもできます。

add_action('init', 'create_post_type');
function create_post_type() {
  $args1 = [
    'label' => 'カスタム投稿1',
  ];
  register_post_type('custom_post_name_one',$args1);

  $args2 = [
    'label' => 'カスタム投稿2',
  ];
  register_post_type('custom_post_name_two',$args2);
}

register_post_type() というコードでカスタム投稿が登録されます。

register_post_type('投稿タイプ名',  オプション設定配列(ここでは$args));

登録したカスタム投稿タイプを使えるように add_action() を使用します。

add_action('init', '関数名');

投稿タイプ名で使えない名称もあり

カスタム投稿タイプ名を設定しますが、一部使えない名称があるため注意が必要です。すでにWordPressで使われている投稿タイプやWordPressの機能に干渉する名前は使用できません。

【WordPressにデフォルトで設定されている主な投稿タイプ】

投稿タイプ名投稿タイプ
投稿post
固定ページpage
添付ファイルattachment
リビジョンrevision
ナビゲーションメニューnav_menu_item
カスタムCSScustom_css
変更セットcustomize_changeset
参照 : What is Post Type? – WordPress.org Documentation

WordPressで投稿の種類というと投稿と固定ページが思い浮かびますが、投稿タイプはその他にも存在します。これらと同じ名称が使用できないので、このような投稿タイプがあることは覚えておきましょう。意図せず同じ名前をつけてしまった、という場合に覚えておくと対処しやすいです。

他にもWordPressの機能に干渉する名前もあるので、投稿タイプ名に使用しないようにします。

  • action
  • author
  • order
  • theme

この他、「wp_」 から始まる名前も使わない方がいいようです。今後WordPressの開発が進むにつれて投稿タイプ名に使用される可能性が高いためです。

「post_〇〇」や「theme_〇〇」といった名前なら問題ありません。

カスタム投稿タイプ作成コードの詳細

上述したコードは簡易的なものでしたが、カスタム投稿を作る際にはさまざまな機能を設定することができます。より柔軟にカスタマイズできるよう、設定コードの紹介とそれぞれどういった設定をしているのか詳細を記していきます。

// カスタム投稿タイプの追加
add_action('init', 'create_post_type');
function create_post_type() {
  // 投稿画面に表示するテキストを指定。初期値は「投稿」
  $labels = [
    'name' => '投稿タイプ名',
    'all_items' => 'すべての投稿を表すテキスト',
    'add_new_item' => '新規追加を表すテキスト',
    'edit_item' => '編集を表すテキスト',
  ];
  // 投稿タイプで追加・編集できる要素を指定。初期値はtitleとeditor。
  $supports = [
    'title',
    'editor',
    'thumbnail',
    'author',
    'custom-fields',
    'comments',
    'revisions',
    'page-attributes',
  ];
  $args = [
    'labels' => $labels,
    'public'  => true,
    'hierarchical'  => false,
    'has_archive'   => true,
    'supports'      => $supports,
    'menu_position' => 5,
    'taxonomies'    => array('new_category','new_tag'),
    'show_in_rest' => true,
    'rewrite'   => array( 'slug' => 'custom-slug' ),
  ];
  register_post_type('custom_post_name',$args);
}

基本の設定項目

$args の部分はカスタム投稿タイプを登録する際に必要になります。初期値で問題ない項目は省略しても大丈夫です。

    $args = [
      'labels' => $labels,
      'public'  => true,
      'hierarchical'  => false,
      'has_archive'   => true,
      'supports'      => $supports,
      'menu_position' => 5,
      'taxonomies'    => array('new_category','new_tag'),
      'show_in_rest' => true,
      'rewrite'   => array( 'slug' => 'custom-slug' ),
    ];

$labels$supports は、別でまとめて設定している内容が入ります。私は配列で設定するものは先にまとめます。その方が見やすく変更しやすいというのと、複数投稿タイプを作成するときも使い回しがしやすいことが理由です。

プロパティ
label投稿画面に表示するテキストの指定。
labels投稿画面に表示されるさまざまなテキストの指定。(配列で指定)
publictrue・false (初期値はfalse)
管理画面から投稿・編集できるようにする場合は「true」に。
「false」の場合は投稿タイプを公開せず管理画面からも使用不可。
hierarchicaltrue・false(初期値はfalse)
trueの場合は投稿の階層化が可能。(固定ページのようにページに親子関係を持たせることができる)
has_archivetrue・false(初期値はfalse)
カスタム投稿タイプのアーカイブページを表示させるかどうか。
一覧ページが必要な場合は「true」に。
supportsカスタム投稿で使用する投稿機能(タイトルやアイキャッチ画像など)を指定。
menu_position
管理画面で投稿タイプが表示されるメニューの位置。 初期値は「コメントの下」
menu_iconメニュー名のアイコン(ピンのやつ)。
taxonomies設定するカスタムタクソノミーを配列で指定。カスタムタクソノミーはregister_taxonomy関数で登録。初期値はタクソノミー無し。
register_taxonomy_for_object_type() を直接呼び出す代わりに使用可能。
show_in_resttrue・false(初期値はfalse)
RESET APIとGutenbergインターフェースの使用を設定。ブロックエディタを使用するときはtrue、クラシックエディタを利用したい場合はfalseにする。
rewiteスラッグに使用する名前を、投稿タイプ名と違う名前をつけたい場合に使用。
show_uitrue・false(初期値は public と同じ)
管理画面にカスタム投稿タイプを表示させるかどうか。false(非表示)の場合は表示されず編集もできない。
show_in_menutrue・false、もしくは文字列(初期値は「show_ui」の値)
管理画面のメニューバーに表示させるかどうか、また管理者メニューの投稿タイプを表示する場所。 ‘show_ui’ が false の場合はこちらを true にしても表示されない。
show_in_nav_menustrue・false(初期値はtrue)
【外観 > メニュー】の選択画面に表示させるかどうか。 ‘show_ui’ が false の場合はこちらを true にしても表示されない。
show_in_admin_bartrue・false(初期値はtrue)
上部のアドミンバーに「投稿一覧を表示」を表示するか
description投稿タイプに対する説明を記載。

ラベル設定【label, labels】

「label」や「labels」は 編集画面で表示されるテキストを設定する項目です。カスタム投稿名だけ設定すれば良いなら「label」で設定すればOK。編集画面でよりわかりやすい名称にしたい場合は複数のラベル設定ができる「labels」で設定します。

'label' => 'カスタム投稿',
'labels' => [
  'name' => 'カスタム投稿',
  // その他いろいろ設定可能
],

labels で設定できる内容は多くありますが、全てを設定せずとも投稿操作がしやすいように必要なところにラベルをつけていきましょう。

プロパティ
nameカスタム投稿タイプの名前(英語では通常複数形)
singular_nameカスタム投稿タイプの名前(英語では通常単数形)
menu_nameメニューに表示するラベル
all_itemsサイドバーに表示される記事一覧へのリンク文字
add_newサイドバーや記事一覧ページに表示される新規ページへのリンク文字
add_new_itemカスタム投稿の新規作成ページの左上に表示されるタイトル
edit_itemカスタム投稿編集ページの左上、ツールバーに表示されるタイトル
view_itemカスタム投稿編集ページの「○○を表示」ボタンのラベル
search_itemsカスタム投稿一覧ページの検索ボタンのラベル
not_found記事一覧ページで記事がないときに表示する文字
not_found_in_trashゴミ箱の記事一覧で記事がない時に表示する文字

公開設定【public】

「public」は、管理画面からの編集や投稿を公開するかの設定で、デフォルトは管理画面やフロンドエンドで利用できないようになっています。なので通常の投稿のように利用する場合は 'public' => true, の記述が必須です。

「public」が false のときに利用する内容として、サイト側では使用しないものの管理画面上では登録して表示させたいデータ(例えばお問い合せや顧客管理など)を作成したいときがあげられます。

「public」の値は、「exclude_from_search」「publicly_queryable」「show_ui」「show_in_nav_menus」の初期値に影響し、false の場合以下の設定になります。

  • show_ui = false … ユーザーインターフェースを表示しない。
  • publicly_queryable = false … この投稿タイプのクエリがフロントエンドで実行できない。
  • exclude_from_search = true … 検索結果からこの投稿タイプを除外。
  • show_in_nav_menus = false … ナビゲーションメニューでこの投稿タイプを選択肢から外す。

show_ui => true とすることで管理画面上では投稿の追加や編集、そしてその内容が閲覧できます。

add_action('init', 'create_post_type_02');
function create_post_type_02() {
  $args = [
    'label' => '管理画面のみで使用',
    'show_ui' => true,
  ];
  register_post_type('custom_post_name02',$args);
}

編集画面の機能設定【supports】

「supports」は投稿に使用する項目を設定します。初期値は title と editor です。
'supports' の記述がなければ title と editor のみ、'supports' があれば設定しているものが表示されるようになります。

title のみ、本文のみにしたいという場合は一方だけを記述します。この場合も配列で書くようにしてください。(配列で指定しないとエラーになる)

'supports'      => array('title'),
//  以下の書き方でもOK
'supports'      => ['title'],
項目名表示内容
titleタイトル入力を表示
editor本文入力を表示
thumbnailアイキャッチ画像設定を表示
(テーマ内で ‘post-thumbnails’ の設定も必要)
excerpt抜粋設定を表示
custom-fieldsカスタムフィールドを表示
commentsコメント数を編集画面に表示
rivisionsリビジョンを保存
page-attributesページの属性を表示。
ページ順序の入力欄と、
hierarchical を true にしている状態なら親ページの選択項目も表示
author作成者の表示
trackbacksトラックバック送信
post-formats投稿フォーマット表示
(テーマ内で ‘post-formats’ の設定も必要)
Post Formats – Documentation – WordPress.org

全て設定していると新規投稿画面は以下のようになります。

メニューの表示位置【menu_position】

「menu_position」で管理メニューの任意の箇所に項目を表示させることができます。 初期値は「コメントの下」ですが、別の場所にしたい場合はこのパラメーターを使用して変更しましょう。

値は数字で設定します。デフォルトのメニューは以下の数値で設定されているので、表示させたい箇所の数字を設定してください。

5「投稿」の下
10「メディア」の下
15「リンク」の下
※WPバージョン3.5以上の場合は非表示なのでメディアの下と同様
20「固定ページ」の下
25「コメント」の下
60メニューの初めの余白部分の下
65「プラグイン」の下
70「ユーザー」の下
75「ツール」の下
80「設定」の下
100メニューの2つめの余白部分の下
【参照】メニューの位置 | WordPress Developer Resources

一覧ページと詳細ページを表示する

カスタム投稿タイプを作成したら、一覧・詳細ページを表示させるためのファイルも追加する必要があります。

カスタム投稿タイプ、投稿タイプのテンプレートファイルを作成したら、ちゃんとページが表示されるか確認してみましょう。

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

WordPressでは各ページに使用されるテンプレートファイルが、ファイル名で決められています。

一覧ページに使用されるテンプレートファイル

  • archive-post_type_name.php
  • archive.php

個別ページに使用されるテンプレートファイル

  • single-post_type_name.php
  • single.php
  • singular.php

「post_type_name」には投稿タイプ名に付けた名前が入ります。投稿タイプ名が product なら「archive-product.php」となります。

投稿タイプごとにデザインや表示方法を分けたい場合は、投稿タイプ名を追加したファイルを作ります。同じ表示でよければ archive.php や single.php があればOK。

これらのテンプレートファイルがない場合、index.php が使用されますので、うまく表示されない場合は、まずファイルが作成されているか確認してみてください。

「ページが見つかりません」(404)になってしまう

ページが表示されない場合、パーマリンク設定やコードの記述ミスがないか確認しましょう。

初めてカスタム投稿のページにアクセスした際に「ページが見つかりません」の状態になったら、まずは管理画面の【設定 > パーマリンク】で設定内容は変更せずとも「変更を保存」だけをクリックしてみてください。これだけで表示されることもあります。

カスタム投稿にカテゴリーやタグを追加(カスタムタクソノミー)

カスタム投稿タイプでは taxonomies の設定でカテゴリーやタグを追加することができます。投稿に使われているカテゴリーやタグを使用する場合は以下のように記述します。

'taxonomies' => array('category', 'post_tag')

投稿のカテゴリーやタグ以外を使用したい場合は、カスタムタクソノミーを作って指定します。

index