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' を追加してください。

お気軽にご相談ください

お見積りへ お問い合わせへ