WordPressには本文の抜粋を取得する関数としてget_the_excerpt()というのがあります。
ただこの関数、ショートコードや特殊文字が取り除かれなかったり、メインループ内で使用すると動作が変わってしまったりして、いまいち使いづらいです。
ということで、本文から綺麗な抜粋を取得できるget_the_custom_excerptという関数を作ってみました。
目次
WordPressの本文抜粋に求めるもの
僕が抜粋に求めるのは以下のポイントです。
- 長い文字列を指定した長さにしてくれる
- タグの削除
- <!–more–>タグ以降は表示しない
- ショートコードの削除
- 特殊文字の削除
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(" ","",$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–>タグ以降を取り除く処理が適切に動作しなかったので、このようにしてあります。
関数内では以下のようなことをしています。
- <!–more–>タグ以降を取り除く
- ショートコードを取り除く
- タグを取り除く
- 特殊文字を取り除く(今回はスペースのみ、他のものも含める場合は変更してください)
- 文字列を指定した長さに揃える
関数を実際に利用するには
今回の関数をfunctions.phpに書いたからといって、デフォルトのWordpress抜粋文字列( get_the_excerpt関数で取得できる文字列)が綺麗に整理されるわけではありません。
今回の関数を利用するには、Wordpressテンプレートの抜粋を表示したいところで以下のように書いて利用する必要があります。
<?php echo get_the_custom_excerpt( get_the_content(), 150 ) ?>
引数1には本文の文字列、引数2には抜粋する文字数を指定します。
まとめ
これでWordpressの本文抜粋が完璧になったかはわかりません。
ただ、文字列の長さなどは、関数でフックして指定する必要がなくなったので、前よりは少し使いやすくなったのではないかと思います。
もし、さらに加えた方が良い処理がある場合は、ご教授ください。
大変参考になる記事をありがとうございます。
こちらのコードを参考にさせて頂きまして、導入しているのですが、抜粋取得時に改行が反映されており、見栄えがいまいちよくありません。
改行を無効化する方法を探してみたのですが、見つからなかったので、もし簡単に改行を無効にする方法をご存知でしたら、ご教示願えますと大変嬉しいです。