ワードプレスのテーマ開発で最もよく利用する関数の一つに「the_content()」があります。本文のテキストを取得するget_the_content()に対して、取得したテキストにフィルターをかけ、かつ、出力する事まで処理に含めた「the_content()」。
これらの関数を使って取得・出力された本文のテキストは、ビジュアルエディタや、Wordpress特有のテキスト処理(Auto Paragraph機能)により自動生成されたHTMLタグや、ショートコードが含まれていて、テキストだけのいわゆる「プレーンテキスト」とはほど遠い状態です。
これを、本当の「テキストだけ」の状態で出力したい時が、きっとあると思います。テーマ開発者であれば、きっとあると思います。その方法をまとめます。
目次
投稿本文をプレーンテキストで出力する方法
まず、メインループにおいては、以下の順番で処理を行います。
- データベース内の文字列を取得する
- HTMLタグを取り除く
- ショートコードを取り除く
- 出力する
下記が実際の処理です:
// 1、投稿テキストを取得する
$content = get_the_content();
// 2,HTMLタグをすべて取り除く
$content = wp_strip_all_tags( $content );
// 3.ショートコードを取り除く
$content = strip_shortcodes( $content );
// 4、出力する
echo $content;
順番に見ていきます。
(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;
さて、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の本文取得に関するリンク
- https://wpdocs.osdn.jp/関数リファレンス/strip_shortcodes
- https://developer.wordpress.org/reference/functions/get_the_content/
- https://wpdocs.osdn.jp/テンプレートタグ/the_content
- WordPress Developer: the_content()
サイト内の記事: