2026年5月20日
2026年5月20日
WordPressの抜粋(excerpt)をカスタマイズする方法
はじめに
WordPressの抜粋(excerpt)は一覧ページで記事の概要を表示するために使います。デフォルトは55ワード(日本語では約110文字)で「[…]」が付きますが、文字数・区切り文字・「続きを読む」リンクはフィルターで変更できます。
症状・原因
- 抜粋が短すぎる・長すぎる
- 「[…]」を「続きを読む」リンクに変えたい
- 手動抜粋がない場合に本文から自動生成したい
- HTMLタグが残って見た目が崩れる
解決手順
ステップ1:文字数と区切り文字を変更する
// functions.php
// 抜粋の文字数を変更(日本語は文字数で指定)
add_filter('excerpt_length', function(int $length): int {
return 120; // 120文字
}, 999);
// 区切り文字を変更
add_filter('excerpt_more', function(string $more): string {
return '…';
});
ステップ2:「続きを読む」リンクを付ける
add_filter('excerpt_more', function(string $more): string {
return '… <a class="read-more" href="' . get_permalink() . '">続きを読む</a>';
});
/* style.css */
.read-more {
display: inline-block;
margin-left: 0.5em;
color: #2271b1;
font-weight: 500;
text-decoration: none;
}
.read-more:hover {
text-decoration: underline;
}
ステップ3:手動抜粋がない場合に本文から自動生成する
// functions.php
function my_get_excerpt(int $length = 120): string {
global $post;
// 手動抜粋が設定されている場合はそちらを優先
if ($post->post_excerpt) {
return wp_strip_all_tags($post->post_excerpt);
}
// 本文から生成(ショートコード・HTMLタグを除去)
$content = wp_strip_all_tags(
strip_shortcodes($post->post_content)
);
// 日本語対応のmb_substr
if (mb_strlen($content) > $length) {
$content = mb_substr($content, 0, $length) . '…';
}
return $content;
}
テンプレートでの使用:
// index.php・archive.php など
<p class="entry-excerpt"><?php echo esc_html(my_get_excerpt(120)); ?></p>
ステップ4:カスタム投稿タイプの抜粋を有効化する
デフォルトでは投稿(post)と固定ページ(page)のみ抜粋フィールドが表示されます。カスタム投稿タイプで使うには:
// register_post_type() の supports に 'excerpt' を追加
register_post_type('news', [
'label' => 'ニュース',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
// ...
]);
既存の投稿タイプに後から追加する場合:
add_post_type_support('page', 'excerpt');
ステップ5:the_excerpt フィルターでHTMLを制御する
// 抜粋に特定のHTMLタグを許可する
add_filter('wp_trim_excerpt', function(string $text): string {
// デフォルトではすべてのタグが除去される
// 必要に応じてタグを復元する場合
return $text;
});
注意事項
the_excerpt()は自動的にタグで囲まれます。get_the_excerpt()はタグなしのテキストを返します- 日本語は1文字が1ワードとカウントされないため
excerpt_lengthの数値はワード数(英語基準)です。日本語サイトではmy_get_excerpt()のような独自関数の方が文字数を正確に制御できます - 手動抜粋には改行やHTMLを含められますが、
the_excerpt()で表示すると除去されます
まとめ
excerpt_length フィルターで文字数、excerpt_more フィルターで区切り文字・「続きを読む」リンクを変更できます。日本語の正確な文字数制御には mb_substr() を使った独自関数が確実です。カスタム投稿タイプには supports に 'excerpt' を追加してください。