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

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

投稿タイプ

提供: WordPress Codex 日本語版
2015年8月16日 (日) 08:14時点におけるMiccweb (トーク | 投稿記録)による版 (150804}} <!-- 17:08, 13 April 2015‎ Wturrell 版 -->)

移動先: 案内検索

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

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


WordPress には5つの主要なデフォルト投稿タイプがあります。

  • Post (Post Type: 'post')
  • Page (Post Type: 'page')
  • Attachment (Post Type: 'attachment')
  • Revision (Post Type: 'revision')
  • Navigation menu (Post Type: 'nav_menu_item')


投稿 (post)

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

ページ (page)

WordPress でのページ (page) は投稿に似ていますが、投稿の時系列構造の外にあります。ページはメインのサイトドメインのすぐ下にくる独自 URL を持っており、特別なページテンプレートを使って表示することができます。また、他のページを親に持つ階層化した構造にすることもできます、, but they normally cannot be assigned categories and tags. If permalinks are enabled, the permalink of a page is always composed solely of the main site URL and the user-friendly and URL-valid names (also referred to as slug) of the page and its parents if they exist. See the Pages article for more information about the differences.


添付ファイル (attachment)

添付ファイル (attachment) は特別な投稿で、WordPressメディアアップロードシステムを使ってアップロードされたファイルについて、ファイル名・説明、wp_postmeta テーブルに格納されている、画像のサイズ等の情報が含まれます。

例えばファイルが画像の場合、画像のサイズや自動生成されたサムネイル、ファイルの位置、埋込み EXIF 情報などです。


リビジョン (revision)

リビジョン'(revision) は下書きや既存の投稿・ページの過去の変更履歴を保存するための投稿タイプです。投稿・ページタイプと基本的には同じような内容ですが、元となる投稿・ページが親となります。それは wp_postsテーブルのpost_parentコラムを使います。


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


カスタム投稿タイプ

Custom post types are new post types you can create. A custom post type can be added to WordPress via the register_post_type() function. This function allows you to define a new post type by its labels, supported features, availability and other specifics.


Note that you must call register_post_type() before the admin_menu and after the after_setup_theme action hooks. A good hook to use is the init hook.

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


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,
    )
  );
}

This creates a post type named Product identified as acme_product. The register_post_type() function receives two major arguments. The first one is labels which define the name of the post type in both plural and singular forms. The second one is public which is a predefined flag to show the post type on the administration screens and to make it show up in the site content itself, if it's queried for.


There are many more arguments you can pass to the register_post_type() function, to do things like set up hierarchy (to behave like pages), show the new post type in searches, change the URLs of the new posts, and hide or show meta boxes in the post edit screen. These parameters are optional, and you can use them to configure your post type on a detailed level.

アーカイブページ

For your index or archive page to be accessible (at /acme-product in the above example) you will need to update (or "flush") the permalink structure as described in the Custom Post Type Templates section. The template file used for the index is explained here.


A word about custom post types as a plugin

In order to avoid breaking a site on theme switching, try to define custom post types as a plugin, or, better as a Must Use Plugins. This way you won't force users into using a certain theme.


良い名前の付け方

"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 構造を使用したい場合は、register_post_type() 関数の "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,
      'has_archive' => true,
    )
  );
}

The above will result in post URLs in the form http://example.com/products/%product_name%. Note that we used a plural word for the slug here which is a form that some people prefer because it implies a more logical URL for a page that embeds a list of products, i.e. http://example.com/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.


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

The WordPress theme system supports custom templates for custom post types too. A custom template for a single display of posts belonging to a custom post type is supported since WordPress Version 3.0 and the support for a custom template for an archive display was added in Version 3.1.

Note: In some cases, the permalink structure must be updated in order for the new template files to be accessed when viewing posts of a custom post type. To do this, go to Administration Panels > Settings > Permalinks, change the permalink structure to a different structure, save the changes, and change it back to the desired structure.


テンプレートファイル

In the same way single posts and their archives can be displayed using the single.php and archive.php template files, respectively,

  • single posts of a custom post type will use single-{post_type}.php
  • and their archives will use archive-{post_type}.php
  • and if you don't have this post type archive page you can pass BLOG_URL?post_type={post_type}

where {post_type} is the $post_type argument of the register_post_type() function.

So for the above example, you could create single-acme_product.php and archive-acme_product.php template files for single product posts and their archives.

Alternatively, you can use the is_post_type_archive() function in any template file to check if the query shows an archive page of a given post types(s), and the post_type_archive_title() to display the post type title.


投稿タイプによるクエリ

テーマシステムでは、特定の投稿タイプの投稿を表示する新しいクエリを作成することもできます。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;

product 投稿の最新 10 件をループし、タイトルと本文を表示します。


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

Registering a custom post type does not mean it gets added to the main query automatically.

If you want your custom post type posts to show up on standard archives or include them on your home page mixed up with other post types, use the pre_get_posts action hook.

// Show posts of 'post', 'page' and 'movie' post types on home page
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最新版との差分

Vlastné typy príspevkov