the_excerpt で抜粋有無・本文長短・moreタグを考慮して「続きを読む」を付ける

記事一覧で記事の一部を表示して「続きを読む」のリンクを付けるには、本文中に more タグを書いて the_content('続きを読む') とすれば良いです。でも、more タグメンドクサイとか、[抜粋]があればそれを表示したいとか、本文が短い時は要らんとか、本文が長い時は省略して「...」を付けたいとか、とにかく記事をどのように書いても *俺的に* うまい具合に「続きを読む」を付けるやり方です。

こちらの要望は以下のとおり。

  • 抜粋があればソレを表示して「続きを読む」。
  • more タグがあればそこまで表示して「続きを読む」。
  • 上記指定が無く、本文が長過ぎなら省略して「...」をつけて「続きを読む」。
  • 本文が短い場合は、全文を表示。
  • ループ中に the_excerpt() とだけ書けば、あとはよきにはからう。

本文の長い短いは、55文字基準(excerpt_length フィルタで変更可能)。WP Multibyte Patch をご使用なら wpmp-config.php の $wpmp_conf['excerpt_length'], $wpmp_conf['excerpt_mblength'] で指定します。

というわけで、以下を functions.php に追加。

function my_excerpt_more($more) {
  return ' ...';
}
add_filter('excerpt_more', 'my_excerpt_more');
function my_trim_excerpt($text, $raw_excerpt){
  global $post;
  $e = explode(' ...', $text);
  if($raw_excerpt || false !== strpos($post->post_content, '<!--more') || '' === $e[1])
    $text .= '<a class="excerpt-more" href="' . get_permalink() . '">続きを読む</a>';
  return $text;
}
add_filter('wp_trim_excerpt', 'my_trim_excerpt', 10, 2);

my_excerpt_more は、省略の印を ' ...' に変更してるだけです。my_trim_excerpt で、抜粋があるか、moreタグがあるか、省略されていれば「続きを読む」リンクを追加しています。ここの if がもっとスッキリすると良い。
css で .excerpt-more{display:block;} とすれば「続きを読む」が抜粋の後に改行して表示されます。画像に変えたりパッディングしたりも css でお好みに。

参照:more タグでがんばる場合
Codex: Customizing the Read More
動作確認バージョン
  • WordPress 2.9.1

10 Comments

  • 初めまして。長谷川といいます。とても参考になりました。ありがとうございました。
    一つ気になったのですが、条件文の「$e[1]」の中は必ずNULLになるようです。今3.0.1を使っていますが、バージョンの違いでしょうか。

    • kz kz

      こんにちは! if 文中の
      $e = explode(‘ …’, $text);
      が効いてない様子なので、外に出して
      条件も ” === $e[1] に変更しました。
      これで OK なはず◎

  • 早速ありがとうございます。上手くいきました。
    ただ「explode」を使っているので、「 …」を他のよく使われる文字に書き換えたりすると、上手く動作しないことがありそうですね。

    • kz kz

      その ‘ …’ は
      function my_excerpt_more($more) {
      return ‘ …’;
      }
      add_filter(‘excerpt_more’, ‘my_excerpt_more’);
      で、付けてるので自分でコントロール可能なトコロ◎

      ってことじゃなくてーって話ならソコのところを詳しく★

  • すいません何度も。基本的にはPHPやWPのコア部分に精通していないので、そういう人間が何か言ってると思ってください。

    問題だと思ったのは「” === $e[1]」という条件です。
    これは「excerpt_more」によって文章が分割されたかどうか、を判定するためだと理解しているのですが、もし$text内に「 …」という文字列が複数記載されていた場合、「” === $e[1]」では判定できなくなります。

    ただどうも「 …」の場合、WP内で文字が変換されるため問題は起こりにくいようなのですが、うっかり末尾の表現を「〜」などとしてしまうと、投稿される文中に使われる可能性が十分にあり、実際長い文章でも「続きを読む」が表示されないケースがありました。

    正規表現で「$text」の末尾が「 …」にマッチ、という条件ぐらいでよいのかなという気もしますが、いかがでしょう?

    • kz kz

      正規表現で「$text」の末尾が「 …」にマッチ、でステキ◎
      explode を使うのがマイブームだったとか、何かを企みつつ explode にして企みを忘れたとかその程度の理由なので、オレならこうだぜ!って皆さんご自身でより良いコードを考えていただくキッカケになれば幸いです☆

    • ありがとうございます。
      自分ではWPのコア内がブラックボックスになってるので、安心しました。
      (コメントの続け方、間違ってましたね)

  • だいぶ弄ったけどやりたいことができた。やっぱりフィルタ使うのが一番だったか…。

  • だいぶ弄ったけどやりたいことができた。やっぱりフィルタ使うのが一番だったか…。 / the_excerpt で抜粋有無・本文長短・moreタグを考慮して「続きを読む」を付ける  |  wpxtreme http://t.co/DZ3FUC8