WordPress のテーマを作っていると、投稿のタイトルを表示する場面が何度も出てきます。そのときに使うのが the_title() と get_the_title() です。名前がよく似ていますが、「その場で出力する」か「値を受け取る」かという大事な違いがあります。この記事では、2つの関数の違いと使い分け、タイトルの前後に文字を付ける引数、ループの外で特定の投稿タイトルを取得する方法、あわせて投稿IDを扱う the_ID() / get_the_ID() まで、初心者の方にも分かるように解説します。
目次
the_title と get_the_title の違い
WordPress のテンプレートタグには、the_ で始まるものと get_the_ で始まるものがペアで存在することがよくあります。両者の違いはシンプルで、the_title() はタイトルをその場で出力(echo)し、get_the_title() はタイトルを文字列として返す(return)だけ、という点です。
| 関数 | 動作 | 使う場面 |
|---|---|---|
the_title() | タイトルをそのまま出力する | テンプレートにそのまま表示したいとき |
get_the_title() | タイトルを文字列で返す | 変数に入れる・加工する・条件に使うとき |
つまり「画面に出すだけ」なら the_title()、「いったん受け取って何か処理してから使う」なら get_the_title() と覚えておけば、ほとんどの場面で迷いません。
the_title() でタイトルを表示する
もっとも基本的な使い方は、ループの中で the_title() を呼ぶだけです。WordPress のループ(have_posts() と the_post() の繰り返し)の中では「現在の投稿」が決まっているため、引数なしでその投稿のタイトルが出力されます。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php endwhile; endif; ?>
the_title() には、タイトルの前後に文字を付ける引数があります。第1引数が前(before)、第2引数が後ろ(after)です。見出しタグやアイコンをまとめて付けたいときに便利です。
<?php
// the_title( $before, $after, $echo )
the_title( '<h2 class="entry-title">', '</h2>' );
// 出力: <h2 class="entry-title">記事タイトル</h2>
第3引数 $echo に false を渡すと、出力せずに文字列を返すようになります。ただしこの使い方をするくらいなら、最初から次に紹介する get_the_title() を使う方が意図が明確で読みやすくなります。
get_the_title() でタイトルを受け取る
タイトルを変数に入れたり、文字数で切り詰めたり、条件分岐に使ったりしたいときは get_the_title() を使います。値が返ってくるので、自由に加工できます。
<?php
$title = get_the_title(); // タイトルを文字列で受け取る
$short = mb_substr( $title, 0, 20 ); // 先頭20文字だけ取り出す
echo esc_html( $short ); // 加工した文字列を安全に出力
注意したいのは、get_the_title() は自分では出力しないことです。echo を付け忘れると画面に何も表示されません。逆に the_title() に echo を付けてしまうと二重に出力されたりエラーになったりするので、「the_ はそのまま、get_the_ は echo とセット」と覚えておきましょう。
ループの外で特定の投稿タイトルを取得する
get_the_title() は、引数に投稿IDを渡すと、その投稿のタイトルを取得できます。これによりループの外でも、任意の投稿のタイトルを表示できます。たとえば「固定ページのIDを指定してタイトルを出す」といった使い方です。
<?php
// ID が 10 の投稿のタイトルを取得して表示
echo esc_html( get_the_title( 10 ) );
なお the_title() にはIDを渡す引数がありません。ループの外で特定投稿のタイトルを扱うなら、ID指定ができる get_the_title() を使うのが基本です。
投稿ID を取得する the_ID と get_the_ID
タイトルと同じ the_ / get_the_ のペアは、投稿IDにもあります。the_ID() は現在の投稿のIDを出力し、get_the_ID() はIDを数値で返します。HTMLの id 属性に使ったり、IDを別の関数に渡したりするときに役立ちます。
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<h2><?php the_title(); ?></h2>
</article>
<?php endwhile; ?>
<?php
// ID を変数に入れて別の関数へ渡す
$post_id = get_the_ID();
$title = get_the_title( $post_id );
タイトルが表示されない・空になるとき
get_the_title() なのに何も出ない
もっとも多いのが、get_the_title() に echo を付け忘れているケースです。この関数は値を返すだけなので、表示するには echo get_the_title(); のように出力が必要です。表示専用でよければ the_title() に置き換えると確実です。
ループの外で空になる
サイドバーやヘッダーなどループの外で the_title() を引数なしで呼ぶと、「現在の投稿」が決まっていないため正しく取得できないことがあります。この場合は get_the_title( $id ) のように対象の投稿IDを明示してください。アーカイブページのタイトルなど投稿以外の見出しが欲しいときは、用途に応じて the_archive_title() や wp_title() といった別の関数を使います。
タイトルにHTMLタグが入る
取得したタイトルを 属性値 や独自の場所に出力するときは、esc_html() でエスケープしておくと安全です。なお the_title() はテーマでの利用を想定して整形済みの出力を行いますが、自分で get_the_title() の結果を出力する場合は、出力先に合わせて esc_html() や esc_attr() を使い分けるのが安全な書き方です。
まとめ
the_title() と get_the_title() は、出力するか値を返すかが違うだけの兄弟のような関数です。要点を整理します。
the_title()はその場で出力。前後の文字は第1・第2引数で付けられる。get_the_title()は文字列を返す。表示するにはechoが必要。- 投稿IDを渡せるのは
get_the_title( $id )。ループ外で特定投稿のタイトルを扱える。 - IDは
the_ID()で出力、get_the_ID()で取得できる。 - 自分で出力するときは
esc_html()などでエスケープすると安全。
「表示するだけなら the_、加工するなら get_the_」という考え方は、WordPress の他のテンプレートタグにも共通します。この使い分けに慣れておくと、テーマづくり全体がスムーズになります。