Cocoon のスニペットをカスタマイズする

WordPress
この記事は約8分で読めます。

はじめに

 スニペットとは抜粋のことで、インデックスにあるカードに表示され、記事の冒頭部から生成される。
 Cocoon の更新により半角スペースやタブ、改行等の空白文字が削除されるような仕様になったのだが、筆者の文体として半角スペースにも意味があるためにちょっと困った。
 そんなこんなで github の comiit からソースを探ってカスタマイズして見ることとした。

function.php をいじる

 スニペットの処理を行っている関数は Cocoon の function.php 内で次に示す get_content_excerpt として存在していた。
 今回、仕様が変更された行は 12 行目の「半角スペースやタブ、改行を取り除く」とコメントのある行になる。

//本文部分の冒頭を綺麗に抜粋する
if ( !function_exists( 'get_content_excerpt' ) ):
function get_content_excerpt($content, $length = 120){
  $content = apply_filters( 'content_excerpt_before', $content);
  $content = cancel_blog_card_deactivation($content, false);
  $content = preg_replace('/<!--more-->.+/is', '', $content); //moreタグ以降削除
  $content = strip_tags($content);//タグの除去
  $content = strip_shortcodes($content);//ショートコード削除
  $content = str_replace(' ', '', $content);//特殊文字の削除(今回はスペースのみ)
  $content = preg_replace('/\[.+?\]/i', '', $content); //ショートコードを取り除く
  $content = preg_replace(URL_REG, '', $content); //URLを取り除く
  $content = preg_replace('/\s+/','',$content); //半角スペースやタブ、改行を取り除く
  $content = html_entity_decode($content); //HTML エンティティを対応する文字に変換する

  //$lengthが整数じゃなかった場合の処理
  if (!is_numeric($length)) {
    $length = 120;
  }

  $over    = intval(mb_strlen($content)) > $length;
  $content = mb_substr($content, 0, $length);//文字列を指定した長さで切り取る
  if ( $over && $more = get_entry_card_excerpt_more() ) {
    $content = $content.$more;
  }
  $content = esc_html($content);

  $content = apply_filters( 'content_excerpt_after', $content);

  return $content;
}
endif;

 その他 content_excerpt_beforecontent_excerpt_after をフィルターする方法も考えたけど、処理内容的に後先どちらを処理しても上手く行かないと予想できたので、get_content_excerpt をまるっと子テーマの function.php にコピペしてから改造することにした。

子テーマの function.php を弄る

 親テーマの function.php から get_content_excerpt の部分を子テーマの function.php 末尾にコピペして追記。
 そして次のようにコードを追加するなりして弄ってみた。

//本文部分の冒頭を綺麗に抜粋する
if ( !function_exists( 'get_content_excerpt' ) ):
function get_content_excerpt($content, $length = 120){
  $content = apply_filters( 'content_excerpt_before', $content);
  $content = cancel_blog_card_deactivation($content, false);
  $content = preg_replace('/<!--more-->.+/is', '', $content); //moreタグ以降削除
  $content = strip_tags($content);//タグの除去
  $content = strip_shortcodes($content);//ショートコード削除
  $content = str_replace(' ', '', $content);//特殊文字の削除(今回はスペースのみ)
  $content = preg_replace('/\[.+?\]/i', '', $content); //ショートコードを取り除く
  $content = preg_replace(URL_REG, '', $content); //URLを取り除く
  // $content = preg_replace('/\s+/','',$content); //半角スペースやタブ、改行を取り除く
  $content = preg_replace('/(?: {2,}|\t|\n)/','',$content); // 2 つ以上連なる半角スペース、タブ、改行を取り除く
  $content = preg_replace('/(?!^) /','',$content); // 行頭以外の全角スペースを除去
  $content = preg_replace('/^はじめに/',' ',$content); //冒頭の定形見出しを除去
  $content = html_entity_decode($content); //HTML エンティティを対応する文字に変換する

  //$lengthが整数じゃなかった場合の処理
  if (!is_numeric($length)) {
    $length = 120;
  }

  $over    = intval(mb_strlen($content)) > $length;
  $content = mb_substr($content, 0, $length);//文字列を指定した長さで切り取る
  if ( $over && $more = get_entry_card_excerpt_more() ) {
    $content = $content.$more;
  }
  $content = esc_html($content);

  $content = apply_filters( 'content_excerpt_after', $content);

  return $content;
}
endif;

 変更及び追記したのは以下の通り正規表現を書いて置換するだけだった。
 まず 12 行目をコメントアウトして無効化。

  // $content = preg_replace('/\s+/','',$content); //半角スペースやタブ、改行を取り除く

 13 行目で連続する半角スペース、タブ、改行を除去。
 全角文字と半角文字の間に入れる半角スペースが除去されないようにしている。

  $content = preg_replace('/(?: {2,}|\t|\n)/','',$content); // 2 つ以上連なる半角スペース、タブ、改行を取り除く

 14 行目で行頭以外の全角スペースを除去。
 行頭全角スペースは段落の頭として意味を持たせているので除去しないが、それ以外は削除して詰めるようにした。

  $content = preg_replace('/(?!^) /','',$content); // 行頭以外の全角スペースを除去

 15 行目は当サイトで定型的に使用している見出し「はじめに」の文字をスニペットに含めないよう、自分好みのカスタマイズとして入れてみた。
 インデックスで「はじめに」がいっぱい表示されてるとなんか嫌だったんで。

  $content = preg_replace('/^はじめに/',' ',$content); //冒頭の定形見出しを除去

カスタマイズ後のスニペット

 今回のカスタマイズによりスニペットがスッキリとして目的通りの物と出来た。

おわりに

 親テーマの function.php から関数を丸っと子テーマにコピペしているので、テーマ更新に合わせて追従させるのがちょっとひと手間掛かる感じだけど、見た目に拘りたい部分なので手間は惜しんでいられない。
 あまりスニペットの処理をカスタマイズする必要性のある方は多くないだろうけど、念のため備忘録として記事に残してみた。

著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 2 児の父な 40 代半ばのおじさんです。

ぶっちをフォローする

コメント

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.