MENU

【WordPress×PHP】テンプレートタグの使い方と注意点

【WordPress×PHP】テンプレートタグの使い方と注意点
目次

はじめに

【WordPress×PHP】functions.phpの書き方では、子テーマのfunctions.phpにPHPを書くときのルールを解説しました。

今回は、記事のタイトルや本文、公開日などを表示するときに使うテンプレートタグを解説します。テンプレートタグには、the_title()とget_the_title()のように、よく似た名前の関数が2つずつ用意されています。この違いを知らないと、「文字が変な場所に表示される」「何も表示されない」といったトラブルになります。ローカル環境で試した結果とあわせて確認していきましょう。

このシリーズの全15回の構成は、第1回の記事の冒頭にまとめています。

テンプレートタグとは?

テンプレートタグは、記事のタイトル・本文・公開日・カテゴリーなどを取り出すために、WordPressが用意している関数です。「タグ」という名前ですが、HTMLのタグではなく、PHPの関数です。

たとえば、SWELLで記事のタイトルを表示しているparts/single/post_head.phpには、次のコードがあります。

<h1 class="c-postTitle__ttl"><?php the_title(); ?></h1>

the_title()が、いま表示している記事のタイトルを出力するテンプレートタグです。HTMLの中に<?php the_title(); ?>と書くだけで、記事ごとに違うタイトルが表示されます。

テンプレートタグの多くは、ループ(記事を1件ずつ取り出して表示する仕組み)の中で使う前提で、「いまループで取り出している記事」の情報を返します。ループは次回解説します。

the〜とget〜の違い

テンプレートタグには、the_title()とget_the_title()のように、名前がよく似た関数がセットで用意されています(一覧は後半の表にまとめています)。2つの違いは、次のとおりです。

  • the_〜:値をその場で出力(echo)する。戻り値はない
  • get_〜:値を返す(return)だけで、出力はしない

【PHP】関数の作り方と使い方を解説で解説した、echoとreturnの違いそのものです。

the_titleとget_the_titleの違い。the_titleはタイトルをその場で出力し、戻り値はない。get_the_titleはタイトルを戻り値として返し、変数に入れたり加工したりできる

ローカル環境で、それぞれの戻り値をvar_dump()で調べてみました。

$a = the_title();
var_dump( $a );

$b = get_the_title();
var_dump( $b );
Hello world!NULL
string(12) "Hello world!"

the_title()は、呼び出した時点でタイトルを出力し、戻り値はNULL(何もない)でした。get_the_title()は何も出力せず、タイトルを文字列として返しています。

どちらを使えばいい?

使い分けの目安は、次のとおりです。

  • テンプレートの中で、そのまま表示するだけ → the_〜
  • 変数に入れる、ほかの文字と連結する、if文で判定する、文字数を数えるなど、値を加工してから使う → get_〜

SWELLでも、見出しの<h1>ではthe_title()でそのまま出力し、検索エンジン向けのデータを作る部分(classes/Json_Ld.php)ではwp_strip_all_tags( get_the_title() )のように、受け取ったタイトルからHTMLタグを取り除いて使っています。

よくある間違い1:the_〜を文字列に連結する

「タイトル:」という文字と記事のタイトルを<p>で囲んで表示しようとして、次のように書くと、どうなるでしょうか。

echo '<p>タイトル:' . the_title() . '</p>';

ローカル環境で試したところ、出力されたHTMLは次のようになりました。

Hello world!<p>タイトル:</p>

タイトルが<p>の外側、しかも前に出てしまい、<p>の中は「タイトル:」だけになっています。

the_titleを文字列に連結したときの処理の順番。先に連結の材料をそろえる途中でthe_titleがタイトルを出力してしまい、そのあとでechoが「<p>タイトル:</p>」を出力する

PHPは、echoで出力する前に、まず.(【PHP】演算子の種類と使い方を解説で解説した文字列連結演算子)で連結する文字列を組み立てます。その途中でthe_title()が呼ばれた瞬間に、タイトルが先に出力されてしまいます。しかもthe_title()の戻り値はNULLなので、連結される部分は空になります。

文字列に連結するときは、get_the_title()を使います。

echo '<p>タイトル:' . esc_html( get_the_title() ) . '</p>';
<p>タイトル:Hello world!</p>

esc_html()は、文字列を安全な形にしてから出力するための関数です(第12回で解説します)。

the_title()には、前後に付ける文字を引数で渡せます。the_title( ‘<h2>’, ‘</h2>’ );と書くと、<h2>Hello world!</h2>のように出力されました。単純にタグで囲むだけなら、この書き方でも同じ結果になります。

よくある間違い2:get_〜をechoし忘れる

反対に、get_the_title()だけを書いても、画面には何も表示されません。

get_the_title(); // 何も表示されない

get_the_title()はタイトルを返すだけなので、返ってきた値をechoしなければ、そのまま捨てられてしまいます。エラーにもならないので、気付きにくい間違いです。「書いたのに何も表示されない」ときは、get_〜をechoしているかどうかを確認しましょう。

同じ情報でも結果が変わるテンプレートタグ

the〜とget〜は、「出力するか、返すか」だけが違うと思われがちですが、中には取り出した結果そのものが違うものもあります。代表的な2つを紹介します。

the_content()とget_the_content()

本文を取り出す2つの関数で、出力された内容を比べてみました。ブロックエディターで「本文A」と1段落だけ書いた記事では、次の結果になりました。

(the_content()の出力)
<p class="wp-block-paragraph">本文A</p>

(echo get_the_content() の出力)
<!-- wp:paragraph -->
<p>本文A</p>
<!-- /wp:paragraph -->

get_the_content()は、データベースに保存されている本文をほぼそのまま返します。ブロックエディターの区切りを表すコメント(<!-- wp:paragraph -->)が残り、ブロックのクラス名も付いていません。

the_content()は、出力する前に、WordPressやテーマ・プラグインが用意した加工の処理(the_contentフィルター)を通しています。ブロックをHTMLに変換する、改行を段落タグに変える、ショートコードを実行する、といった処理です。

the_contentとget_the_contentの違い。データベースの本文は、the_contentではthe_contentフィルターで加工されてから出力され、get_the_contentでは加工されずにそのまま返される

本文を表示するときは、the_content()を使うのが基本です。

本文を変数に入れてから表示したい場合は、apply_filters( ‘the_content’, get_the_content() )と書くと、the_content()と同じ加工をした結果を受け取れます。ローカル環境でも、the_content()と同じ出力になりました。フィルターの仕組みは第10回で解説します。

the_date()は同じ日付の2件目以降で表示されない

公開日を表示するthe_date()には、ほかのテンプレートタグにない特徴があります。同じ日に公開された記事が続くと、2件目以降は何も出力しないのです。

公開日が同じ「記事A」「記事B」を含む4件の記事で、ループの中でthe_date()とget_the_date()を並べて出力してみました。

記事the_date()get_the_date()
Hello world!2026年10月6日2026年10月6日
記事B2026年10月1日2026年10月1日
記事A(何も表示されない)2026年10月1日
古い記事2023年4月1日2023年4月1日

the_date()は、もともと「日付ごとに記事をまとめて表示する」ブログの形式に合わせて作られているためです。記事一覧のすべての記事に公開日を表示したいときは、get_the_date()をechoするか、the_time()を使います。

echo esc_html( get_the_date() );

主なテンプレートタグ一覧

よく使うテンプレートタグを、the〜とget〜のセットでまとめました。

出力する値を返す取り出す情報
the_title()get_the_title()タイトル
the_content()get_the_content()本文
the_excerpt()get_the_excerpt()抜粋
the_permalink()get_permalink()記事のURL
the_ID()get_the_ID()投稿ID
the_date() / the_time()get_the_date()公開日
the_modified_date()get_the_modified_date()最終更新日
the_category()get_the_category()カテゴリー
the_post_thumbnail()get_the_post_thumbnail()アイキャッチ画像

いくつか注意点があります。

  • 記事のURLは、get_the_permalink()ではなくget_permalink()がよく使われます(get_the_permalink()もあり、同じ結果を返します)
  • the_category()はカテゴリーのリンクを出力しますが、get_the_category()は文字列ではなく、カテゴリーの情報をまとめた配列を返します(中身はオブジェクトで、第8回で解説します)
  • 日付を返す関数は、get_the_date( 'Y年n月j日' )のように引数で書式を指定できます。'U'を指定すると、計算に使える数値(1970年からの秒数)を返します

ループの外では投稿IDを指定する

get_〜の多くは、引数に投稿IDを渡すと、ループで取り出している記事ではなく、指定した記事の情報を返します。

echo esc_html( get_the_title( 1 ) ); // 投稿IDが1の記事のタイトル
echo esc_url( get_permalink( 1 ) );  // 投稿IDが1の記事のURL

ローカル環境で試すと、投稿IDが1の「Hello world!」のタイトルとURLが表示されました。SWELLでも、パンくずリストの部分(parts/breadcrumb.php)でget_the_title( $the_id )のように、IDを指定してタイトルを取り出しています。

一方、the_title()の引数は、先ほどのメモで紹介した「前後に付ける文字」なので、記事を指定することはできません。ループの外や、別の記事の情報を使うときはget_〜と覚えておくと便利です。

実務サンプル:古い記事の上にお知らせを表示する

ここまでの内容を使って、最終更新日から1年以上たった記事の上に、「内容が古くなっている可能性があります」というお知らせを表示してみましょう。

最終更新日を「計算に使う」ので、the〜ではなく**get〜**の出番です。子テーマのfunctions.phpの、もともとあるコードの下に、次のコードを追加します。

/**
 * 最終更新から1年以上たった記事の上にお知らせを表示する
 */
add_action( 'swell_before_post_head', function( $post_id ) {
	$modified = (int) get_the_modified_date( 'U', $post_id );

	if ( time() - $modified < YEAR_IN_SECONDS ) {
		return;
	}

	$message = 'この記事は最終更新日(' . get_the_modified_date( 'Y年n月j日', $post_id ) . ')から1年以上たっています。'
		. '内容が古くなっている可能性があります。';

	echo '<p class="kurumico-old-notice">' . esc_html( $message ) . '</p>';
} );

見た目を整えるため、子テーマのstyle.cssにも次のCSSを追加します。

.kurumico-old-notice {
	padding: 1em;
	margin-bottom: 2em;
	background: #fff8e1;
	border-left: 4px solid #f0a500;
	font-size: .9em;
}

2023年4月1日に公開した記事を開くと、タイトルの上に次のように表示されました。最終更新から1年たっていない記事には、何も表示されません。

SWELLの記事ページ。タイトル「古い記事」の上に「この記事は最終更新日(2023年4月1日)から1年以上たっています。内容が古くなっている可能性があります。」というお知らせが表示されている

コードのポイントは次のとおりです。

  • swell_before_post_headは、SWELLが記事のタイトル部分の直前に用意しているSWELL独自のフック。表示中の記事の投稿IDを$post_idとして受け取れる
  • get_the_modified_date( 'U', $post_id )で最終更新日を数値として受け取り、現在の時刻(time())との差を計算している
  • YEAR_IN_SECONDSは1年の秒数を表すWordPressの定数で、YEAR_IN_SECONDS * 2にすれば「2年以上」になる
  • お知らせの文章は、受け取った日付を連結して作り、最後に1回だけechoしている

swell_before_post_headはSWELL独自のフックなので、SWELL以外のテーマでは使えません。ほかのテーマで本文の前にお知らせを入れる方法は、第10回のフィルターフックで解説します。

よくある質問・エラー対処

Q. 使いたい関数が、出力するのか値を返すのか分かりません

→ WordPressの公式リファレンス(developer.wordpress.org)で関数名を調べると、「Return」の欄に戻り値が書かれています。「void」(何も返さない)なら出力するタイプです。


Q. 日付の表示形式を変えたいです

→ サイト全体の形式は、管理画面の「設定」→「一般」の「日付形式」で変えられます。個別に変えたい場合は、get_the_date( 'Y/m/d' )のように引数で書式を指定します。

おわりに(まとめ)

まとめ

テンプレートタグは、the_〜とget_〜の違いを押さえれば、迷わずに使い分けられます。

  • ✅ テンプレートタグは、記事のタイトルや本文などを取り出すWordPressの関数
  • ✅ the_〜はその場で出力し、get_〜は値を返す
  • ✅ そのまま表示するならthe_〜、連結・計算・判定に使うならget_〜
  • ✅ the_〜を文字列に連結すると、表示される位置がずれる
  • ✅ get_〜はechoしないと何も表示されない
  • ✅ get_the_content()はthe_contentフィルターを通らず、the_date()は同じ日付の2件目以降を表示しない
  • ✅ ループの外や別の記事の情報は、get_〜に投稿IDを渡して取り出す

次回は、テンプレートタグが「どの記事」の情報を返すかを決めている「ループ」の仕組みを、SWELLのsingle.phpを読みながら解説します。

次回は、ループの仕組み(SWELLのsingle.phpを読む)について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次