【WordPress】投稿記事の抜粋文(excerpt)を表示する方法|the_excerptの基本とHTMLタグ許可

記事一覧ページなどで、本文の要約(抜粋・excerpt)だけを表示したいときはthe_excerpt() を使います。この記事では、基本の使い方と、日本語サイト特有の注意点(文字数の扱い・手動抜粋の優先)、HTMLタグを許可する方法を解説します。

この記事でわかること

  • the_excerpt() の基本的な使い方
  • 日本語サイトでは excerpt_length は「文字数」を指定する(「ワード」ではない)
  • 手動で書いた抜粋が優先される仕組み
  • 抜粋内でHTMLタグを許可する方法と注意点
スポンサーリンク

the_excerpt() の基本的な使い方

archive.phpindex.php など、一覧を表示するテンプレートのループ内に置きます。

テンプレート:抜粋を表示
<?php the_excerpt(); ?>
手動で抜粋を書いている記事はそちらが優先される
投稿編集画面の「抜粋」欄に文章を入力している場合the_excerpt() は自動生成ではなくその手入力の内容をそのまま表示します。この場合、後述の excerpt_length(文字数調整)は効きません。自動生成に統一したい場合は、抜粋欄を空のままにしておきましょう。

抜粋の長さ(文字数)を指定する

the_excerpt() は既定で55語相当の長さを自動生成しますが、functions.php に次のコードを追加すると調整できます。

functions.php:抜粋の長さを指定する
function custom_excerpt_length($length) {
  return 20;
}
add_filter('excerpt_length', 'custom_excerpt_length');
「ワード」ではなく「文字数」として扱われる(日本語サイト)
WordPressの抜粋生成(wp_trim_words())は、サイトの言語ロケールに応じて「単語数」か「文字数」かを自動で切り替えます。日本語ロケールのサイトでは「文字数」でカウントされるため、上のコードの 20実際には「20文字」を意味します(英語圏の解説でよく見る「ワード数」という説明は、日本語サイトではそのまま当てはまりません)。長さの細かい調整例・省略記号のカスタマイズは記事の抜粋(excerpt)の長さと省略記号[…]を変更する方法で詳しく解説しています。

抜粋内でHTMLタグを許可する

既定では the_excerpt() はHTMLタグを取り除いたプレーンテキストを表示します。装飾タグを残したい場合は、次のように the_excerpt フィルターで本文と同じ処理(the_content フィルター)を通します。

functions.php:抜粋内のHTMLタグを許可する
function allow_html_in_excerpt($content) {
  return apply_filters('the_content', $content);
}
add_filter('the_excerpt', 'allow_html_in_excerpt');
一覧ページが重くなることがある
この方法は本文と同じすべてのコンテンツフィルター(ショートコード・oEmbed埋め込み・ギャラリーなど)を抜粋にも適用します。記事に動画埋め込みや重いショートコードが含まれていると、一覧ページで記事数ぶん同じ処理が走り表示が重くなることがあります。装飾タグ程度に留めたい場合は、wp_kses() で許可するタグを限定する方法も検討してください。

関連する文字数・表示のカスタマイズ

よくある質問(FAQ)

Q抜粋の文字数を変えたのに反映されません。
A投稿編集画面の「抜粋」欄に手入力の内容があると、excerpt_length フィルターより手入力の内容が優先されます。自動生成に統一したい場合は、その記事の抜粋欄を空にしてください。
Qexcerpt_length の数値は何文字・何語として扱われますか?
A日本語ロケールのWordPressサイトでは「文字数」としてカウントされます(英語ロケールでは単語数)。日本語で書いている場合、return 20; は「20文字」で切り詰められると考えてください。
Q抜粋末尾の「[…]」を「続きを読む」リンクに変えたいです。
Aexcerpt_more フィルターで置き換えます。add_filter('excerpt_more', function () { return '... <a href="' . esc_url(get_permalink()) . '">続きを読む</a>'; }); のように esc_url() でエスケープして出力します。詳しいバリエーションは省略記号を変更する方法を参照してください。

まとめ

  • 基本the_excerpt() をテンプレートのループ内に置く
  • 優先順位:手動で書いた抜粋があればそちらが優先される
  • 日本語サイトexcerpt_length は「文字数」として扱われる
  • HTMLタグ許可the_content フィルターを通すが、重くなる可能性に注意

基本を押さえたら、長さの微調整や省略記号の変更はこちらの記事もあわせてご覧ください。