WordPressで綺麗な本文抜粋を取得する方法(moreタグ対応、ショートコード、タグ、特殊文字削除)

本文文字列の抜粋

WordPressには本文の抜粋を取得する関数としてget_the_excerpt()というのがあります。

ただこの関数、ショートコードや特殊文字が取り除かれなかったり、メインループ内で使用すると動作が変わってしまったりして、いまいち使いづらいです。

ということで、本文から綺麗な抜粋を取得できるget_the_custom_excerptという関数を作ってみました。

スポンサーリンク
レクタングル(大)広告

WordPressの本文抜粋に求めるもの

僕が抜粋に求めるのは以下のポイントです。

  1. 長い文字列を指定した長さにしてくれる
  2. タグの削除
  3. <!–more–>タグ以降は表示しない
  4. ショートコードの削除
  5. 特殊文字の削除

WordPressデフォルトの、get_the_excerptは(書き出すthe_excerptも)、基本的に赤字部分はやってくれず、黄文字もメインループ内だとやってくれないことがあります。(僕のやり方が悪いのかもしれないけど)

今回は、上の条件にすべて合う抜粋文字取得関数get_the_custom_excerptを作成してみました。

抜粋文字取得関数

作成した関数は以下です。

//本文抜粋を取得する関数
//使用方法:https://nelog.jp/get_the_custom_excerpt
function get_the_custom_excerpt($content, $length) {
  $length = ($length ? $length : 70);//デフォルトの長さを指定する
  $content =  preg_replace('/<!--more-->.+/is',"",$content); //moreタグ以降削除
  $content =  strip_shortcodes($content);//ショートコード削除
  $content =  strip_tags($content);//タグの除去
  $content =  str_replace("&nbsp;","",$content);//特殊文字の削除(今回はスペースのみ)
  $content =  mb_substr($content,0,$length);//文字列を指定した長さで切り取る
  return $content;
}

この関数を、functions.phpなどにコピペしてテーマのテンプレート内で使用します。

2つの引数のうち、$contentには、本文全体を渡します。get_the_content()とか、$post->post_contentみたいなものを渡せばOKかと思います。

$lengthは、文字列を区切る長さを指定します。

$contentは、関数内で$content = get_the_content();としてもいけそうな気もするんですが、メインループ内で呼び出すと<!–more–>タグ以降を取り除く処理が適切に動作しなかったので、このようにしてあります。

関数内では以下のようなことをしています。

  1. <!–more–>タグ以降を取り除く
  2. ショートコードを取り除く
  3. タグを取り除く
  4. 特殊文字を取り除く(今回はスペースのみ、他のものも含める場合は変更してください)
  5. 文字列を指定した長さに揃える

関数を実際に利用するには

今回の関数をfunctions.phpに書いたからといって、デフォルトのWordpress抜粋文字列( get_the_excerpt関数で取得できる文字列)が綺麗に整理されるわけではありません。

今回の関数を利用するには、Wordpressテンプレートの抜粋を表示したいところで以下のように書いて利用する必要があります。

<?php echo get_the_custom_excerpt( get_the_content(), 150 ) ?>

引数1には本文の文字列、引数2には抜粋する文字数を指定します。

まとめ

これでWordpressの本文抜粋が完璧になったかはわかりません。

ただ、文字列の長さなどは、関数でフックして指定する必要がなくなったので、前よりは少し使いやすくなったのではないかと思います。

もし、さらに加えた方が良い処理がある場合は、ご教授ください。

スポンサーリンク
レクタングル(大)広告
レクタングル(大)広告

スポンサーリンク

『WordPressで綺麗な本文抜粋を取得する方法(moreタグ対応、ショートコード、タグ、特殊文字削除)』へのコメント

  1. 名前:アキ 投稿日:2016/02/11(木) 11:26:56 ID:a8072a92a

    大変参考になる記事をありがとうございます。

    こちらのコードを参考にさせて頂きまして、導入しているのですが、抜粋取得時に改行が反映されており、見栄えがいまいちよくありません。

    改行を無効化する方法を探してみたのですが、見つからなかったので、もし簡単に改行を無効にする方法をご存知でしたら、ご教示願えますと大変嬉しいです。

  2. アバター画像 名前:わいひら 投稿日:2016/02/11(木) 13:05:54 ID:22a075e22

    実際に試してはいないのですが、関数中のコード途中に以下を追加すればいけるのではないかと思います。

    $content =  preg_replace('/\n/',"",$content);

    上のコードを簡単に説明しておくと、$content内の改行(\n)を正規表現で空文字に置換しています。

    一応、タグ除去はしてあるので、違うかもしれませんがbrタグを取り除く場合は以下。

    $content =  preg_replace('/
    /i',"",$content);

    もし上の2つでうまくいかない場合は、改行といっても、様々なものがあるので、改行部分のコードがどのようになっているかなどがわからないと、確実な対策方法はちょっとわからないかもしれません。

  3. 名前:アキ 投稿日:2016/02/11(木) 17:05:38 ID:a8072a92a

    わいひら様

    早速のお返事ありがとうございました!

    試してみましたが私の環境ではどうもうまくいかないようです・・・。
    また時間の取れる時に触ってみることにします。参考になりました!

  4. アバター画像 名前:わいひら 投稿日:2016/02/11(木) 17:53:28 ID:22a075e22

    改行は、どういった方式で改行されているかによって、やり方も変わってくるので、サイトの改行方式を見極めた上で、上のコードに当てはめてみてください。

    あと、Wordpressで使用するなら、この記事のコードをfunctions.phpに書くだけではダメで、テンプレートの抜粋を表示する部分に、以下のようにして、コードを書かないと意味がないかもしれません。

    ※本文にも追記しておきました。

  5. 名前:memo 投稿日:2018/02/07(水) 14:46:10 ID:224c8fa7e

    わいひら様

    非常に参考になる記事をありがとうございます。
    1点お伺いしたいのですが、こちらの記事のコードを利用した場合に、抜粋表示の文章末尾に「・・・」と表示させるようにするにはどうすればよいでしょうか?

  6. アバター画像 名前:わいひら 投稿日:2018/02/07(水) 19:05:37 ID:cb7618c37

    $contentに3点リーダーを付け足すのではダメでしょうか?