もしこのブログがお役に立ちましたら、次回のAmazonでのお買い物時に こちらのリンクから 購入していただけますと嬉しく思います。

2016年10月17日

content.php ではなく functions.php を使って抜粋を表示する

WordPress のトップ画面やアーカイブ画面で記事を一覧表示する場合、デフォルトでは本文全体が表示されてしまいます。
これを抜粋表示に変更する方法としてよく紹介されているのが、下記のように content.php の条件文を細工するという技です。

<?php if ( is_search() ) : ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
<?php else : ?>

上記1行目の if 文を下記に変更。

<?php if ( is_search() || is_home() || is_archive() ) : ?>

ただこれでは、テーマをアップデートするたびにファイルを修正しなければなりません。
そこで子テーマの出番になるわけですが、子テーマの functions.php に下記のコードを加えると、疑似的な抜粋表示が実現できます。
(もちろん、子テーマではなく通常の functions.php に追加しても動きます。)

function show_excerpt($the_content) {
    if (is_search() || is_home() || is_archive()) {
        return mb_substr(trim(preg_replace('/\s{2,}/', ' ', strip_tags($the_content))), 0, 55) . ' &hellip; <a href="' . get_permalink() . '">続きを読む &rarr;</a>';
    } else {
        return $the_content;
    }
}
add_filter('the_content', 'show_excerpt');

if 文の内側の文字列変換は下記のような順序で行っています。

  1. strip_tags($the_content) で本文のタグをすべて削除
  2. preg_replace('/\s{2,}/', ' ', $hoge) で2つ以上連続した空白文字を半角スペースに変換
  3. trim($hoge) で先頭と末尾の空白文字を削除
  4. mb_substr($hoge, 0, 55) で、the_excerpt() と同様、先頭の55文字を切り出し
  5. 文字列の末尾に「…」と記事へのリンクを追加

探した限り、この方法はどのサイトにも載っていなかったので、もしお役に立ちましたらコメントをいただけると嬉しいです。
なお、この方法と content.php を細工する方法とで、HTML タグの class が若干変わるようですので、適宜スタイルシートなども修正する必要があるかも知れません。