ワードプレスのthe_content()とget_the_content()の違いと使い方

ワードプレスのthe_content()とget_the_content()の違いと使い方 ワードプレス

今回は、ワードプレス(WordPress)のthe_content()とget_the_content()の違いと使い方について紹介します。

the_content()とget_the_content()は、どちらもワードプレスの投稿本文を扱う関数です。
しかし、この2つの関数には「出力方法」と「フィルター処理の有無」という大きな違いがあります。

この違いを正しく理解しないと、

  • ショートコードが展開されない
  • pタグが自動挿入されない
  • 本文の加工がうまくいかない

といったトラブルの原因になります。

当記事では、両者の違いから具体的なサンプルコード、実践的な使い分けまで詳しく解説します。

the_content()とget_the_content()の違い

まず、2つの関数の最も重要な違いを押さえましょう。

the_content()
  • 本文を直接画面に出力する(echo)
  • フィルターフックが適用される
  • 自動整形(pタグ・brタグの自動挿入)が行われる
  • ショートコードが展開される
  • oEmbedが変換される
get_the_content()
  • 本文を文字列として返す(return)
  • フィルターフックが適用されない
  • 自動整形が行われない
  • ショートコードがそのまま文字列として残る
  • oEmbedが変換されない
【最大のポイント】
get_the_content()は、the_contentフィルターフックを通さずに本文データを返します。
そのため、get_the_content()で取得した内容とthe_content()で出力される内容は同じではありません

the_content()の内部処理を理解する

the_content()が内部でどのように動作しているかを知ると、2つの関数の違いがより明確になります。

ワードプレスのコアファイル(wp-includes/post-template.php)では、the_content()は以下のような処理を行っています。

■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 で制御できます。

■ 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( ‘]]>’, ‘]]&gt;’, $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;
?>

使い分けの基準

どちらの関数を使うべきか迷ったときは、以下の基準で判断してください。

the_content()を使う場面
  • 投稿ページや固定ページで本文をそのまま表示したい
  • ショートコードやoEmbedを正常に動作させたい
  • プラグインによる本文加工(広告挿入、目次生成など)を反映させたい
  • moreタグの「続きを読む」機能を使いたい
get_the_content()を使う場面
  • 本文を変数に格納して加工・編集してから出力したい
  • 本文の文字数をカウントしたい
  • 本文から特定のテキストや画像URLを抽出したい
  • フィルター処理を自分で制御したい

迷ったらまずはthe_content()を使いましょう。
通常のテーマ開発では、the_content()を使えば自動整形やショートコード展開が行われるので問題なく本文が表示されます。

ただ、「本文データを加工してから出力したい」という場合にはget_the_content()を使用してください。

実践的なサンプルコード集

ここからは、実際の開発で役立つサンプルコードを紹介します。

本文の文字数を取得して表示する

投稿本文の文字数を取得して「この記事は約○○文字です」と表示するサンプルです。

<?php
$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を取得して、アイキャッチ画像が未設定の場合に使うサンプルです。

<?php
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フィルターフックを使って、全ての投稿記事の末尾に著者情報ボックスを自動的に追加します。

■ functions.php に記述

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()で投稿ページのみに限定しているため、固定ページや一覧ページには表示されません。

本文の先頭にお知らせバナーを挿入する

■ functions.php に記述

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に以下のコードを記述してください。

remove_filter( ‘the_content’, ‘wpautop’ );

ただ、自動整形を完全に無効化すると、ブロックエディタ(Gutenberg)で作成した記事の改行もすべて反映されなくなります。
全体を無効化するのではなく、特定の投稿のみ無効化する方がリスクは少ないです。

特定の投稿のみ無効化する方法

カスタムフィールドなどの条件を使って、特定の投稿だけ自動整形を無効化することもできます。
functions.phpに以下のコードを記述してください。

function conditional_remove_wpautop( $content ) {
  // カスタムフィールド「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()は問題なく動作します。

ブロックエディタで入力された内容は、HTML形式でデータベースに保存されます。
the_content()はそのHTMLにフィルターを適用して出力するため、ブロックエディタで作成した記事も従来通り表示されます。

ブロック特有のクラス名(wp-block-xxxなど)もそのまま出力されるので、テーマ側でこれらのクラスに対応するCSSを用意しておくことが大切です。

よくあるトラブルと対処法

get_the_content()でショートコードが展開されない

原因:get_the_content()はフィルターフックを通さないため、ショートコードの展開処理(do_shortcode)が実行されません。

対処法:取得した本文に手動でdo_shortcode()を適用してください。

$content = get_the_content();
$content = do_shortcode( $content );

get_the_content()でpタグが入らない

原因:自動整形(wpautop)もフィルターの一部のため、get_the_content()では適用されません。

対処法:pタグの自動挿入が必要な場合は、apply_filters()でフィルターを手動適用するか、wpautop()関数を直接適用してください。

$content = get_the_content();
$content = wpautop( $content );

ループの外でthe_content()を使っても何も表示されない

原因:the_content()とget_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()の違いと使い方について紹介しました。

the_content() は、フィルターフックを適用済みの本文をそのまま画面に出力する関数です。通常のテーマ開発ではこちらを使うのが基本です。

get_the_content()は、フィルター未適用の本文を文字列として返す関数です。本文を変数に格納して加工したい場合に使います。

get_the_content()を使う場合は、必要に応じてapply_filters()やdo_shortcode()を手動で適用することを忘れないようにしましょう。

当記事のサンプルコードを参考に、テーマ開発やカスタマイズにお役立てください。

コメント

タイトルとURLをコピーしました