- サイトデザイン工事中です。ご意見をお寄せください。
- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
投稿タイプ
WordPress は多数の異なるタイプのコンテンツを保存し、表示することができます。内部ではこれらはすべてひとつの場所(データベースの wp_posts テーブル)に格納されています。これらは、post_type というカラムによって差別化されています。
WordPress 3.0 からは、自分でカスタム投稿タイプを追加して異なる用途に利用できるようになっています。
目次 |
デフォルトタイプ
WordPress には5つの主要なデフォルト投稿タイプがあります。
投稿 (post)
WordPress での投稿 (post) は、ブログで使われるメインの投稿タイプです。投稿は通常、一番新しいものが最初にくる反時系列順で表示されます。投稿はフィードの作成にも使われます。
ページ (page)
WordPress でのページ (page) は投稿に似ていますが、投稿の時系列構造の外にあります。ページはメインのサイトドメインのすぐ下にくる独自 URL を持っており、特別なページテンプレートを使って表示することができます。また、他のページを親に持つ階層化した構造にすることもできます。
添付ファイル (attachment)
添付ファイル (attachment) は特別な投稿で、メディアアップロードシステムを使ってアップロードされたファイルについて、ファイル名・説明などすべての情報が含まれます。例えばファイルが画像の場合、画像のサイズや自動生成されたサムネイル、ファイルの位置、埋込み EXIF 情報などです。
リビジョン (revision)
リビジョン (revision) は下書きや既存の投稿・ページの過去の変更履歴を保存するための投稿タイプです。投稿・ページタイプと基本的には同じような内容ですが、元となる投稿・ページが親となります。
ナビゲーションメニュー (nav_menu) はナビゲーションメニューシステムの各メニュー項目を保存するための投稿タイプです。posts テーブルの項目がサイト内に表示出来るコンテンツ以外にも使えるという最初の例と言えるでしょう。
カスタム投稿タイプ
WordPress にカスタム投稿タイプを追加するには、register_post_type 関数を使って独自の投稿タイプとその動作を定義します。
以下はカスタム投稿タイプ追加の基本的な一例です。
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
)
);
}
"Product" というカスタム投稿タイプを作成します。主な引数が2つあります。一つ目は "labels" で、タイプ名(単数形と複数形)を定義します。二つ目は "public" で、管理画面でこの投稿タイプを表示し、要求があったときにメインサイトでも表示するかどうかを事前定義するフラッグです。
register_post_type 関数には、さまざまなパラメータを追加することができます。階層を設定する、検索で新しいカスタム投稿タイプを表示する、新規投稿の URL を変更する、投稿編集画面でメタボックスを表示する/隠す、といったことが可能です。これらのパラメータはオプションで、投稿タイプを詳細にカスタマイズするときに使用できます。
良い名前の付け方
"product" のような単純な名前をつけると、コアの投稿タイプ "post", "page", "revision", "attachment" や "nav_menu_item" と一貫性があるので便利です。よりよい名前を付けるには、短い "名前空間" を接頭辞に付け、カスタム投稿タイプを実装するプラグイン/テーマ/ウェブサイト等を特定するとよいでしょう。
例:
- "acme_product" または "aw_product" - 仮想の ACMEWidgets.com で使用する製品投稿タイプ。
- "eightfold_product" または "eft_product" - 仮想の "EightFold" テーマで提供される製品投稿タイプ。
- "ai1m_product" - 仮想の "All-in-One Merchant" プラグインで提供される製品投稿タイプ。
カスタム投稿タイプに名前空間を付けないと、あなたのウェブサイトのカスタム投稿が、将来愛用するテーマや、必要となるプラグインで定義されるカスタム投稿と衝突する可能性があります。カスタム投稿タイプやテーマを開発しているのであれば、あなたのプラグイン/テーマが、ユーザが使用しているプラグイン/テーマ/カスタム投稿タイプと衝突する可能性はもっと高いでしょう。名前空間を付けると、絶対に衝突しない訳ではありませんが、可能性を最小にするでしょう。
名前空間を付けることで、20 文字を越えないように注意してください。データベースの post_type カラムは現時点では最大 20 文字です。
予約済みの投稿タイプ名
コア開発チームは、まだ最終決定はしていませんが、wp-hackers メーリングリストでコア投稿タイプは "wp_" という名前空間を付けることが提案されています。つまり、もしコアチームが "Event" 投稿タイプを追加することを決定した場合、この提案によると内部での名前は "wp_event" を使用します。この提案は決定ではありませんが、"wp_" で始まる名前のカスタム投稿タイプは避けたほうが良いでしょう。
関数リファレンス
管理画面
カスタム投稿タイプを作成すると、管理画面セクションに、新しい投稿タイプの投稿を作成する最上位レベルエントリが作成されます。投稿エディタに移動して、編集することができます。
URL
新しい投稿タイプは、サイトレイアウトも独自のセクションを持ちます。上記の例では、新しい "product" 投稿タイプの投稿は、http://example.com/product/%product_name% (ここで %product_name% は製品名を URL 化したもの、つまり http://example.com/product/foobrozinator) で表示されます。他の投稿と同様、新しい投稿タイプの編集ページでこのリンクが表示されます。
名前空間付きカスタム投稿タイプの URL
名前空間を付けて、かつきれいな URL 構造を使用したい場合は、"rewrite" 要素を配列に追加する必要があります。以下は、上記の "ACME Widgets" という例の場合です。
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,
'rewrite' => array('slug' => 'products')
)
);
}
上記は、http://example.com/products/%product_name% (上記の %product_name% の説明を参照) のような URL になります。ここでは複数形を使用していますが、これは製品のリストのページには、http://example.com/products/ のほうがより論理的な URL を意味するので、人々がこちらを好むからです。
ここで "products" のような一般的な名前を使用することで、同じ名前を使用するプラグインやテーマと衝突する可能性があることに注意してください。しかし、ほとんどの人は、長くて不明瞭な http://example.com/acme_products/foobrozinator のような URL を嫌うでしょう。2 つのプラグイン間の URL 衝突を解決するのは簡単です。なぜなら、URL 構造はデータベースの投稿レコードに保存されておらず、カスタム投稿タイプ名が保存されるのと同じ方式ではないからです。(because the URL structure is not stored persistently in each post record in the database in the same way custom post type names are stored.
シングルテンプレート
テーマシステムでも、single-type テンプレート形式で投稿タイプをサポートします。single.php で投稿を表示するのと同様に、カスタム投稿タイプは(存在するなら) single-type.php を使用します。上記例では、single-acme_product.php ファイルを作成して、このテンプレートを使用して product 投稿を表示できます。
投稿タイプによるクエリ
テーマシステムでは、特定の投稿タイプの投稿を表示する新しいクエリを作成することもできます。WP_Query に "post_type" パラメータを追加してくdださい。
例:
$loop = new WP_Query( array( 'post_type' => 'product', 'posts_per_page' => 10 ) ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile;
product 投稿の最新 10 件をループし、タイトルと本文を表示します。
追加情報
日本語情報
- WordPress 3.0のカスタム投稿タイプ機能(その1)
- WordPress 3.0のカスタム投稿タイプ機能(その2)
- カスタム投稿タイプ(Custom Post Type)の導入と使い方 (WordPress 3.0)
- カスタム投稿タイプの投稿数をダッシュボードに表示する
英語情報
- Showing custom post types on your home/blog page
- Custom post types in WordPress
- Custom Post Types in WordPress 3.0
- Extending Custom Post Types in WordPress 3.0
最新英語版: WordPress Codex » Custom Post Types (最新版との差分)
pt-br:Tipos de Posts Customizados