【WordPress】カスタム投稿タイプの作り方と使い方


WordPressでは、Webサイトのコンテンツを主に「投稿」と「固定ページ」を使って、記事を書き、管理します。

「投稿」と「固定ページ」以外で、記事を投稿したいと思ったことはありませんか?

それを可能にするのが『カスタム投稿タイプ』。

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

投稿タイプを追加することができる機能のこと。

投稿タイプとは、『投稿記事を書き込む編集場所』のことで、WordPressには、通常、「投稿」と「固定ページ」の2つが用意されています。

カスタム投稿タイプの機能を利用することで、「投稿」と「固定ページ」以外に新たな投稿タイプを追加できます。

そして、「投稿」や「固定ページ」と同じような編集画面で、データを入力できます。

以下で、カスタム投稿タイプの作り方と使い方をご紹介します。

カスタム投稿タイプの使い道

たとえば、ECサイト(ネットショップ)を作り、新着情報と商品情報の2つの記事(コンテンツ)を扱うとします。

通常であれば、これら両方を「投稿」だけで管理することになり、カテゴリー管理や投稿する制作者(author)の権限などが複雑になってきます。

このように、1つのサイトの中で、複数のコンテンツを扱いたい場合には、「カスタム投稿タイプ」がオススメ。

前述のECサイトの例だと、新着情報は「投稿」で扱い、商品情報は「商品」というカスタム投稿タイプで扱う、といった方法が考えられます。

また、ECサイトでなくても、ある程度複雑なWebサイトになると、「投稿」だけでは管理が難しくなるので、カスタム投稿タイプの意義も発生すると思います。

カスタム投稿タイプの作り方

カスタム投稿タイプを追加したい場合、「register_post_type関数」を使います。

また、後述しますが、パーマリンクを正しく動作させる必要もあります。

register_post_type関数を知ろう

関数は、次のように記述します。

<?php register_post_type(カスタム投稿タイプ名,引数の配列); ?>

register_post_type関数には、2つのパラメータを渡します。

1つ目は、カスタム投稿タイプ名(カスタム投稿タイプに付ける名前)、2つ目は、引数の配列(カスタム投稿タイプの動作設定等)を指定します。

パラメータ 内容 初期値
カスタム投稿タイプ名 カスタム投稿タイプの名前を指定。この文字列は、URLにも反映されます。
半角英数字で最大20文字以内、大文字や空白は禁止
なし
引数の配列 カスタム投稿タイプの機能を設定。連想配列で指定。 なし

2つ目のパラメータ「引数」では、連想配列(array (A => B))を渡してカスタム投稿タイプの動作を指定します。

連想配列に指定する値は多数ありますが、最低限「label」と「public」の2つの値を渡します。

パラメータ
キー
動作 初期値
label カスタム投稿タイプに付けるラベル 1つ目のパラメータに指定した値
public 公開の有無を指定。
trueで公開、falseで非公開(内部だけで利用)
false

「label」は、管理画面に表示する「カスタム投稿タイプのラベル」を表します。指定しなくてもよいが、日本語で指定した方がユーザビリティは高くなります。

また、Webサイトは、公開しないと意味がないので、「public」には、trueを渡します。
※「カスタム投稿タイプのラベル」とは、WordPressの管理画面の左サイドメニューに表示される項目名のこと。

たとえば、例をあげると…

「商品」に関するカスタム投稿タイプを追加する場合、たとえば、カスタム投稿タイプ名には、「product」、そのラベルを「商品」にするとします。

この場合、functions.phpに、次のような部分を入れると、WordPressの管理画面で最低限のデータを入力できる状態になります。

functions.phpを変更する場合、WordPressの管理画面からは、絶対に変更しないでください。

エラーが発生する可能性があります。変更をするなら、FTPソフトを利用するか、サーバーの編集機能を利用してください。

サーバーに『エックスサーバー』を使っているなら、下の記事を参照。
⇒【WordPress】エックスサーバーでfunctions.phpなどの「テーマ」を編集する

//カスタム投稿タイプ「商品」を追加
function add_product_posttype(){
  $args = array(
    'label' => '商品',
    'public' => true
);
  register_post_type('product', $args);
}
add_action('init','add_product_posttype');

カスタム投稿タイプを追加する処理を、「add_product_posttype」という名前の関数にしています。この関数の中で、「register_post_type関数」を実行します。
※「add_product_posttype」の関数名は、任意に変更可能。その場合、上記の2行目だけでなく、9行目も変更してください。

まず、変数$argsに、「引数」を格納します。ここでは最低限のパターンなので、「label」と「public」のみ。

次に、register_post_type関数の第一パラメータに「product」、第二パラメータに先ほどの変数$argsを書き込みます。

そして、重要なことになりますが、add_product_posttype関数が、必ず「init」というアクションフックのタイミングで実行するように、add_action関数を書き加えます

アクションフックとは?

アクションフックとは、プログラムが実行される「きっかけ」のこと。

スポンサーリンク

引数のパラメータ

register_post_type関数でカスタム投稿タイプを作成する場合、2つ目のパラメータに渡す連想配列で、動作を細かく設定できます。

指定できる要素が非常に多いので、ここでは主なものを取り上げます。詳しくは、以下のサイトを参照。

⇒WordPress Codex『register post type』

パラメータキー 動作 初期値
label カスタム投稿タイプに付けるラベル 1つ目のパラメータに指定した値
labels 管理画面の各部に表示するラベル。後述の表にて説明 labelの値
description カスタム投稿タイプの説明 なし
public 公開の有無。trueで公開、falseで非公開(内部だけで利用) false
exclude_from_search 検索からカスタム投稿タイプを除外するかどうか。trueで除外、falseで検索対象 publicの値
hierarchical 個々のカスタム投稿タイプに親子関係を持たせるかどうか。trueで親子関係有り、falseで無し false
menu_position 管理画面のメニューに表示する位置。5刻みで指定。5で「投稿」下、10で「メディア」下…。指定しない場合は、「コメント」下 値なし(null)
menu_icon 管理画面のメニューに表示するアイコンのURL。何も指定しないと投稿と同じアイコン 値なし(null)
show_in_admin_bar 管理バーでこのカスタムタイプを新規作成できるかどうか。trueで可能 show_in_menusに指定した値
supports カスタム投稿タイプを編集するページでサポートする機能を配列で指定。後述の表にて説明 array('title','editor')
has_archive カスタム投稿タイプのアーカイブ(一覧)を使用できるかどうか。trueで可能 false
capability_type カスタム投稿タイプの権限のタイプ post

labelsに渡す連想配列の内容

labelsを記述することで、管理画面で表示されるラベルを変更できます。

もし、「labels」で変更しない場合、「投稿」と「固定ページ」と同じように表示されます。

Web製作を依頼されているなら別ですが、このパラメータの指定は「all_item」以外は、不要かなと僕は思います。

要素名 設定内容 初期値
name カスタム投稿タイプ名の複数形 labelに指定した値
singular_name カスタム投稿タイプ名の単数形 nameと同じ値
menu_name メニューに表示するラベル nameと同じ値
name_admin_bar 管理バーの「新規追加」ドロップダウンに表示するラベル singular_nameの値
all_item 「◯◯一覧」などに使うラベル nameの値
add_new_item カスタム投稿の新規作成ページの左上に表示されるタイトル 新規投稿を追加
add_new メニューの「新規」の位置に表示するラベル 新規追加
new_item カスタム投稿一覧ページの右上の方にある新規作成ボタンのラベル 新規投稿(新規固定ページ)
edit_item カスタム投稿編集ページの左上に表示されるタイトル 投稿(固定ページ)を編集
view_item カスタム投稿編集ページの「○○を表示」ボタンのラベル 投稿(固定ページ)を表示
search_items カスタム投稿一覧ページの検索ボタンのラベル 投稿(固定ページ)を検索
not_found カスタム投稿を追加していない状態で、カスタム投稿一覧ページを開いた時に表示するメッセージ 投稿(ページ)が見つかりませんでした。
not_found_in_trash カスタム投稿をゴミ箱に入れていない状態で、カスタム投稿のゴミ箱ページを開いた時に表示するメッセージ ゴミ箱内に投稿(固定ページ)が見つかりませんでした。
parent_item_colon 「親〜」のラベル(階層化可能にしたカスタム投稿タイプの場合のみ) 親ページ:

画面上ではどうなるの?

①投稿の一覧ページ

②投稿の編集ページ

③管理画面の「管理バー」

supportsに指定する値

上記の表で説明したsupportsで指定する値ですが、以下のようなものがあります。

付加される機能
title タイトル
editor エディタ
author 作成者
thumbnail アイキャッチ画像
excerpt 抜粋
trackbacks トラックバック
custom-fields カスタムフィールド
comments コメント
revision リビジョン
page_attributes 並び順
post_formats 投稿フォーマット

カスタム投稿タイプを編集するページで、追加したい機能があれば、配列(array)で記述します。

たとえば、「作成者」「カスタムフィールド」「リビジョン」を追加したいなら、次のように書きます。


'support' => array('author','custom_fields','revision')

たとえば、例をあげると…

「商品」というカスタム投稿タイプを追加し、その細かな仕様を以下のようにしたいとします。

  • 編集画面のラベルが、投稿や固定ページと同じになるように変更
  • 「投稿」下に「商品」を表示する
  • 編集画面ではタイトル/エディタ/アイキャッチ画像/抜粋を使えるようにする
  • アーカイブ(一覧ページ)を使えるようにする

この場合、functions.phpに、次のような部分を追加します。

//カスタム投稿タイプ「商品」を追加
function add_product_posttype(){
  $args = array(
    'label' => '商品',
    'labels' => array(
      'all_items' => '商品一覧',
      'add_new_item' => '新規商品を追加',
      'new_item' => '新規商品',
      'edit_item' => '商品を編集',
      'view_item' => '商品を表示',
      'search_items' => '商品を検索',
      'not_found' => '商品が見つかりませんでした。',
    ),
    'public' => true,
    'menu_position' => 5,
    'supports' => array('title','editor','thumbnail','excerpt'),
    'has_archive' => true,
  );
  register_post_type('product',$args);
}
add_action('init','add_product_posttype');

僕なら、パラメータはこうする

たとえば、「商品」のカスタム投稿タイプを作成するなら、僕は、こう設定します。参考にしてください。

  • カスタム投稿タイプ名の表示は、日本語の方がわかりやすので、「label」を指定
  • labelsは、”一覧”という文言が欲しいので「all_items」のみ指定する
  • publicは、当然指定
  • 管理画面の左メニューの「投稿」の下に追加したカスタム投稿タイプを表示させたいので、「menu_position」は5を指定
  • supportsは、title、editor、thumbnail、excerpt、custom_fields、revisionを指定
  • アーカイブ(一覧ページ)は使用したいので「has_archive」はtrueに
//カスタム投稿タイプ「商品」を追加
function add_product_posttype(){
  $args = array(
    'label' => '商品',
    'labels' => array(
      'all_items' => '商品一覧'
    ),
    'public' => true,
    'menu_position' => 5,
    'supports' => array('title','editor','thumbnail','excerpt','custom_fields','revision'),
    'has_archive' => true,
  );
  register_post_type('product',$args);
}
add_action('init','add_product_posttype');
スポンサーリンク

パーマリンクを正しく動作させる

カスタム投稿タイプを追加する際に、パーマリンクも正しく動作するようにします。

一般的な方法

functions.phpに次のコードを追加し、「after_switch_theme」というアクションのタイミングで、カスタム投稿タイプを登録する処理と「flush_rewrite_rules関数」を実行します。

しかし、flush_rewrite_rules関数の処理を書き込むと、非常に重いサイトになってしまいます

そこでやって欲しいのが、WordPressの管理画面の左サイトメニューから、「設定→パーマリンク設定」に入り、『変更を保存』をクリックすること。別に内容を変更しなくてもOK!単にクリックするだけ。

デフォルト(http://example.org/?p=123)のパーマリンク構造の場合、正しく実行されないかもしれません。

変更を保存ボタンを押した際に、URLの書き換え(リライトルールの更新:flush_rewrite_rules の実行)が行われ、パーマリンクが正しく動作してくれます。

カスタム投稿タイプの使い方

カスタム投稿タイプを追加すると、WordPressの管理画面で、左のメニューバーにそのカスタム投稿を扱う項目が追加されます。

下の画像は、「商品」というカスタム投稿タイプを追加した場合です。

使い方は、「投稿」や「固定ページ」とまったく同じ。

ちなみに、URLは、カスタム投稿タイプ名が反映されたアドレスになります

たとえば、一例をあげると、カスタム投稿タイプ名を「product」で作成した場合、パーマリンク設定で『投稿名』を選択すると、次のようになります。

『◯◯.com/product/個別パーマリンク』

なので、カスタム投稿タイプ名は、しっかりと考えた上で、決めるようにしてください。

スポンサーリンク
ページ先頭へ