WordPressで投稿の本文のテキストだけを取得する方法

最終更新:2020-06-12 by Joe

ワードプレスのテーマ開発で最もよく利用する関数の一つに「the_content()」があります。本文のテキストを取得するget_the_content()に対して、取得したテキストにフィルターをかけ、かつ、出力する事まで処理に含めた「the_content()」。

これらの関数を使って取得・出力された本文のテキストは、ビジュアルエディタや、Wordpress特有のテキスト処理(Auto Paragraph機能)により自動生成されたHTMLタグや、ショートコードが含まれていて、テキストだけのいわゆる「プレーンテキスト」とはほど遠い状態です。

これを、本当の「テキストだけ」の状態で出力したい時が、きっとあると思います。テーマ開発者であれば、きっとあると思います。その方法をまとめます。

投稿本文をプレーンテキストで出力する方法

まず、メインループにおいては、以下の順番で処理を行います。

  1. データベース内の文字列を取得する
  2. HTMLタグを取り除く
  3. ショートコードを取り除く
  4. 出力する

下記が実際の処理です:

// 1、投稿テキストを取得する
$content = get_the_content();

// 2,HTMLタグをすべて取り除く
$content = wp_strip_all_tags( $content );

// 3.ショートコードを取り除く
$content = strip_shortcodes( $content );

// 4、出力する
echo $content;
[2020/6/12 訂正] remove_shortcode() を strip_shortcodes() と訂正しました。ご指摘のフィードバック感謝したします、どうもありがとうございました。

順番に見ていきます。

(1) 投稿本文テキストを取得する:get_the_content()

get_the_content()で、テキストのみを取得できます。

実際は、データベースに入っているテキストをそのまま取得するわけでななく、get_the_content()内では、文字列を処理する幾つかの処理を通して取得されます。例えば、「<!– more –>」などを検出して、サマリ(ソースコード内ではTeaserと呼ばれています。)テキストをアーカイブテンプレート用に分岐したりしています。詳しく知りたい方はソースコードをご覧ください。

もしあなたが、そのような追加処理もすべて迂回して、データベースに保存されている本文データをそのまま取り出すには、このような記述になると思います。これを使うのは「あえて、素のテキストデータにアクセス刷る必要がある」という特別な場合ぐらいだと思います。

// 投稿本文を取得して、出力する
echo get_post_field( get_the_ID(), 'post_content' );

// こちらでも可能だが、global宣言を避けため、上記のほうがおすすめ。
global $post;
echo $post->post_content;

(2) 本文からHTMLタグを削除する:wp_strip_all_tags()

さて、get_the_content()で取得したテキストデータは、WP管理画面のビジュアルエディタ内で生成されたHTMLタグが含まれていたりします。これではまだ「プレーンテキスト」とは呼べないわけです。

一般的に「HTMLドキュメントからタグだけを削除する」というのは、実はかなり複雑な文字列処理だったりします。この処理を行うのために、すでに完成している wp_strip_all_tags() 関数がありますので、間違いなくそれをありがたく使うべきです。車輪の再開発(しかも超難解な車輪)は、全力で避けましょう。

(3) 本文からショートコードを削除する:strip_shortcodes()

最後です。ショートコードとは「[contact id=”xxx”]」などのこちらはワードプレス特有、かつ、テーマやプラグイン固有の処理です。

ショートコードに紐づく関数の実行は、上述の the_content() 内の apply_filter() 内部で実行ですので、そこを通らない場合、テキスト内の[xxxx xx=”xxx”]といった文字列は、ただの文字列として、get_the_content()で取得するテキストに含まれてきます。

プレーンテキストを表示したい時は、このショートコードは邪魔なので、strip_shortcodes() 関数を使って取り外します。

以上です。上手に投稿本文を取得&出力できたことを祈ります。


補足

the_content()について

the_content()は、get_the_content()で「取得した記事の本文を出力する」といったニュアンスが関数名にありますが、実際は、それ以外の処理も行っています。実際のソースコードを見てみましょう。

function the_content( $more_link_text = null, $strip_teaser = false) {
  $content = get_the_content( $more_link_text, $strip_teaser );

  /**
   * Filters the post content.
   *
   * @since 0.71
   *
   * @param string $content Content of the current post.
   */
  $content = apply_filters( 'the_content', $content );
  $content = str_replace( ']]>', ']]>', $content );
  echo $content;
}

コード内で、apply_filtersにて「the_content」というフィルター関数が実行されています

実際は、このフィルターフックに、有名な wpautop()  がデフォルトで紐付けられており、the_content()を使用すると自動パラグラフ機能が実行されてしまうわけです。wpautop() は、管理画面エディタから保存されたテキストに<p>タグ(p = paragraph)などを自動で追加する文字列処理です。

もしこのフィルター関数を迂回したければ、やはり一つの方法は、the_content()関数を使わずに、単純にget_the_content()でまずデータを取得し、それをecho で出力するほうほうです。

// 投稿の本文を取得して、そのまま出力
echo get_the_content();

この場合、autopnなど以外のすべてのフィルターを迂回します。

remove_filter() 関数の利用

いちおう、下記のremove_filter()を使う事もできますが、多くの場合、特定のページの特定の箇所でのみ、プレーンテキストが必要になるのではないでしょうか?

そのような場合は、その場面でだけ限定的に「$content = get_the_content(); 」として本文を取得したのちに、自力でecho したほうが無難でしょう。

// wpautopフィルタを外す・・、これをfunctions.phpなどに書き込むと
// すべてのthe_content関数利用においてautopをはずせる。
// でも、あまりおすすめしない。
remove_filter( 'the_content', 'wpautop' );

WordPressの本文取得に関するリンク

サイト内の記事: