画像やリンクが無効になっている可能性もあるのでご了承下さい。
はじめに
スニペットとは抜粋のことで、インデックスにあるカードに表示され、記事の冒頭部から生成される。
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_before
や content_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
から関数を丸っと子テーマにコピペしているので、テーマ更新に合わせて追従させるのがちょっとひと手間掛かる感じだけど、見た目に拘りたい部分なので手間は惜しんでいられない。
あまりスニペットの処理をカスタマイズする必要性のある方は多くないだろうけど、念のため備忘録として記事に残してみた。
コメント
抜粋文からルビ(よみがな)を削除する方法を探していたところ、当記事のおかげで解決しました。 ありがとうございました。
コメントありがとうございます!
ご参考になったようでなによりです。