WordPressで抜粋を表示させるメモ

WordPressには「抜粋」という機能があります。
この抜粋とは要約文の事で、投稿の内容を省略した短い文章として表示させる事ができます。

投稿一覧ページで使う事が多く、よく見かけるのがタイトルとアイキャッチと抜粋を組み合わせた形です。
単にタイトルだけ並べるよりも記事の内容が分かりやすくなり、興味を引いたりする事もできます。

投稿本文の冒頭から、設定された文字数だけを表示する事ができます。
表示される文字数はデフォルトでは55文字、「WP Multibyte Patch(最初から入っているプラグイン)」が有効の場合は110文字に設定されています。
「WP Multibyte Patch」が無効になっている場合は必ず有効にするようにしてください。

抜粋の表示方法

テンプレートのループ内に以下のコードを記述します。

テンプレート
the_excerpt();

抜粋の文字列を変数に代入して使いたい場合は以下のようにします。文字列を加工したい、条件文で使いたい、ヒアドキュメント内に表示したい場合などは変数に代入すると便利です。

テンプレート
$excerpt = get_the_excerpt();

「the_excerpt()」に自動的に付いてくるpタグを削除する

抜粋を「the_excerpt()」で表示させると、自動的にpタグで囲まれてしまいます。必要ない場合は以下の方法でpタグを削除します。

functions.phpまたは該当するテンプレートに記述します。

functions.php・テンプレート
remove_filter('the_excerpt','wpautop');

または、「the_excerpt()」を「echo get_the_excerpt()」以下に置き換えるとpタグは付いてきません。

テンプレート
echo get_the_excerpt();

任意の文章を表示させたい

何もしなければ投稿本文の冒頭から自動的に抜粋されますが、任意の文章を表示させる事もできます。
投稿編集画面の下の方に「抜粋」の見出しが付いた入力蘭がありますので、こちらに入力する事で任意の文章を優先的に表示できます。文字数制限はなく、htmlタグも使用する事ができます。

入力蘭が表示されていない場合は、投稿編集画面右上の「表示オプション」から「抜粋」にチェックを入れると表示されるようになります。

固定ページで抜粋を有効にする

通常は投稿編集画面にしか抜粋の入力蘭が表示されませんが、固定ページ編集画面でも有効にする事ができます。
functions.phpに以下のコードを追加します。第1パラメータには投稿タイプ、第2パラメータには追加したい機能を指定します。

functions.php
add_post_type_support('page','excerpt');

カスタム投稿で抜粋を有効にする

もちろんカスタム投稿でも抜粋を有効にする事ができます。functions.php内のカスタム投稿が設定されている箇所を探して、「supports」の部分に「excerpt」を追加します。

functions.php
add_action('init','create_posttype');
function create_posttype(){
	register_post_type('sample_name',
		array(
			・
			・
			・
			'supports' => array('title','editor','excerpt')
		)
	);
}

抜粋の省略記号を変更する

抜粋を表示させると、自動的に[...]という省略記号が付いてきます。僕だけではないと思いますが、この謎の[ ]を取りたいという欲求が出てくると思います。
そんなときは以下の方法で新しい省略記号を設定できます。

functions.php
function custom_excerpt_more($more){
	return '...';
}
add_filter('excerpt_more', 'custom_excerpt_more');

抜粋の文字数を変更する

抜粋で表示される文字数は、WP Multibyte Patchプラグイン有効時にデフォルトで110文字に設定されていますが、好きな文字数に変更する事ができます。
以下の例では70文字に設定しました。検証したところ、日本語でも半角英数でも記号でも同じ文字数が表示されました。

functions.php
function custom_excerpt_length($length){
	return 70;
}
add_filter('excerpt_length','custom_excerpt_length',999);

カテゴリー毎に抜粋の文字数を変更する

カテゴリー毎に抜粋の文字数を変更したい場合は先ほどのフィルターに「in_category()」を使った条件文を追加します。

functions.php
function custom_excerpt_length($length){
	if(in_category('cat1')){
		return 100;
	}
	elseif(in_category('cat2')){
		return 90;
	}
	else{
		return 110;
	}
}
add_filter('excerpt_length','custom_excerpt_length',999);

投稿タイプ毎に抜粋の文字数を変更する

以下の例では投稿と固定ページで表示させる文字数を別々に設定してみました。

functions.php
function custom_excerpt_length($length){
	if(get_post_type() == 'post'){
		return 100;
	}
	elseif(get_post_type() == 'page'){
		return 90;
	}
	else{
		return 110;
	}
}
add_filter('excerpt_length','custom_excerpt_length',999);

個別に抜粋の文字数を設定する

サイトによっては、いろいろな場所に抜粋を表示させる必要があって、かつ表示させる文字数も様々な場合があります。

まずは先ほど設定した文字数を少し大きめの数字にしておきます。ここで設定した文字数より多く表示させる事はできないためです。

functions.php
function custom_excerpt_length($length){
	return 300;
}
add_filter('excerpt_length','custom_excerpt_length',999);

テンプレート内の「the_excerpt()」の部分を以下の1行に置き換え、数字の部分を場所に応じて変更ます。

テンプレート
echo mb_substr(get_the_excerpt(),0,100);

次のような感じで簡単なユーザー定義関数を用意すると少しスマートになります。

functions.php
function custom_excerpt($excerpt_length){
	$my_excerpt = get_the_excerpt();
	$my_excerpt = mb_substr($my_excerpt, 0, $excerpt_length);
	echo $my_excerpt;
}

使い方は同じくテンプレート内の「the_excerpt()」の部分を「custom_excerpt()」に置き換えてください。「custom_excerpt(100)」のように()の中に表示させたい文字数を入れて使います。

テンプレート
custom_excerpt(100);

表示が遅い場合

「the_excerpt()」は表示が遅いと感じる事があります。僕の例だと、漢字がたくさん使われているページの抜粋を表示させようとしたら5秒近くかかってしまった事もあります。

表示が遅い場合は、「the_excerpt()」のかわりに「get_the_content()」を使うと改善されます。
「the_excerpt()」を「echo get_the_excerpt()」に置き換えるだけでも速度が改善されるという情報もあります。

先ほどのユーザー定義関数の「get_the_excerpt()」の部分を「get_the_content()」に置き換えると以下のようになります。

functions.php
function custom_excerpt($excerpt_length){
	$my_excerpt = get_the_content();
	$my_excerpt = mb_substr($my_excerpt, 0, $excerpt_length);
	echo $my_excerpt;
}

ただ、「get_the_content()」はhtmlタグやショートコードも表示してしまうためそれらを削除する必要があります。また省略文字がないので追加しました。

functions.php
function custom_excerpt($excerpt_length){
	$my_excerpt = get_the_content();
	$my_excerpt = strip_tags($my_excerpt);
	$my_excerpt = strip_shortcodes($my_excerpt);
	$my_excerpt = mb_substr($my_excerpt, 0, $excerpt_length) . '...';
	echo $my_excerpt;
}

「the_excerpt()」でも問題が起こらない場合もありますが、はじめから「get_the_content()」を使うようにした方が無難かもしれません。
本文からの抜粋ではなく任意の抜粋を表示したいときはカスタムフィールドを使うという方法もあります。

最終更新日:2018/10/24