今回は、ワードプレス(WordPress)のthe_content()とget_the_content()の違いと使い方について紹介します。
しかし、この2つの関数には「出力方法」と「フィルター処理の有無」という大きな違いがあります。
この違いを正しく理解しないと、
- ショートコードが展開されない
- pタグが自動挿入されない
- 本文の加工がうまくいかない
といったトラブルの原因になります。
当記事では、両者の違いから具体的なサンプルコード、実践的な使い分けまで詳しく解説します。
the_content()とget_the_content()の違い
まず、2つの関数の最も重要な違いを押さえましょう。
- 本文を直接画面に出力する(echo)
- フィルターフックが適用される
- 自動整形(pタグ・brタグの自動挿入)が行われる
- ショートコードが展開される
- oEmbedが変換される
- 本文を文字列として返す(return)
- フィルターフックが適用されない
- 自動整形が行われない
- ショートコードがそのまま文字列として残る
- oEmbedが変換されない
get_the_content()は、the_contentフィルターフックを通さずに本文データを返します。
そのため、get_the_content()で取得した内容とthe_content()で出力される内容は同じではありません。
the_content()の内部処理を理解する
the_content()が内部でどのように動作しているかを知ると、2つの関数の違いがより明確になります。
ワードプレスのコアファイル(wp-includes/post-template.php)では、the_content()は以下のような処理を行っています。
function the_content() {
// ① get_the_content()で本文を取得
$content = get_the_content();
// ② the_content フィルターを適用
$content = apply_filters( ‘the_content’, $content );
// ③ 画面に出力
echo $content;
}
つまり、the_content()は内部でget_the_content()を呼び出し、その後にフィルターを通して出力しています。
get_the_content()はこの処理の「①の段階」、つまりフィルター適用前の生データを返す関数ということです。
フィルターによって行われる処理
the_contentフィルターを通ることで、the_content()関数では以下の処理が自動的に適用されます。
- wpautop:改行を <br> タグに、空行を <p> タグに自動変換する(自動整形)
- do_shortcode:ショートコード([shortcode] 形式)を実際のHTMLに展開する
- wptexturize:引用符やダッシュなどの文字を正しい記号に変換する
- wp_make_content_images_responsive:画像にレスポンシブ対応の srcset 属性を追加する
- convert_smilies:テキストの顔文字を画像に変換する
get_the_content()ではこれらの処理が一切適用されないため、取得した本文はエディタに保存された生のデータに近い状態です。
the_content()の使い方
それでは、the_content()の使い方を説明します。
基本的な使い方
the_content()は、ワードプレスのループ(メインループ)内で使用し、本文をそのまま画面に出力する場合に使います。
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<div class=”entry-content”>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php endif; ?>
通常、the_content()は、投稿ページ(single.php)や固定ページ(page.php)のテンプレートファイルで使用します。
パラメータを指定しなければ、本文がフィルター適用済みの状態でそのまま出力されます。
「続きを読む」のテキストをカスタマイズする
投稿本文中に <!–more–> タグ(moreタグ)が挿入されている場合、一覧ページではmoreタグまでの部分だけが表示され、残りは「続きを読む」リンクに省略されます。
the_content()の第1引数で、このリンクのテキストを変更できます。
<?php the_content( ‘この記事の続きを読む »’ ); ?>
<?php the_content( get_the_title() . ‘ の続きを読む’ ); ?>
moreタグの動作を制御する
the_content()の動作は、グローバル変数 $more で制御できます。
<?php
global $more;
$more = 0; // moreタグまでのみ表示
the_content( ‘続きを読む’ );
?>
■ 本文をすべて表示する
<?php
global $more;
$more = 1; // 本文全体を表示
the_content();
?>
get_the_content()の使い方
次は、get_the_content()の使い方をサンプルコード付きで紹介します。
基本的な使い方
get_the_content()は、本文を文字列として取得し、変数に格納して加工したい場合に使います。
<?php
$content = get_the_content();
// $content を使って何らかの加工処理を行う
echo $content;
?>
get_the_content()で取得した本文は、フィルターが適用されていない生データです。
そのまま echo すると、ショートコードが展開されず、pタグも自動挿入されないため、the_content()と同じ表示にはなりません。
the_content()と同じ表示にしたい場合
get_the_content()で取得した本文を、the_content()と同じフィルター適用済みの状態にするには、手動でフィルターを適用します。
<?php
$content = get_the_content();
$content = apply_filters( ‘the_content’, $content );
$content = str_replace( ‘]]>’, ‘]]>’, $content );
echo $content;
?>
ショートコードだけ展開したい場合
自動整形(wpautop)は不要だが、ショートコードだけは展開したいという場合は、do_shortcode()を使います。
<?php
$content = get_the_content();
$content = do_shortcode( $content );
echo $content;
?>
HTMLタグ・ショートコードを除去してテキストだけ取得する
本文から純粋なテキストだけを取り出したい場合(文字数カウントや検索用データなど)は、strip_tags()とstrip_shortcodes()を組み合わせます。
<?php
$content = get_the_content();
$content = strip_shortcodes( $content ); // ショートコード除去
$content = strip_tags( $content ); // HTMLタグ除去
echo $content;
?>
使い分けの基準
どちらの関数を使うべきか迷ったときは、以下の基準で判断してください。
- 投稿ページや固定ページで本文をそのまま表示したい
- ショートコードやoEmbedを正常に動作させたい
- プラグインによる本文加工(広告挿入、目次生成など)を反映させたい
- moreタグの「続きを読む」機能を使いたい
- 本文を変数に格納して加工・編集してから出力したい
- 本文の文字数をカウントしたい
- 本文から特定のテキストや画像URLを抽出したい
- フィルター処理を自分で制御したい
迷ったらまずはthe_content()を使いましょう。
通常のテーマ開発では、the_content()を使えば自動整形やショートコード展開が行われるので問題なく本文が表示されます。
ただ、「本文データを加工してから出力したい」という場合にはget_the_content()を使用してください。
実践的なサンプルコード集
ここからは、実際の開発で役立つサンプルコードを紹介します。
本文の文字数を取得して表示する
投稿本文の文字数を取得して「この記事は約○○文字です」と表示するサンプルです。
$content = get_the_content();
$content = strip_shortcodes( $content );
$content = strip_tags( $content );
$char_count = mb_strlen( $content );
echo ‘<p>この記事は約 ‘ . number_format( $char_count ) . ‘ 文字です。</p>’;
?>
mb_strlen()はマルチバイト文字(日本語など)を正しくカウントする関数です。
strlen()だとバイト数がカウントされ、日本語では正しい文字数にならないので注意してください。
本文から最初の画像URLを取得する
本文中の最初の画像のURLを取得して、アイキャッチ画像が未設定の場合に使うサンプルです。
function get_first_image_from_content() {
$content = get_the_content();
$content = apply_filters( ‘the_content’, $content );
preg_match( ‘/<img.+?src=[“\’]([^”\’]+)[“\’]/’, $content, $matches );
if ( isset( $matches[1] ) ) {
return $matches[1];
}
return false;
}
?>
本文の末尾に著者情報を自動追加する(フィルターフック)
the_contentフィルターフックを使って、全ての投稿記事の末尾に著者情報ボックスを自動的に追加します。
function add_author_box( $content ) {
if ( is_single() ) {
$author = get_the_author();
$author_box = ‘<div class=”author-box”>’;
$author_box .= ‘<p>この記事を書いた人:’ . esc_html( $author ) . ‘</p>’;
$author_box .= ‘</div>’;
$content .= $author_box;
}
return $content;
}
add_filter( ‘the_content’, ‘add_author_box’ );
このコードでは、the_content()で本文が出力される直前にフィルター処理が行われ、著者情報が自動的に追加されます。
また、is_single()で投稿ページのみに限定しているため、固定ページや一覧ページには表示されません。
本文の先頭にお知らせバナーを挿入する
function add_notice_before_content( $content ) {
if ( is_single() ) {
$notice = ‘<div class=”notice-banner”>’;
$notice .= ‘<p>現在キャンペーン実施中です!</p>’;
$notice .= ‘</div>’;
$content = $notice . $content;
}
return $content;
}
add_filter( ‘the_content’, ‘add_notice_before_content’ );
キャンペーン情報などを全記事に一括で表示させたい場合は、
こちらのコードを参考にしてください。
自動整形(wpautop)を無効化する方法
the_content()を使うと、ワードプレスの自動整形機能によってpタグやbrタグが自動挿入されます。
HTMLを手書きしている場合など、この自動整形が不要なことがあります。
全体的に無効化する方法
自動整形を全体的に無効化したい場合には、functions.phpに以下のコードを記述してください。
ただ、自動整形を完全に無効化すると、ブロックエディタ(Gutenberg)で作成した記事の改行もすべて反映されなくなります。
全体を無効化するのではなく、特定の投稿のみ無効化する方がリスクは少ないです。
↓
特定の投稿のみ無効化する方法
カスタムフィールドなどの条件を使って、特定の投稿だけ自動整形を無効化することもできます。
functions.phpに以下のコードを記述してください。
// カスタムフィールド「disable_wpautop」が設定されている場合のみ無効化
if ( get_post_meta( get_the_ID(), ‘disable_wpautop’, true ) ) {
remove_filter( ‘the_content’, ‘wpautop’ );
}
return $content;
}
add_filter( ‘the_content’, ‘conditional_remove_wpautop’, 1 );
ブロックエディタ(Gutenberg)での動作
ブロックエディタ(Gutenberg)で作成した記事でも、the_content()は問題なく動作します。
the_content()はそのHTMLにフィルターを適用して出力するため、ブロックエディタで作成した記事も従来通り表示されます。
ブロック特有のクラス名(wp-block-xxxなど)もそのまま出力されるので、テーマ側でこれらのクラスに対応するCSSを用意しておくことが大切です。
よくあるトラブルと対処法
get_the_content()でショートコードが展開されない
対処法:取得した本文に手動でdo_shortcode()を適用してください。
$content = get_the_content();
$content = do_shortcode( $content );
get_the_content()でpタグが入らない
対処法:pタグの自動挿入が必要な場合は、apply_filters()でフィルターを手動適用するか、wpautop()関数を直接適用してください。
$content = get_the_content();
$content = wpautop( $content );
ループの外でthe_content()を使っても何も表示されない
対処法:ループの外で特定の投稿の本文を取得したい場合は、get_post_field()を使用してください。
$content = get_post_field( ‘post_content’, $post_id );
$content = apply_filters( ‘the_content’, $content );
echo $content;
最後に
今回は、ワードプレスのthe_content()とget_the_content()の違いと使い方について紹介しました。
get_the_content()は、フィルター未適用の本文を文字列として返す関数です。本文を変数に格納して加工したい場合に使います。
get_the_content()を使う場合は、必要に応じてapply_filters()やdo_shortcode()を手動で適用することを忘れないようにしましょう。
当記事のサンプルコードを参考に、テーマ開発やカスタマイズにお役立てください。

コメント