WordPress関数のthe_excerptは記事本文の抜粋を表示します。一覧表示する記事の抜粋を表示するときに使うのが定番の用途です。編集画面の「抜粋」に入力された内容が表示されますが、「抜粋」に何も入力されていない場合は本文の先頭からの抜粋が表示されます。
初期設定では本文の先頭から110文字が抜粋されます。
抜粋の文字数のカスタマイズ
「先頭から110文字」の文字数は変更することができます。たとえば、functions.phpに「抜粋の文字数を40文字に」のようなコードを書きます。
実際に動いていて参考になるコードがStinger5というテーマのfunctions.phpに書かれています。
// 抜粋の長さを変更する function custom_excerpt_length( $length ) { return 40; } add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
これにより、抜粋の文字数が40文字になります。合わせて抜粋の後に付加する文字についても次のコードでカスタマイズされています。
// 文末文字を変更する function custom_excerpt_more($more) { return ' ... '; } add_filter('excerpt_more', 'custom_excerpt_more');
これにより、Stinger5では抜粋が110文字ではなく40文字表示され、「 … 」が付加されています。
Stinger5のように元の110文字からカスタマイズされているテーマについて、さらに自分でカスタマイズしたい場合は、この数字や文字を変更するか、子テーマで同じようなフックを定義してカスタマイズすれば良いでしょう。
抜粋の話から少しそれますが、上記のコードを子テーマでカスタマイズしようと思って(抜粋の文字数を80文字にしたい)次のようなコードを子テーマのfunctions.phpに入力してもうまくいきません。
// 抜粋の長さを変更する function custom_excerpt_length( $length ) { return 80; } add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
「Fatal error: Cannot redeclare custom_excerpt_length() 」のようなエラーメッセージが表示されるはずです。
これは、親テーマと子テーマで同じユーザー定義関数を定義できないという意味です。少なくとも「custom_excerpt_length2」のような名前に変える必要があります。
ただし、次のようなコードを書いてもうまくいきません。
// 抜粋の長さを変更する function custom_excerpt_length2( $length ) { return 80; } add_filter( 'excerpt_length', 'custom_excerpt_length2', 999 );
実行しても、抜粋の文字数は40文字から変わらないでしょう。
原因はadd_filterのフックが子テーマから読み込まれるためです。親テーマが後に読み込まれ、優先度が同じため、後から読み込まれた親テーマの「40文字」が適用されてしまいます。
優先度はadd_filterの3番目のパラメータに指定する数値です。小さい方から実行されるので、後に実行して欲しければ大きな数値にしておきます。現在、どちらも999になっているので、たとえば子テーマに記述する方の優先度を「9999」などにします。
// 抜粋の長さを変更する function custom_excerpt_length2( $length ) { return 80; } add_filter( 'excerpt_length', 'custom_excerpt_length2', 9999 );
これにより、子テーマに記述した抜粋の文字数のカスタマイズが適用されるようになります。
パーツごとに抜粋の文字数を変えたいとき
上記の方法で抜粋の文字数を変更できますが、サイト全体で文字数が設定されます。トップページの記事一覧では60文字、サイドバーでは70文字のように同じ「抜粋」でもパーツによって文字数を切り替えたいときは工夫が必要です。
いくつか方法がありますが、get_the_contentで取得した本文全体から必要な文字数だけ抽出する方法があります。たとえば、次のようなコードです。
<?php echo mb_substr(strip_tags(get_the_content()), 0, 70); ?>
get_the_contentで取得した本文全体からstrip_tagsでタグを取り除き、mb_substrで70文字を抽出しています。その70文字をechoで画面に表示して完了です。
実際に使うにはもう少し加工が必要になる場合がありますが、基本的にはこの考え方でパーツごとに抜粋の文字数を変更することができます。