当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

「投稿タイプ」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(日本語情報)
(英語版から反映分の和訳完了。)
 
(2人の利用者による、間の5版が非表示)
1行目: 1行目:
WordPress は多数の異なるタイプのコンテンツを保存し、表示することができます。内部ではこれらはすべてひとつの場所(データベースの <tt>[[データベース概要#Table:_wp_posts|wp_posts]]</tt> テーブル)に格納されています。これらは、<tt>post_type</tt> というカラムによって差別化されています。
+
{{CheckTrans}}
 +
__TOC__
  
[[Version 3.0|WordPress 3.0]] からは、自分で[[#Custom_Types|カスタム投稿タイプ]]を追加して異なる用途に利用できるようになっています。
+
WordPress は多数の異なるタイプのコンテンツを保存し、表示することができます。''投稿''はひとつの''投稿タイプ''ですが、任意の投稿タイプのコンテンツを WordPress の内部では投稿と呼んでいます。どの''投稿タイプ''のコンテンツもすべてひとつの場所(データベースの <tt>[[データベース概要#Table:_wp_posts|wp_posts]]</tt> テーブル)に格納されていて、<tt>post_type</tt> というカラムによって区別されます。
  
<div id="Default_Types">
+
[[Version 3.0|WordPress 3.0]] からは自分で[[#Custom_Types|カスタム投稿タイプ]]を追加して異なる用途に利用できるようになっています。
== デフォルトタイプ ==
+
 
 +
<div id="Default_Post_Types">
 +
== デフォルトの投稿タイプ ==
 
</div>
 
</div>
  
WordPress には5つの主要なデフォルト投稿タイプがあります。
+
WordPress にはデフォルトで5つの主要な投稿タイプがあります。ユーザーが使えるものと内部で使われるものです:
 +
 
 +
* 投稿 (投稿タイプ: 'post')
 +
* 固定ページ (投稿タイプ: 'page')
 +
* 添付ファイル (投稿タイプ: 'attachment')
 +
* リビジョン (投稿タイプ: 'revision')
 +
* ナビゲーションメニュー (投稿タイプ: 'nav_menu_item')
  
 
<div id="Post">
 
<div id="Post">
13行目: 22行目:
 
</div>
 
</div>
  
WordPress での投稿 (post) は、ブログで使われるメインの投稿タイプです。投稿は通常、一番新しいものが最初にくる反時系列順で表示されます。投稿はフィードの作成にも使われます。
+
WordPress の''[[Writing Posts|投稿]]'' (post) はブログで最もよく使われる投稿タイプです。''投稿''はふつう一番新しいものが最初にくる反時系列順で表示されます。''投稿''は[[Glossary#Feed|フィード]]の作成にも使われます。
  
 
<div id="Page">
 
<div id="Page">
=== ページ (page) ===
+
=== 固定ページ (page) ===
 
</div>
 
</div>
  
WordPress でのページ (page) は投稿に似ていますが、投稿の時系列構造の外にあります。ページはメインのサイトドメインのすぐ下にくる独自 URL を持っており、特別な[[Pages#Page_Templates|ページテンプレート]]を使って表示することができます。また、他のページを親に持つ階層化した構造にすることもできます。
+
WordPress の''[[Pages|固定ページ]]'' (page) は''投稿''に似ていますが、''投稿''の時系列構造の外にあります。''固定ページ''は異なる[[Pages#Page_Templates|''ページテンプレート'']]を使って表示できます。また''固定ページ''は他の''固定ページ''を親に持つ階層化した構造にすることもできますが、ふつうは''[[Glossary#Category|カテゴリー]]''と''[[Glossary#Tag|タグ]]''をつけることができません。''[[Permalinks|パーマリンク]]''を有効にすると、''固定ページ''の''パーマリンク''はメインサイトの URL と''固定ページ''の名前(親があれば親の名前も)を組み合わせたものになります。この名前は''[[Glossary#Slug|スラッグ]]''とも呼ばれる、親しみやすく URL として正しい形式の文字列です。この違いについて詳しくは''[[Pages|固定ページ]]''の説明を見てください。
  
 
<div id="Attachment">
 
<div id="Attachment">
25行目: 34行目:
 
</div>
 
</div>
  
添付ファイル (attachment) は特別な投稿で、メディアアップロードシステムを使ってアップロードされたファイルについて、ファイル名・説明などすべての情報が含まれます。例えばファイルが画像の場合、画像のサイズや自動生成されたサムネイル、ファイルの位置、埋込み EXIF 情報などです。
+
''[[Using Image and File Attachments|添付ファイル]]'' (attachment) は特別な投稿で、WordPress のメディアアップロードシステムを使ってアップロードされたファイルについて、ファイル名や説明などの情報を保持します。これらの情報はメタデータと呼ばれ、''[[Database_Description#Table:_wp_postmeta|wp_postmeta]]'' テーブルに格納されている情報とリンクしています。例えばファイルが画像の場合、画像のサイズや自動生成されたサムネイル、ファイルの場所、HTML の alt 属性用テキスト、画像に埋め込まれていた EXIF データから取得した情報などです。
  
 
<div id="Revisions">
 
<div id="Revisions">
31行目: 40行目:
 
</div>
 
</div>
  
リビジョン (revision) は下書きや既存の投稿・ページの過去の[[Revision_Management|変更履歴]]を保存するための投稿タイプです。投稿・ページタイプと基本的には同じような内容ですが、元となる投稿・ページが親となります。
+
''[[Revision Management|リビジョン]]'' (revision) は下書きや公開済みの投稿・固定ページの[[Revision_Management|変更履歴]]を保存するための投稿タイプです。''リビジョン''は基本的には元となる公開済みの投稿や固定ページと同じ形式のデータですが、それを親とする点が違います。親は ''wp_posts'' テーブルの ''post_parent'' カラムで表されます。
  
<div id="Nav_Menus">
+
<div id="Navigation_Menu">
=== ナビゲーションメニュー (nav_menu) ===
+
=== ナビゲーションメニュー (nav_menu_item) ===
 
</div>
 
</div>
  
ナビゲーションメニュー (nav_menu) は[[Appearance_Menus_SubPanel|ナビゲーションメニュー]]システムの各メニュー項目を保存するための投稿タイプです。posts テーブルの項目がサイト内に表示出来るコンテンツ以外にも使えるという最初の例と言えるでしょう。
+
''[[Navigation Menus|ナビゲーションメニュー]]'' (nav_menu_item) は WordPress の[[Appearance_Menus_SubPanel|ナビゲーションメニュー]]システムの各メニュー項目を保存するための投稿タイプです。これは ''wp_posts'' テーブルの項目がサイト内に表示できるコンテンツ以外にも使えるという最初の例と言えるでしょう。
  
<div id="Custom_Types">
+
 
 +
<div id="Custom_Post_Types">
 
== カスタム投稿タイプ ==
 
== カスタム投稿タイプ ==
 
</div>
 
</div>
  
WordPress にカスタム投稿タイプを追加するには、[[関数リファレンス/register_post_type|register_post_type]] 関数を使って独自の投稿タイプとその動作を定義します。
+
''カスタム投稿タイプ''は自分で作れる新しい''投稿タイプ''です。[[関数リファレンス/register_post_type|register_post_type]] 関数を使って WordPress へ''カスタム投稿タイプ''を追加できます。そのときラベル、サポートする機能、使える場面や他の特徴を指定して''投稿タイプ''を定義できます。
 +
 
 +
参考:<tt>register_post_type()</tt> は必ず''アクション [[Glossary#Hook|フック]]'' の ''[[プラグイン API/アクションフック一覧/admin_menu|admin_menu]]'' /[[:en:Plugin_API/Action_Reference/admin_menu|en]] より前、''[[プラグイン API/アクションフック一覧/after_setup_theme|after_setup_theme]]'' /[[:en:Plugin_API/Action_Reference/after_setup_theme|en]] より後に呼び出さなければなりません。''[[プラグイン API/アクションフック一覧/init|init]]'' /[[:en:Plugin_API/Action_Reference/init|en]] ''フック'' を使うのが良いでしょう。
  
 
以下はカスタム投稿タイプ追加の基本的な一例です。
 
以下はカスタム投稿タイプ追加の基本的な一例です。
  
add_action( 'init', 'create_post_type' );
+
<pre>
function create_post_type() {
+
add_action( 'init', 'create_post_type' );
  register_post_type( 'acme_product',
+
function create_post_type() {
    array(
+
  register_post_type( 'acme_product',
      'labels' => array(
+
    array(
        'name' => __( 'Products' ),
+
      'labels' => array(
        'singular_name' => __( 'Product' )
+
        'name' => __( 'Products' ),
      ),
+
        'singular_name' => __( 'Product' )
      'public' => true
+
      ),
    )
+
      'public' => true,
  );
+
      'has_archive' => true,
}
+
    )
 +
  );
 +
}
 +
</pre>
  
"Product" というカスタム投稿タイプを作成します。主な引数が2つあります。一つ目は "labels" で、タイプ名(単数形と複数形)を定義します。二つ目は "public" で、管理画面でこの投稿タイプを表示し、要求があったときにメインサイトでも表示するかどうかを事前定義するフラッグです。
+
上の例は ''acme_product'' という識別子(スラッグ)で ''Product'' という名前の''投稿タイプ''を作ります。<tt>[[関数リファレンス/register_post_type|register_post_type()]]</tt> 関数には主な引数が2つあります。1つめは "labels" で、''投稿タイプ''の名前(単数形と複数形)を定義します。2つめは "public" です。これは予め定義されたフラグで、この''投稿タイプ''を''[[Administration Screens|管理画面]]''に表示するとともに、要求があったときにサイトのコンテンツとして表示されるようにします。
 +
 
 +
[[関数リファレンス/register_post_type|register_post_type]] 関数にはさまざまなパラメータを追加できます。階層を設定する(''固定ページ''のように)、検索で新しい''カスタム投稿タイプ''を表示する、新規投稿の URL を変更する、投稿編集画面でメタボックスを表示する/隠す、といったことができます。これらのパラメータはオプションで、''投稿タイプ''を詳細にカスタマイズするときに使用できます。
 +
 
 +
<div id="Archive_page">
 +
=== アーカイブページ ===
 +
</div>
 +
 
 +
index またはアーカイブページ(先ほどの例では /acme-product)をアクセス可能とするには、[[#Custom_Post_Type_Templates|カスタム投稿タイプ用テンプレート]]のセクションで説明するようにパーマリンク構造を更新(または「フラッシュ」)する必要があります。index 用のテンプレートファイルは[[Template_Hierarchy|テンプレート階層]]を参照してください。
 +
 
 +
<div id="A_word_about_custom_post_types_as_a_plugin">
 +
=== カスタム投稿タイプのプラグイン化 ===
 +
</div>
  
[[関数リファレンス/register_post_type|register_post_type]] 関数には、さまざまなパラメータを追加することができます。階層を設定する、検索で新しいカスタム投稿タイプを表示する、新規投稿の URL を変更する、投稿編集画面でメタボックスを表示する/隠す、といったことが可能です。これらのパラメータはオプションで、投稿タイプを詳細にカスタマイズするときに使用できます。
+
テーマを切り替えたときにサイトが壊れるのを防ぐため、カスタム投稿タイプをプラグインとして定義するのが良いでしょう。もっと良いのは [[Must Use Plugins]] /[[:en:Must Use Plugins|en]] にすることです。こうすればユーザーに特定のテーマを強制しなくて済みます。
  
 
<div id="Naming_Best_Practices">
 
<div id="Naming_Best_Practices">
 
=== 良い名前の付け方 ===
 
=== 良い名前の付け方 ===
 
</div>
 
</div>
"product" のような単純な名前をつけると、コアの投稿タイプ "post", "page", "revision", "attachment" や "nav_menu_item" と一貫性があるので便利です。よりよい名前を付けるには、短い "''名前空間''" を接頭辞に付け、カスタム投稿タイプを実装するプラグイン/テーマ/ウェブサイト等を特定するとよいでしょう。
+
 
 +
コアの投稿タイプ "post", "page", "revision", "attachment" や "nav_menu_item" と一貫性がある ''product'' のようなシンプルな名前をつけるのが簡単ですが、それよりも'''名前空間'''を接頭辞に付けてカスタム投稿タイプを実装するプラグイン/テーマ/ウェブサイト等を特定すると良いでしょう。
  
 
例:
 
例:
  
* "acme_product" または "aw_product" - 仮想の ACMEWidgets.com で使用する製品投稿タイプ。
+
* "acme_product" または "aw_product" - 仮想の ACMEWidgets.com で使用する製品''投稿タイプ''。
* "eightfold_product" または "eft_product" - 仮想の "EightFold" テーマで提供される製品投稿タイプ。
+
* "eightfold_product" または "eft_product" - 仮想の "EightFold" テーマで提供される製品''投稿タイプ''。
* "ai1m_product" - 仮想の "All-in-One Merchant" プラグインで提供される製品投稿タイプ。
+
* "ai1m_product" - 仮想の "All-in-One Merchant" プラグインで提供される製品''投稿タイプ''。
  
カスタム投稿タイプに名前空間を付けないと、あなたのウェブサイトのカスタム投稿が、将来愛用するテーマや、必要となるプラグインで定義されるカスタム投稿と衝突する可能性があります。カスタム投稿タイプやテーマを開発しているのであれば、あなたのプラグイン/テーマが、ユーザが使用しているプラグイン/テーマ/カスタム投稿タイプと衝突する可能性はもっと高いでしょう。名前空間を付けると、絶対に衝突しない訳ではありませんが、可能性を最小にするでしょう。
+
''カスタム投稿タイプ''に名前空間を付けないと、あなたのウェブサイトの''カスタム投稿''が将来愛用する''テーマ''や必要となる''プラグイン''で定義される''カスタム投稿''と衝突する可能性があります。''カスタム投稿タイプ''や''テーマ''を開発しているのであれば、あなたの''プラグイン''/''テーマ''がユーザが使用している''プラグイン''/''テーマ''/''カスタム投稿タイプ''と衝突する可能性はもっと高いでしょう。名前空間を付けると(絶対に衝突しない訳ではありませんが)可能性を確実に小さくできます。
  
名前空間を付けることで、20 文字を越えないように注意してください。データベースの post_type カラムは現時点では最大 20 文字です。
+
名前空間を付けることで20文字を越えないように注意してください。データベースの post_type カラムは現時点では最大20文字です。
  
 
<div id="Reserved_Post_Type_Names">
 
<div id="Reserved_Post_Type_Names">
 
=== 予約済みの投稿タイプ名 ===
 
=== 予約済みの投稿タイプ名 ===
 
</div>
 
</div>
コア開発チームは、まだ最終決定はしていませんが、wp-hackers メーリングリストでコア投稿タイプは "'''wp_'''" という名前空間を付けることが提案されています。つまり、もしコアチームが "Event" 投稿タイプを追加することを決定した場合、この提案によると内部での名前は "wp_event" を使用します。この提案は決定ではありませんが、"wp_" で始まる名前のカスタム投稿タイプは避けたほうが良いでしょう。
 
  
<div id="Function_Reference">
+
コア開発チームはまだ最終決定していませんが、コアの''投稿タイプ''に「'''wp_'''」という名前空間を付けることが wp-hackers メーリングリストで提案されています。つまり、もしコアチームが ''event'' 投稿タイプを追加すると決定した場合、この提案によると内部での名前は「'''wp_'''event」を使用します。この提案は決定ではありませんが、名前が '''wp_''' で始まる''カスタム投稿タイプ''は避けたほうが良いでしょう。
=== 関数リファレンス ===
+
</div>
+
{{Post Type Tags}}
+
  
<div id="Admin_UI">
+
<div id="Custom_Post_Type_Screens">
=== 管理画面 ===
+
=== カスタム投稿タイプの管理画面 ===
 
</div>
 
</div>
 +
<!-- (or How to Add Custom Posts) -->
  
カスタム投稿タイプを作成すると、管理画面セクションに、新しい投稿タイプの投稿を作成する最上位レベルエントリが作成されます。投稿エディタに移動して、編集することができます。
+
[[#Custom Post Types|上の例]]のようにして''カスタム投稿タイプ''を作成すると、その''投稿タイプ''の投稿を作成したり編集したりする''[[Adding Administration Menus|管理メニュー項目]]''が管理画面の最上位レベルに用意されます。そのメニュー項目から専用の''[[Administration Screens|管理画面]]''をアクセスできます。そこには投稿エディターと''カスタム投稿タイプ''がサポートすべきとして <tt>[[関数リファレンス/register_post_type|register_post_type()]]</tt> 関数の ''supports'' 引数で指定したすべてのものを含む投稿編集画面などがあります。この画面はいくつかの ''[[Glossary#Action|アクション]]'' および ''[[Glossary#Filter|フィルター]]'' ''フック'' でカスタマイズできます。''カスタム投稿タイプ''の概要(一覧)画面の変更方法とコード例については Yoast による [http://yoast.com/custom-post-type-snippets/ Custom Post Type Snippets] を見てください。
  
 
<div id="URLs">
 
<div id="URLs">
99行目: 124行目:
 
</div>
 
</div>
  
新しい投稿タイプは、サイトレイアウトも独自のセクションを持ちます。上記の例では、新しい "product" 投稿タイプの投稿は、http://example.com/product/%product_name% (ここで %product_name% は製品名を URL 化したもの、つまり http://example.com/product/foobrozinator) で表示されます。他の投稿と同様、新しい投稿タイプの編集ページでこのリンクが表示されます。
+
''カスタム投稿タイプ''はサイトの URL 構造の中に専用の ''[[Glossary#Post_Slug|スラッグ]]'' を持ちます。上記の例の場合、''製品'' ''カスタム投稿タイプ''の投稿は <tt>http://<nowiki/>example.com/'''acme_product'''/'''%product_name%'''</tt> という URL で表示できます。ここで '''acme_product''' は''カスタム投稿タイプ''の''スラッグ''、'''%product_name%''' は特定の製品(つまり product の投稿)の''スラッグ''ですので、''[[Glossary#Permalink|パーマリンク]]''は例えば <tt>''<nowiki>http://example.com/acme_product/foobrozinator</nowiki>''</tt> になります。デフォルトの''投稿タイプ''と同様に、''カスタム投稿タイプ''の[[Writing Posts#Permalink|投稿編集画面]]にこの''パーマリンク''が表示されます。
  
<div id="URLs_with_Namespaced_Custom_Post_Types">
+
<div id="URLs_of_Namespaced_Custom_Post_Types_Identifiers">
 
==== 名前空間付きカスタム投稿タイプの URL ====
 
==== 名前空間付きカスタム投稿タイプの URL ====
 
</div>
 
</div>
  
名前空間を付けて、かつきれいな URL 構造を使用したい場合は、"rewrite" 要素を配列に追加する必要があります。以下は、上記の "ACME Widgets" という例の場合です。
+
''カスタム投稿タイプ''の識別子の名前空間をつける時に''きれいな'' URL 構造を使用したい場合は、<tt>[[関数リファレンス/register_post_type|register_post_type()]]</tt> 関数の ''rewrite'' 引数をセットする必要があります。上記の ''ACME Widgets'' という例の場合は次のようにします:
  
add_action( 'init', 'create_post_type' );
+
<pre>
function create_post_type() {
+
add_action( 'init', 'create_posttype' );
  register_post_type( 'acme_product',
+
function create_posttype() {
    array(
+
  register_post_type( 'acme_product',
      'labels' => array(
+
    array(
        'name' => __( 'Products' ),
+
      'labels' => array(
        'singular_name' => __( 'Product' )
+
        'name' => __( 'Products' ),
      ),
+
        'singular_name' => __( 'Product' )
      'public' => true,
+
      ),
      'rewrite' => array('slug' => 'products')
+
      'public' => true,
    )
+
      'has_archive' => true,
  );
+
      'rewrite' => array('slug' => 'products'),
}
+
    )
 +
  );
 +
}
 +
</pre>
  
上記は、http://example.com/products/%product_name% (上記の %product_name% の説明を参照) のような URL になります。ここでは複数形を使用していますが、これは製品のリストのページには、http://example.com/products/ のほうがより論理的な URL を意味するので、人々がこちらを好むからです。
+
上記は ''http://<nowiki/>example.com/'''products'''/%product_name%'' のような投稿 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. <!-- [[利用者:Mizuno|Mizuno]] 2010年10月13日 (水) 05:17 (UTC) not がどこまでかかるか?DBを見て要チェック) -->
+
参考:ここではスラッグに複数形を使用していますが、これは製品リストのページは ''<nowiki>http://example.com/products/</nowiki>'' のほうがより論理的な URL を意味するので好む人たちがいるからです。
  
<div id="Single_template">
+
参考:''products'' のような一般的な名前をスラッグに使用すると、同じ名前を使用する''プラグイン''や''テーマ''と衝突する可能性があります。しかしほとんどの人は長くて不明瞭な ''<nowiki>http://example.com/acme_products/foobrozinator</nowiki>'' のような 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. [[利用者:Mizuno|Mizuno]] 2010年10月13日 (水) 05:17 (UTC) not がどこまでかかるか?DBを見て要チェック) -->
=== シングルテンプレート ===
+
 
 +
 
 +
<div id="Custom_Post_Type_Templates">
 +
=== カスタム投稿タイプ用テンプレート ===
 
</div>
 
</div>
  
テーマシステムでも、single-type テンプレート形式で投稿タイプをサポートします。single.php で投稿を表示するのと同様に、カスタム投稿タイプは(存在するなら) single-type.php を使用します。上記例では、single-acme_product.php ファイルを作成して、このテンプレートを使用して product 投稿を表示できます。
+
WordPress のテーマシステムは''カスタム投稿タイプ''用の''[[Glossary#Template|テンプレート]]''もサポートします。''カスタム投稿タイプ''の投稿ひとつを表示するカスタム''テンプレート''は [[Version 3.0|バージョン 3.0]] からサポートされました。またアーカイブ用の''テンプレート''のサポートは [[Version 3.1|バージョン 3.1]] で追加されました。
 +
 
 +
参考:''カスタム投稿タイプ''の投稿を表示する新しい''テンプレート''ファイルをアクセス可能とするために、''パーマリンク''構造を更新しなければならない場合があります。これを行うには、''[[管理画面]]'' > ''[[管理画面#Settings|設定]]'' > ''[[管理画面#Permalinks|パーマリンク設定]]'' を開いて、一度''パーマリンク''構造を別のものに変えて保存し、元の構造へ戻して(それをもう一度保存)ください。
 +
 
 +
<div id="Template_Files">
 +
==== テンプレートファイル ====
 +
</div>
 +
 
 +
''single.php'' および ''archive.php'' ''テンプレート''ファイルを使って単一の''投稿''やアーカイブを表示するのと同様に、
 +
* ''カスタム投稿タイプ''の単一投稿は ''single-'''{post_type}'''.php'' を使って
 +
* そのアーカイブは ''archive-'''{post_type}'''.php'' を使って
 +
* もしカスタム投稿タイプアーカイブページを作らないなら BLOG_URL?post_type='''{post_type}''' を指定して
 +
表示することができます。ここで '''{post_type}''' は <tt>[[関数リファレンス/register_post_type|register_post_type()]]</tt> 関数の ''$post_type'' 引数に指定したものです。
 +
 
 +
したがって上の例の場合、製品の単一投稿とアーカイブ用に ''single-'''acme_product'''.php'' と ''archive-'''acme_product'''.php'' ''テンプレート''ファイルを作って使うことができます。
 +
 
 +
別の方法もあります。<tt>[[関数リファレンス/is post type archive|is_post_type_archive()]]</tt> 関数を任意の''テンプレート''ファイル内で使って、''[[Glossary#Query|クエリ]]''が特定の''投稿タイプ''のアーカイブページを示しているかチェックします。そして <tt>[[関数リファレンス/post_type_archive_title|post_type_archive_title()]]</tt> を使って''投稿タイプ''のタイトルを表示します。
 +
 
  
 
<div id="Querying_by_post_type">
 
<div id="Querying_by_post_type">
135行目: 183行目:
 
</div>
 
</div>
  
テーマシステムでは、特定の投稿タイプの投稿を表示する新しいクエリを作成することもできます。WP_Query に "post_type" パラメータを追加してくdださい。
+
WordPress テーマシステムの任意の''テンプレート''ファイル内で、特定の''投稿タイプ''の投稿を表示する新しい''クエリ''を作成することもできます。これには <tt>[[Class Reference/WP_Query|WP_Query]]</tt> オブジェクトの ''post_type'' 引数を使います。
  
例:
+
例:
$loop = new WP_Query( array( 'post_type' => 'product', 'posts_per_page' => 10 ) );
+
<pre>
while ( $loop->have_posts() ) : $loop->the_post();
+
$args = array( 'post_type' => 'product', 'posts_per_page' => 10 );
  the_title();
+
$loop = new WP_Query( $args );
  echo '&lt;div class="entry-content"&gt;';
+
while ( $loop->have_posts() ) : $loop->the_post();
  the_content();
+
  the_title();
  echo '&lt;/div&gt;';
+
  echo '&lt;div class="entry-content"&gt;';
endwhile;
+
  the_content();
 +
  echo '&lt;/div&gt;';
 +
endwhile;
 +
</pre>
 +
 
 +
これは「製品」投稿の最新10件をループし、ひとつずつタイトルと本文を表示します。
 +
 
 +
<div id="Custom_Post_Types_in_the_Main_Query">
 +
=== メインクエリにおけるカスタム投稿タイプ ===
 +
</div>
 +
 
 +
''カスタム投稿タイプ''を登録してもメイン''[[Glossary#Query|クエリ]]''へ自動的に追加されるわけではありません。
 +
 
 +
自分の''カスタム投稿タイプ''を他の''投稿タイプ''と混ぜて標準のアーカイブやホームページへ表示するには、''[[プラグイン API/アクションフック一覧/pre get posts|pre_get_posts]]'' /[[:en:Plugin API/Action Reference/pre get posts|en]] ''アクション [[Glossary#Hook|フック]]'' を使ってください。
 +
 
 +
<pre>
 +
// '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;
 +
}
 +
</pre>
 +
 
 +
<div id="Function_Reference">
 +
=== 関数リファレンス ===
 +
</div>
 +
 
 +
{{Post Type Tags}}
  
product 投稿の最新 10 件をループし、タイトルと本文を表示します。
 
  
 
<div id="More_Information">
 
<div id="More_Information">
153行目: 230行目:
  
 
=== 日本語情報 ===
 
=== 日本語情報 ===
 +
 
* [http://www.h-fj.com/blog/archives/2010/06/06-125752.php WordPress 3.0のカスタム投稿タイプ機能(その1)]
 
* [http://www.h-fj.com/blog/archives/2010/06/06-125752.php WordPress 3.0のカスタム投稿タイプ機能(その1)]
 
* [http://www.h-fj.com/blog/archives/2010/06/15-172024.php WordPress 3.0のカスタム投稿タイプ機能(その2)]
 
* [http://www.h-fj.com/blog/archives/2010/06/15-172024.php WordPress 3.0のカスタム投稿タイプ機能(その2)]
159行目: 237行目:
  
 
=== 英語情報 ===
 
=== 英語情報 ===
 +
 +
* [https://metabox.io/plugins/custom-post-type/ MB Custom Post Type plugin: Create, edit and manage custom post types with easy-to-use interface]
 +
* [https://wordpress.org/plugins/post-types-order/ Customize posts sorting (plugin) ]
 +
* [http://justintadlock.com/archives/2014/07/25/custom-post-type-standards Custom post type standards]
 +
* [http://generatewp.com/post-type/ WordPress Post Type Generator]
 
* [http://justintadlock.com/archives/2010/02/02/showing-custom-post-types-on-your-home-blog-page Showing custom post types on your home/blog page]
 
* [http://justintadlock.com/archives/2010/02/02/showing-custom-post-types-on-your-home-blog-page Showing custom post types on your home/blog page]
* [http://justintadlock.com/archives/2010/04/29/custom-post-types-in-wordpress Custom post types in WordPress]
+
* [http://blondish.net/podcast-presentation-wordpress-custom-post-types/ Podcast Presentation: WordPress Custom Post Types] Both Slides and Audio on Custom Post Types
 
* [http://kovshenin.com/archives/custom-post-types-in-wordpress-3-0/ Custom Post Types in WordPress 3.0]
 
* [http://kovshenin.com/archives/custom-post-types-in-wordpress-3-0/ Custom Post Types in WordPress 3.0]
 
* [http://kovshenin.com/archives/extending-custom-post-types-in-wordpress-3-0/ Extending Custom Post Types in WordPress 3.0]
 
* [http://kovshenin.com/archives/extending-custom-post-types-in-wordpress-3-0/ Extending Custom Post Types in WordPress 3.0]
 +
* [http://web-profile.com.ua/wordpress/docs/custom-post-types/ Custom Post Type Example]
 +
* [http://yoast.com/custom-post-type-snippets/ Custom Post Type Snippets]
 +
  
{{原文|Custom Post Types|93324}} <!-- 12:41, 29 September 2010 MichaelH 版 -->
+
{{原文|Custom Post Types|154386}} <!-- 08:15, 21 October 2015 Rilwis 版 -->
  
 +
{{DEFAULTSORT:とうこうたいぷ}}
 
[[Category:wp3.0]]
 
[[Category:wp3.0]]
 
[[Category:上級トピック]]
 
[[Category:上級トピック]]
171行目: 258行目:
 
[[en:Post Types]]
 
[[en:Post Types]]
 
[[pt-br:Tipos de Posts Customizados]]
 
[[pt-br:Tipos de Posts Customizados]]
[[sk|Vlastné typy príspevkov]]
+
[[nl:Post type soorten]]
 +
[[sk:Vlastné typy príspevkov]]
 +
[[zh-hans:Post type]]

2015年11月12日 (木) 22:52時点における最新版

この項目「投稿タイプ」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、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最新版との差分