開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

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

最終更新:2017-05-16 by Joe

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

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

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

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

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

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

下記が実際の処理です:

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

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

実際は、データベースに入っているテキストをそのまま取得するわけでななく、get_the_content()内にも、文字列を処理する幾つかの処理があります。

例えば、「<!-- more -->」などを検出して、サマリ(ソースコード内ではTeaserと呼ばれています。)テキストをアーカイブテンプレート用に分岐したりしています。詳しく知りたい方はソースコードをご覧ください。

もしあなたが、追加処理もすべて迂回して、データベースに保存されている本文データをそのまま取り出すには、このような記述になると思います。あえて迂回する必要があれば、というぐらいの処理だと思います。

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

さて、get_the_content()で取得したテキストデータのは、WP管理画面のビジュアルエディタすでにHTMLタグが含まれていたりします。

これではまだ、プレーンテキストとは呼べないわけです。

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

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

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

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

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

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


補足:the_content()について

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

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

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

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

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

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


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

サイト内の記事: