本文の文字数が多い時にだけ「続きを読む」を挿入する方法-MovableType
MovableTypeで記事本文のトリム処理をする際に、いろいろやってみたので備忘録としてエントリ。
やりたいコトは以下の通りです。
・アーカイブページで、個別記事本文のアタマから指定文字数分だけを表示させる
・指定文字数を超えていたら「…続きを見る」を表示
・「…続きを見る」にはパーマリンクを張る
・エントリ画面の本文入力フォーマットはリッチテキスト
その1 Javascriptでやってみる
まずはJSで。
<p>
<$MTEntryBody remove_html="0" trim_to="100"$>
<script type="text/javascript">
var charaNum = <$MTEntryBody count_characters="1"$>;
if(charaNum >= 100){
var url = "<a href='…<$MTEntryPermalink$>'>続きを読む</a>";
document.write(url);
}
</p>
ただコレだとJSをoffに設定されていたらダメ。
その2 MTSetVarでなんとかする
それではMTの条件分岐タグで。
<p>
<MTSetVarBlock name="charaNum"><$MTEntryBody count_characters="1"$></MTSetVarBlock>
<$MTEntryBody remove_html="0" trim_to="100"$>
<MTIf name="charaNum" gt="100">…<a href="<$MTEntryPermalink$>">続きを読む</a></MTIf>
</p>
コレでいけます。
個人的にはちょっとコードがスッキリしない気がします(MTだからしょうがないケド…)。
その3 もうpmファイルをいじくる
こうなったらもう調子にのってMTのソースを変更してしまいます。
MTDIR/lib/MT/Template/ContextHandlers.pmの776行目あたり
sub _fltr_trim_to {
my ($str, $val, $ctx) = @_;
return '' if $val <= 0;
$str = substr_text($str, 0, $val) if $val < length_text($str);
$str;
}
↑コレを↓このように変更します。
sub _fltr_trim_to {
my ($str, $val, $ctx) = @_;
my $e = $ctx->stash('entry');
my $url;
$url = $e->permalink;
$str = substr_text($str, 0, $val).'…<a href="'.$url.'">続きを読む</a>' if $val < length_text($str);
$str;
}
この方法だとテンプレート自体はとってもシンプルに。
<p><$MTEntryBody remove_html="0" trim_to="100"$></p>
スッキリです。
C-brains nagai