記事の抜粋を指定文字だけ取り出す 【WordPress】

  • 投稿 : 2015-05-03
function get_the_post_excerpt($length) {
	global $post;
	$content = mb_substr(strip_tags($post->post_excerpt),0,$length);
	if(!$content){
		$content = $post->post_content;
		$content = strip_shortcodes($content);
		$content = strip_tags($content);
		$content = str_replace(" ","",$content); 
		//$content = html_entity_decode($content,ENT_QUOTES,"UTF-8");
		$content = mb_substr($content,0,$length);
	}
	return $content;
}

上記をテーマのfunctions.phpに追加して使います。

参考:
「the_excerpt()」をカスタマイズ[WordPress]
WordPress の記事抜粋( the_excerpt() ) を <head> タグ内で使う場合の注意点 | MacBook Air とWordPressでこうなった

ほとんど、上記の参考にしたソースのままです。
おそらく、html_entity_decodeの行はコメントアウトしておいた方がよいかと思います。PHP: html_entity_decode - Manualをみて各自判断してくださいね。

$content = mb_substr(strip_tags($post->post_excerpt),0,$length);の部分ですが、必ず「$post->post_content」から抜粋を取りたいときは、この部分を$content = null; に置き換えればOKです。

毎回、$post->post_contentから抜粋で問題ないのでは?と思わなくはないのですが、その判断ができないのでこのままにしています。

あと、検索して参考になるソースをいろいろ見ましたが、大体にたような感じになってますね。でてくる関数は同じなので、その関数がどういう処理をしているかを調べればよいかと思います。

使い方

<?php echo get_the_post_excerpt(100); ?>

テンプレート(テーマ)で、抜粋の欲しい箇所に上記のようにかけば抜粋が表示されるかと思います。

<?php echo str_replace("\n", "", get_post_excerpt(100));?>

改行コードだけ取り除いて表示させたい場合は、上記のように・・。

補足:strip_tagsについて

警告
strip_tags() は HTML の検証を行わないため、 不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。
PHP: strip_tags - Manual

特定の記事だけ、上記のサンプルで抜粋が指定文字数よりも明らかに短すぎるものがあって、いろいろ原因を探していたのですが、どうも「strip_tags」という関数の仕様のようです。

回避したかったら、strip_tagsを使わないで自分で実装してねということになるようなので諦めました。

その他

PHP - mb_strimwidth関数なんて必要なかった(?) - Qiita
【PHP】mb_strimwidthの使い方 | お仕事募集中

mb_strimwidthという関数が使えないかなとみてみたのですが、方向性がちがうかなぁと思いました。今時は、あまり必要なさそうな関数かと思います。

strip_tagsと同じロジックを正規表現とかでできないかなぁとも考えたのですが、下手に自分で考えると落とし穴にはまりそうで・・・。
スポンサーリンク