Cocoon WordPressの抜粋文字にpreタグを出力しないようにする方法

Cocoonのインデックスページでスニペットにpreタグが含まれている場合にpreタグの文字列を出力しないようします。ちょっと私の場合はテンプレートのカスタマイズを行っていて、スニペットにpreタグが含まれていた場合にラッパーからpreタグがはみ出してしまいました。たぶんデフォルトでははみでないようになっていたと思います。

cssのoverflowではみでないようにすることはできるのですが、そもそも論としてスニペット(本文の抜粋)にpreタグを出力するのってどうなの?と思ったので今回は抜粋文字にpreタグが含まれていた場合はpreタグを出力しないようにします。

スポンサーリンク

まえがき

ちなみに今回の問題はCocoonになっていますが別にWordPress全般に言えることだと思います。

functions.phpで処理するのがよいのかなと思ったのですが、フィルターのget_the_exceptはループ内でしか使えないみたいで、functions.phpから処理する方法がわからなかったので、テンプレートを子テーマに上書きして処理しています。

Cocoonのインデックスのテンプレートは以下の場所にあります。

/themes/cocoon-master/tmp/entry-card.php

↓これを子テーマにコピーします。ちなみにtmpはないので作る必要があります。

/themes/cocoon-master/tmp/entry-card.php

スポンサーリンク

抜粋文字からpreタグを出力しないようにする

entry-card.phpのスニペットを定義している部分を変数に格納して置換処理を行います。

<?php 
$snippet = get_the_snippet(get_the_content(''), get_entry_card_excerpt_max_length()); //カスタマイズで指定した文字の長さだけ本文抜粋
$processed_snippet = preg_replace('/<pre\b[^>]*>.*?(?:<pre\b[^>]*>|$)/s', '', $snippet);              
echo $processed_snippet;
?>

ちなみに抜粋文字でpreタグがあっても文字数制限の関係でpreタグの閉じタグまでは取得できないことがあります。←っていうか取得できないことがほとんどでしょう。

そのためこういう正規表現を組みます

<pre>タグの開始部分を見つけてから、次に現れる<pre>タグの開始部分または抜粋の末尾までを削除する

そのためにこのような正規表現になっています↓

$processed_snippet = preg_replace('/<pre\b[^>]*>.*?(?:<pre\b[^>]*>|$)/s', '', $snippet); 

まとめ

Cocoonの抜粋文字にpreタグを出力させたくない場合はテンプレートに抜粋文字の置換処理を追加してください。ただし、functions.phpから処理することもできるかもしれません。私の場合はfunctions.phpでのやり方を探すのがめんどうだったので、テンプレートに直接置換処理を追加しました。

ちなみにpreタグがコンテイナーからはみでる現象について基本的なことを知りたいかたは以下の記事を参考にしてください↓

コメント

タイトルとURLをコピーしました