テンプレートファイル

「テーマ(Theme)」は「スタイルシート(style.css)」と「関数ファイル(functions.php)」と「テンプレートファイル」で構成されますが、「関数ファイル(functions.php)」は必要に応じて、追加するものなので、ウィジェット対応、追加機能などの、追加関数がない場合は必要がありません。

それに対して、「テンプレートファイル」はWebサイトを構成する各ページの記述のため、用途別のテンプレートが必要な場合は、その数のテンプレートファイルが必要になります。

「テンプレートファイル」は閲覧者がWebサイトを表示する際に、ソースファイルとして、Webサイトの表示、生成をおこないます。また、テンプレートの共通部分を「パーツテンプレート」ファイルとして持つことができます。

「テーマ(Theme)」は、Webサイトの各ページ表示を個別のテンプレートとして定義できるようになっていますが、Webサイトを機能させるために、全ての「テンプレートファイル」を必要とはしません。

また、「テンプレートファイル」は階層を持っていて、必要なファイルだけで構成することができます。例えば、「スタイルシート」のstyle.cssと「テンプレートファイル」のindex.phpで構成される「WordPress テーマ」も存在します。

→テンプレートファイルの階層

基本的な「テンプレートファイル」は下記のとおりです。

また、「テンプレートファイル」の「パーツテンプレート(共通部品となるテンプレートファイル)」は下記のとおりです。

共通部品となるファイルはget_sidebar()やget_footer()のようなテンプレートタグを使用を使用して各「テンプレートファイル」にインクルードします。

その他に「スタイルシート(style.css)」と「関数ファイル(functions.php)」等も必要になります。

2009.04.12 16;22

テンプレートファイルの階層

テンプレートファイルの階層は下図のとうりです。階層は左から右へ「もし、このテンプレートがない場合は~」と推移していきます。図を見ると、「index.php」が全てのテンプレートに応用が利き、「archives.php」や「attachment.php」、「single.php」も他のテンプレートの代用になることが分かります。

→Codex_en/Template Hierarchy

種類 テンプレートファイルの階層
メイン(TOP) home.php - - index.php
検索結果 search.php - -
404エラー 404.php - -
PAGE pagename.php page.php -
アーカイブ - - archive.php
カテゴリー category-id.php category.php
日付 date.php -
ユーザー author.php -
タグ tag・slug.php tag.php
記事 - - single.php
その他 image.php attachment.php
video.php
audio.php
application.php
(Point!!)
style.cssとindex.phpだけで「テーマ」ができるのも「テンプレートファイルの階層」構造をWordPressが持っているからです。多様なデザインテーマや機能的なテーマを制作できることとは別に、非常にシンプルなテーマも制作できるようになっています。

2009.04.12 18;58

テンプレートタグ

WordPressテーマの「スタイルシート(style.css)」も、「テンプレートファイル(index.php、page.php他)」も、基本的には他のWebサイトと同様に、XHTMLに従って、コーディングされていますが、WordPressが実装する「機能」を使用する場合には「テンプレートタグ」が必要になります。

言い換えれば、「テンプレートタグ」を使うことによって、ブログに「投稿」した文章を「Webサイトに表示」し、「並び替え」、「リンクを張り」、「カテゴリーにまとめ」、「フィードデータを作成・配信する」ことができます。

「テンプレートタグ」はWordPressの本体で定義されたPHP関数で、WordPressに対して、「どんな働きをするか」を指示しています。したがって、表示形式はPHPのコードそのもので、「<?php ~ ?>」という形で記述したり、関数形式のタグを利用したりします。

「テンプレートタグ」はWordPressの開発が進むたびに増え、改良されて、いまや、100を超えるものになっていますが、基本的なタグを習得することで、誰もが簡単に利用できるようになっています。もちろん、PHP経験者はより深く、活用することが可能です。

ところで、「テンプレートタグ」や「関数」ではパラメータを利用して、出力(表示)に関する細かな設定をすることができます。
例えば、パラメータを変更することで、日付順に並んだ投稿記事が、昇順になったり、降順になったりします。パラメータを複数設定することで、いろいろな条件での表示、処理が可能です。
(パラメータには「ファンクション形式」と「クエリ形式」があり、記述ルールが異なるので、注意が必要です。)

→日本語/Codex/「テンプレートタグ」一覧

2009.04.12 20;07

Default/index.php

「メインテンプレート(index.php)」はテンプレートファイルの基本になります。テンプレートファイルの階層としては最も汎用性のある階層のファイルです。

「ページテンプレート(page.php)」や「シングルテンプレート(single.php)」などのテンプレートファイルがテーマ内にない場合、「メインテンプレート(index.php)」が代行して、その役割を果たします。また、「TOPページ用テンプレート(home.php)」がテーマ内にない場合、Webサイトのトップページの役割も果たします。

*「Default_Theme(英語版)」の「メインテンプレート(index.php)」をコメント文(//説明文)を使って機能解説してみましょう。

Default_Theme/index.php


<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 */

get_header(); ?>          //インクルードファイル:header.phpを読み込みます

	<div id="content" class="narrowcolumn">

	<?php if (have_posts()) : ?>          //コンテンツデータを取得する・ループのPHPコードの開始

		<?php while (have_posts()) : the_post(); ?>

			<div <?php post_class() ?> id="post-<?php the_ID(); ?>">

                //投稿(コンテンツ)タイトル名の表示

				<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

                //投稿日付、投稿者の表示

				<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>

                //投稿(コンテンツ)内容の表示

				<div class="entry">
					<?php the_content('Read the rest of this entry &raquo;'); ?>
				</div>

                //投稿タグ・カテゴリー・編集リンク・コメントの表示

				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
			</div>

		<?php endwhile; ?>

        //投稿前後のナビゲーションの表示

		<div class="navigation">
			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
		</div>

	<?php else : ?>          //コンテンツデータがないときのメッセージ表示

		<h2 class="center">Not Found</h2>
		<p class="center">Sorry, but you are looking for something that isn't here.</p>
		<?php get_search_form(); ?>

	<?php endif; ?>          //コンテンツデータを取得する・ループのPHPコードの終了

	</div>

<?php get_sidebar(); ?>          //インクルードファイル:sideber.phpを読み込みます

<?php get_footer(); ?>          //インクルードファイル:footer.phpを読み込みます
 
  • 1.ヘッダー(header)部分、サイドバー(sidebar)部分、フッター(footer)部分は共通部品として、それぞれのインクルードファイルが読み込まれています。
  • 2.コンテンツデータを取得するループのPHPコードによって、DBからコンテンツデータを取得して、タイトルと内容を表示しています。
  • 3.コンテンツデータに関する投稿日付、投稿者、タグ、カテゴリー等を表示しています。
  • 4.仮にコンテンツデータがないときには「Sorry, but you are looking for something that isn’t here.」を表示します。

2009.04.13 02;23

Default/single.php

「記事用テンプレート(single.php)」は投稿記事のみの表示となります。テンプレートファイルの階層としては最も汎用性のある階層の「メインテンプレート(index.php)」に次いで、汎用性の高いファイルです。

「イメージテンプレート(image.php)」や「ビデオテンプレート(video.php)」などのテンプレートファイルがテーマ内にない場合、「記事用テンプレート(single.php)」が代行して、その役割を果たします。

基本的には「メインテンプレート(index.php)」の構成に似ていますが、記事に対する「コメント」欄の追加や「トラックバック」の表示などが追加されています。

*「Default_Theme(英語版)」の「単体記事用テンプレート(single.php)」をコメント文(//説明文)を使って機能解説してみましょう。

Default_Theme/single.php

<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 */

get_header();?>          //インクルードファイル:header.phpを読み込みます

	<div id="content" class="widecolumn">

    //コンテンツデータを取得する・ループのPHPコードの開始
	<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

        //投稿前後のナビゲーションの表示
		<div class="navigation">
			<div class="alignleft"><?php previous_post_link('&amp;laquo; %link') ?></div>
			<div class="alignright"><?php next_post_link('%link &amp;raquo;') ?></div>
		</div>

		<div <?php post_class() ?> id="post-<?php the_ID(); ?>">

           //投稿(コンテンツ)タイトル名の表示
		    <h2><?php the_title(); ?></h2>

			<div class="entry">

                //投稿(コンテンツ)内容の表示
				<?php the_content('<p class="serif">Read the rest of this entry &amp;raquo;</p>'); ?>

                //記事分割の際のリンク表示
				<?php wp_link_pages(array('before' => '<p><strong>Pages:</strong> ', 'after' => '</p>', 'next_or_number' => 'number')); ?>

                //投稿(コンテンツ)に付けられた「タグ」の表示
				<?php the_tags( '<p>Tags: ', ', ', '</p>'); ?>

                //投稿(コンテンツ)の履歴記録(日付、カテゴリー、RSS)メッセージの表示
				<p class="postmetadata alt">
					<small>
						This entry was posted
						<?php /* This is commented, because it requires a little adjusting sometimes.
							You'll need to download this plugin, and follow the instructions:
							http://binarybonsai.com/archives/2004/08/17/time-since-plugin/ */
							/* $entry_datetime = abs(strtotime($post->post_date) - (60*120)); echo time_since($entry_datetime); echo ' ago'; */ ?>
						on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
						and is filed under <?php the_category(', ') ?>.
						You can follow any responses to this entry through the <?php post_comments_feed_link('RSS 2.0'); ?> feed.

                //コメント、トラックバック/ピンバックに関するメッセージの表示
						<?php if (('open' == $post-> comment_status) &amp;&amp; ('open' == $post->ping_status)) {
							// Both Comments and Pings are open ?>
							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(); ?>" rel="trackback">trackback</a> from your own site.

						<?php } elseif (!('open' == $post-> comment_status) &amp;&amp; ('open' == $post->ping_status)) {
							// Only Pings are Open ?>
							Responses are currently closed, but you can <a href="<?php trackback_url(); ?> " rel="trackback">trackback</a> from your own site.

						<?php } elseif (('open' == $post-> comment_status) &amp;&amp; !('open' == $post->ping_status)) {
							// Comments are open, Pings are not ?>
							You can skip to the end and leave a response. Pinging is currently not allowed.

						<?php } elseif (!('open' == $post-> comment_status) &amp;&amp; !('open' == $post->ping_status)) {
							// Neither Comments, nor Pings are open ?>
							Both comments and pings are currently closed.

						<?php } edit_post_link('Edit this entry','','.'); ?>

					</small>
				</p>

			</div>
		</div>

	<?php comments_template(); ?>          //インクルードファイル:comment.phpを読み込みます

	<?php endwhile; else: ?>          //コンテンツデータがないときのメッセージ表示

		<p>Sorry, no posts matched your criteria.</p>

<?php endif; ?>          //コンテンツデータを取得する・ループのPHPコードの終了

	</div>

<?php get_footer(); ?>          //インクルードファイル:footer.phpを読み込みます
  • 1.ヘッダー(header)部分、サイドバー(sidebar)部分、フッター(footer)部分は共通部品として、それぞれのインクルードファイルが読み込まれています。
  • 2.コンテンツデータを取得するループのPHPコードによって、DBからコンテンツデータを取得して、タイトルと内容を表示しています。
  • 3.投稿(コンテンツ)の履歴記録(日付、カテゴリー、RSS)メッセージを表示しています。
  • 4.コンテンツデータに関する投稿日付、投稿者、タグ、カテゴリー等を表示しています。
  • 5.コメント、トラックバック/ピンバックに関するメッセージを表示しています。
  • 6.仮にコンテンツデータがないときには「Sorry, no posts matched your criteria.」を表示します。

2009.04.14 03;13

Default/page.php

「ページ用テンプレート(page.php)」は「時系列」や「カテゴリー」「タグ」などの属性で分類される「投稿」記事とは異なり、「固定ページ」を表示する際に利用されるテンプレートファイルです。

例えば、一般サイトでは「最新NEWS」は「投稿」記事と同じように「時系列」や「カテゴリー」「タグ」別に分類され、活用されますが、「会社情報」や「お問合せ」のようなページには属性に関係なく、「固定ページ」である方が便利です。言い換えれば、「固定ページ」が必要な場合には「ページ用テンプレート(page.php)」が活用されます。

「ページ用テンプレート(page.php)」は「カテゴリー」や「タグ」で分類できないので、「ページ」を使い分ける必要ができた場合は「固有名のページ用テンプレート(example_page.php)」を作成する必要があります。

例えば、「会社情報」などの”一般情報掲載用のテンプレート”と「製品情報」などの”コンテンツ用のテンプレート”を分け、コンテンツ管理をする場合です。その場合、サイトの内容によって、作成画面から、「固有名のページ用テンプレート(example_page.php):exampleは固有名称」を切り替えて作成することが可能です。

*「Default_Theme(英語版)」の「ページ用テンプレート(page.php)」をコメント文(//説明文)を使って機能解説してみましょう。

Default_Theme/page.php


<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 */

get_header(); ?>          //インクルードファイル:header.phpを読み込みます

	<div id="content" class="narrowcolumn">

        //コンテンツデータを取得する・ループのPHPコードの開始
		<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

		<div class="post" id="post-<?php the_ID(); ?>">

        //コンテンツ・タイトル名の表示
		<h2><?php the_title(); ?></h2>

			<div class="entry">

                //コンテンツ内容の表示
				<?php the_content('<p class="serif">Read the rest of this page &amp;raquo;</p>'); ?>

                //記事分割の際のリンク表示
				<?php wp_link_pages(array('before' => '<p><strong>Pages:</strong> ', 'after' => '</p>', 'next_or_number' => 'number')); ?>

			</div>
		</div>

        //コンテンツデータを取得する・ループのPHPコードの終了
		<?php endwhile; endif; ?>

    //記事編集の際のリンク表示
	<?php edit_post_link('Edit this entry.', '<p>', '</p>'); ?>

	</div>

<?php get_sidebar(); ?>          //インクルードファイル:sideber.phpを読み込みます

<?php get_footer(); ?>          //インクルードファイル:footer.phpを読み込みます
  • 1.ヘッダー(header)部分、サイドバー(sidebar)部分、フッター(footer)部分は共通部品として、それぞれのインクルードファイルが読み込まれています。
  • 2.コンテンツデータを取得するループのPHPコードによって、DBからコンテンツデータを取得して、タイトルと内容を表示しています。

2009.04.14 03;14

このページのトップへ