【WordPress】投稿の本文を取得する方法|the_content()と生テキスト取得の違い

「投稿の本文を取得する」といっても、目的によって使う関数が変わります。ショートコードや装飾を反映して表示したいのか、プレーンテキストだけを抜き出したいのかで方法が異なります。この記事では、両者の違いと、テキスト取得時に注意すべき点を解説します。カテゴリー・ID・パーマリンクなど他の情報取得は記事の情報を取得する方法(完全ガイド)にまとめています。

この記事でわかること

  • 表示するなら the_content()(ショートコード・整形を反映)
  • プレーンテキストだけ欲しいなら wp_strip_all_tags()
  • script/styleタグの中身が漏れないようにする理由
  • 文字数で切り詰めて抜粋風にする方法
スポンサーリンク

表示するなら the_content()

ループ内で本文をそのまま表示したいだけなら、テンプレートタグ the_content() を使います。ショートコードの展開・段落の自動整形(wpautop)・oEmbedなど、投稿を表示する際の一連の処理(フィルター)が適用されます。

テンプレート:本文をそのまま表示
<?php the_content(); ?>

プレーンテキストだけを取得する

HTMLタグを除いたテキストだけを取得したい場合(メタディスクリプション生成・検索用データ作成など)は、データベースの生の本文(post_content)を取得してタグを除去します。

PHP:本文からプレーンテキストを取得
$post_id = get_the_ID();
$content = get_post_field('post_content', $post_id);
$content = wp_strip_all_tags($content);

echo esc_html($content);
strip_tags() ではなく wp_strip_all_tags() を使う
PHP標準の strip_tags()タグを取り除くだけで、<script><style>タグの中身(JSやCSSのコード)はそのまま平文で残ります。WordPress標準の wp_strip_all_tags() は、これらのタグを中身ごと先に除去してからタグを取り除くため、コードの断片が出力に混ざる事故を防げます。本文にショートコード生成のHTMLや、貼り付けたコードが含まれる可能性がある場合は、必ず wp_strip_all_tags() を使ってください。
ショートコードは展開されない
post_content を直接取得する上の方法では、本文中の [shortcode]文字列としてそのまま残ります(ショートコードが展開・実行されるのは the_content フィルターを通したときだけです)。ショートコードを展開した上でテキスト化したい場合は、wp_strip_all_tags(apply_filters('the_content', get_the_content())) のようにフィルターを適用してから除去してください。

文字数で切り詰めて抜粋風にする

取得したプレーンテキストを、指定した文字数で切り詰めることもよくあります。日本語では mb_substr() を使うと文字化けせずに切り詰められます。

PHP:100文字で切り詰める
$content = wp_strip_all_tags(get_post_field('post_content', $post_id));
$excerpt = mb_substr($content, 0, 100) . '…';

echo esc_html($excerpt);

WordPress標準の抜粋機能を使う場合は投稿記事の抜粋文(excerpt)を表示する方法を、タイトル・本文・抜粋の文字数を一括で制限する方法はタイトル・本文・抜粋の文字数を制限する方法を参照してください。

関連する取得・活用方法

よくある質問(FAQ)

Qget_the_content() と the_content() の違いは何ですか?
Athe_content() はフィルターを適用してそのままechoで出力します。get_the_content()フィルター未適用の生コンテンツをreturnします。テンプレートで直接表示するなら the_content()、変数に入れて加工するなら get_post_field('post_content', $id)apply_filters('the_content', get_the_content()) を使います。
Q特定の記事の本文をループ外・テンプレート外から取得するには?
Aget_post_field('post_content', $post_id) でIDを指定して取得できます。ループの外でも使え、投稿IDさえ分かれば任意の記事の本文にアクセスできます。フィルターを適用したい場合は apply_filters('the_content', $content) を通します。
Q本文からh2タグの内容だけを取得するには?
Apreg_match_all() で見出しタグを抽出します。preg_match_all('#<h2[^>]*>(.+?)</h2>#', get_the_content(), $matches); $headings = $matches[1];。目次の自動生成でよく使われるパターンで、詳しくは投稿本文内の見出しを自動で目次に変換する方法で解説しています。

まとめ

  • 表示するだけthe_content()(ショートコード等を反映)
  • プレーンテキストが欲しいget_post_field('post_content', $id)wp_strip_all_tags()strip_tags()ではない)
  • ショートコードごと除去apply_filters('the_content', ...) を先に通す
  • 切り詰めmb_substr() で日本語も安全に

「表示」と「テキスト抽出」は目的が違うので、混同せず使い分けましょう。