• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

投稿タイプ

提供: WordPress Codex 日本語版
移動先: 案内検索

この項目「投稿タイプ」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、Codex ドキュメンテーションにご協力下さい。

WordPress は多数の異なるタイプのコンテンツを保存し、表示することができます。投稿はひとつの投稿タイプですが、任意の投稿タイプのコンテンツを WordPress の内部では投稿と呼んでいます。どの投稿タイプのコンテンツもすべてひとつの場所(データベースの wp_posts テーブル)に格納されていて、post_type というカラムによって区別されます。

WordPress 3.0 からは自分でカスタム投稿タイプを追加して異なる用途に利用できるようになっています。

デフォルトの投稿タイプ

WordPress にはデフォルトで5つの主要な投稿タイプがあります。ユーザーが使えるものと内部で使われるものです:

  • 投稿 (投稿タイプ: 'post')
  • 固定ページ (投稿タイプ: 'page')
  • 添付ファイル (投稿タイプ: 'attachment')
  • リビジョン (投稿タイプ: 'revision')
  • ナビゲーションメニュー (投稿タイプ: 'nav_menu_item')

投稿 (post)

WordPress の投稿 (post) はブログで最もよく使われる投稿タイプです。投稿はふつう一番新しいものが最初にくる反時系列順で表示されます。投稿フィードの作成にも使われます。

固定ページ (page)

WordPress の固定ページ (page) は投稿に似ていますが、投稿の時系列構造の外にあります。固定ページは異なるページテンプレートを使って表示できます。また固定ページは他の固定ページを親に持つ階層化した構造にすることもできますが、ふつうはカテゴリータグをつけることができません。パーマリンクを有効にすると、固定ページパーマリンクはメインサイトの URL と固定ページの名前(親があれば親の名前も)を組み合わせたものになります。この名前はスラッグとも呼ばれる、親しみやすく URL として正しい形式の文字列です。この違いについて詳しくは固定ページの説明を見てください。

添付ファイル (attachment)

添付ファイル (attachment) は特別な投稿で、WordPress のメディアアップロードシステムを使ってアップロードされたファイルについて、ファイル名や説明などの情報を保持します。これらの情報はメタデータと呼ばれ、wp_postmeta テーブルに格納されている情報とリンクしています。例えばファイルが画像の場合、画像のサイズや自動生成されたサムネイル、ファイルの場所、HTML の alt 属性用テキスト、画像に埋め込まれていた EXIF データから取得した情報などです。

リビジョン (revision)

リビジョン (revision) は下書きや公開済みの投稿・固定ページの変更履歴を保存するための投稿タイプです。リビジョンは基本的には元となる公開済みの投稿や固定ページと同じ形式のデータですが、それを親とする点が違います。親は wp_posts テーブルの post_parent カラムで表されます。

ナビゲーションメニュー (nav_menu_item) は WordPress のナビゲーションメニューシステムの各メニュー項目を保存するための投稿タイプです。これは wp_posts テーブルの項目がサイト内に表示できるコンテンツ以外にも使えるという最初の例と言えるでしょう。


カスタム投稿タイプ

カスタム投稿タイプは自分で作れる新しい投稿タイプです。register_post_type 関数を使って WordPress へカスタム投稿タイプを追加できます。そのときラベル、サポートする機能、使える場面や他の特徴を指定して投稿タイプを定義できます。

参考:register_post_type() は必ずアクション フックadmin_menu /en より前、after_setup_theme /en より後に呼び出さなければなりません。init /en フック を使うのが良いでしょう。

以下はカスタム投稿タイプ追加の基本的な一例です。

add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
        'name' => __( 'Products' ),
        'singular_name' => __( 'Product' )
      ),
      'public' => true,
      'has_archive' => true,
    )
  );
}

上の例は acme_product という識別子(スラッグ)で Product という名前の投稿タイプを作ります。register_post_type() 関数には主な引数が2つあります。1つめは "labels" で、投稿タイプの名前(単数形と複数形)を定義します。2つめは "public" です。これは予め定義されたフラグで、この投稿タイプ管理画面に表示するとともに、要求があったときにサイトのコンテンツとして表示されるようにします。

register_post_type 関数にはさまざまなパラメータを追加できます。階層を設定する(固定ページのように)、検索で新しいカスタム投稿タイプを表示する、新規投稿の URL を変更する、投稿編集画面でメタボックスを表示する/隠す、といったことができます。これらのパラメータはオプションで、投稿タイプを詳細にカスタマイズするときに使用できます。

アーカイブページ

index またはアーカイブページ(先ほどの例では /acme-product)をアクセス可能とするには、カスタム投稿タイプ用テンプレートのセクションで説明するようにパーマリンク構造を更新(または「フラッシュ」)する必要があります。index 用のテンプレートファイルはテンプレート階層を参照してください。

カスタム投稿タイプのプラグイン化

テーマを切り替えたときにサイトが壊れるのを防ぐため、カスタム投稿タイプをプラグインとして定義するのが良いでしょう。もっと良いのは Must Use Plugins /en にすることです。こうすればユーザーに特定のテーマを強制しなくて済みます。

良い名前の付け方

コアの投稿タイプ "post", "page", "revision", "attachment" や "nav_menu_item" と一貫性がある product のようなシンプルな名前をつけるのが簡単ですが、それよりも名前空間を接頭辞に付けてカスタム投稿タイプを実装するプラグイン/テーマ/ウェブサイト等を特定すると良いでしょう。

例:

  • "acme_product" または "aw_product" - 仮想の ACMEWidgets.com で使用する製品投稿タイプ
  • "eightfold_product" または "eft_product" - 仮想の "EightFold" テーマで提供される製品投稿タイプ
  • "ai1m_product" - 仮想の "All-in-One Merchant" プラグインで提供される製品投稿タイプ

カスタム投稿タイプに名前空間を付けないと、あなたのウェブサイトのカスタム投稿が将来愛用するテーマや必要となるプラグインで定義されるカスタム投稿と衝突する可能性があります。カスタム投稿タイプテーマを開発しているのであれば、あなたのプラグインテーマがユーザが使用しているプラグインテーマカスタム投稿タイプと衝突する可能性はもっと高いでしょう。名前空間を付けると(絶対に衝突しない訳ではありませんが)可能性を確実に小さくできます。

名前空間を付けることで20文字を越えないように注意してください。データベースの post_type カラムは現時点では最大20文字です。

予約済みの投稿タイプ名

コア開発チームはまだ最終決定していませんが、コアの投稿タイプに「wp_」という名前空間を付けることが wp-hackers メーリングリストで提案されています。つまり、もしコアチームが event 投稿タイプを追加すると決定した場合、この提案によると内部での名前は「wp_event」を使用します。この提案は決定ではありませんが、名前が wp_ で始まるカスタム投稿タイプは避けたほうが良いでしょう。

カスタム投稿タイプの管理画面

上の例のようにしてカスタム投稿タイプを作成すると、その投稿タイプの投稿を作成したり編集したりする管理メニュー項目が管理画面の最上位レベルに用意されます。そのメニュー項目から専用の管理画面をアクセスできます。そこには投稿エディターとカスタム投稿タイプがサポートすべきとして register_post_type() 関数の supports 引数で指定したすべてのものを含む投稿編集画面などがあります。この画面はいくつかの アクション および フィルター フック でカスタマイズできます。カスタム投稿タイプの概要(一覧)画面の変更方法とコード例については Yoast による Custom Post Type Snippets を見てください。

URL

カスタム投稿タイプはサイトの URL 構造の中に専用の スラッグ を持ちます。上記の例の場合、製品 カスタム投稿タイプの投稿は http://example.com/acme_product/%product_name% という URL で表示できます。ここで acme_productカスタム投稿タイプスラッグ%product_name% は特定の製品(つまり product の投稿)のスラッグですので、パーマリンクは例えば http://example.com/acme_product/foobrozinator になります。デフォルトの投稿タイプと同様に、カスタム投稿タイプ投稿編集画面にこのパーマリンクが表示されます。

名前空間付きカスタム投稿タイプの URL

カスタム投稿タイプの識別子の名前空間をつける時にきれいな URL 構造を使用したい場合は、register_post_type() 関数の rewrite 引数をセットする必要があります。上記の ACME Widgets という例の場合は次のようにします:

add_action( 'init', 'create_posttype' );
function create_posttype() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
        'name' => __( 'Products' ),
        'singular_name' => __( 'Product' )
      ),
      'public' => true,
      'has_archive' => true,
      'rewrite' => array('slug' => 'products'),
    )
  );
}

上記は http://example.com/products/%product_name% のような投稿 URL になります。

参考:ここではスラッグに複数形を使用していますが、これは製品リストのページは http://example.com/products/ のほうがより論理的な URL を意味するので好む人たちがいるからです。

参考:products のような一般的な名前をスラッグに使用すると、同じ名前を使用するプラグインテーマと衝突する可能性があります。しかしほとんどの人は長くて不明瞭な http://example.com/acme_products/foobrozinator のような URL を嫌うでしょう。それに2つのプラグイン間の URL 衝突を解決するのは簡単です。なぜなら URL 構造はデータベースの投稿レコードに保存されておらず、カスタム投稿タイプ名が保存されるのと同じ方式ではないからです。


カスタム投稿タイプ用テンプレート

WordPress のテーマシステムはカスタム投稿タイプ用のテンプレートもサポートします。カスタム投稿タイプの投稿ひとつを表示するカスタムテンプレートバージョン 3.0 からサポートされました。またアーカイブ用のテンプレートのサポートは バージョン 3.1 で追加されました。

参考:カスタム投稿タイプの投稿を表示する新しいテンプレートファイルをアクセス可能とするために、パーマリンク構造を更新しなければならない場合があります。これを行うには、管理画面 > 設定 > パーマリンク設定 を開いて、一度パーマリンク構造を別のものに変えて保存し、元の構造へ戻して(それをもう一度保存)ください。

テンプレートファイル

single.php および archive.php テンプレートファイルを使って単一の投稿やアーカイブを表示するのと同様に、

  • カスタム投稿タイプの単一投稿は single-{post_type}.php を使って
  • そのアーカイブは archive-{post_type}.php を使って
  • もしカスタム投稿タイプアーカイブページを作らないなら BLOG_URL?post_type={post_type} を指定して

表示することができます。ここで {post_type}register_post_type() 関数の $post_type 引数に指定したものです。

したがって上の例の場合、製品の単一投稿とアーカイブ用に single-acme_product.phparchive-acme_product.php テンプレートファイルを作って使うことができます。

別の方法もあります。is_post_type_archive() 関数を任意のテンプレートファイル内で使って、クエリが特定の投稿タイプのアーカイブページを示しているかチェックします。そして post_type_archive_title() を使って投稿タイプのタイトルを表示します。


投稿タイプによるクエリ

WordPress テーマシステムの任意のテンプレートファイル内で、特定の投稿タイプの投稿を表示する新しいクエリを作成することもできます。これには WP_Query オブジェクトの post_type 引数を使います。

例:

$args = array( 'post_type' => 'product', 'posts_per_page' => 10 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
  the_title();
  echo '<div class="entry-content">';
  the_content();
  echo '</div>';
endwhile;

これは「製品」投稿の最新10件をループし、ひとつずつタイトルと本文を表示します。

メインクエリにおけるカスタム投稿タイプ

カスタム投稿タイプを登録してもメインクエリへ自動的に追加されるわけではありません。

自分のカスタム投稿タイプを他の投稿タイプと混ぜて標準のアーカイブやホームページへ表示するには、pre_get_posts /en アクション フック を使ってください。

// 'post', 'page' および 'movie' 投稿タイプの投稿をホームページに表示する
add_action( 'pre_get_posts', 'add_my_post_types_to_query' );

function add_my_post_types_to_query( $query ) {
  if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'movie' ) );
  return $query;
}

関数リファレンス


投稿タイプ: register_post_type(), add_post_type_support(), remove_post_type_support(), post_type_supports(), post_type_exists(), set_post_type(), get_post_type(), get_post_types(), get_post_type_object(), get_post_type_capabilities(), get_post_type_labels(), is_post_type_hierarchical(), is_post_type_archive(), post_type_archive_title()


追加情報

日本語情報

英語情報


最新英語版: WordPress Codex » Custom Post Types最新版との差分