movable-type Movable Typeで検索結果ページでページネーション+最新1件を拡大表示 作成日: 2025年7月13日
これだいぶ前にやったんだけど、今更SEO的にやるべきサイトがあったのでやってみた。
当時備忘録やってなくてうろ覚えだったけど、cgiでの動的ページのページ分けにプラスして、動的ページだけど検索エンジンにインデックスされたいので、最新1件をExcerpt風に表示=ちょっとコンテンツ風になるようにしてみた。
要件はMT8.4かな
MTPagenateプラグイン(1.26で動いた)が要る。
静的生成ならPagebuteでいいし、MTタグでも組めるが面倒なのでこれ。
今回タグ検索用だが、弄ればフリーワードもOKだと思う。タグに特化するならMTPageでタグ用静的ページ作るのが楽かな。
MTpagenateはもう配布も開発も無いが、MT8xでも動くのがミソ。
<mt:IfTagSearch><$mt:SearchString setvar="tagname"$></mt:IfTagSearch>
<MTPaginate mode="cgi">
<MTPaginateIfPreviousPage_>
<$MTPaginateElse_$>
<!--if latest-->
<mtentries sort_order="descend" lastn="1" tag="$tagname">
<p>
LATEST
</p>
<section>
<picture>
<img src="<mtsetvar name="eccnt"><mt:If tag="eyecatchImage"><MTSetVar name="eccnt" value="1" op="+"></mtif><mtif name="eccnt" ge="1"><mt:eyecatchImageasset><mt:AssetThumbnailURL width="480"></mt:eyecatchImageasset><mtelse><mt:If tag="EntryDataYoutubeid">https://i.ytimg.com/vi/<mt:EntryDataYoutubeid>/default.jpg<mtelse><MTsetVar name="ac" value="0"><MTEntryAssets type="image"><MTSetVar name="ac" value="1" op="+"></MTEntryAssets><mt:If name="ac" ge="1"><MTEntryAssets sort_by="file_name" sort_order="ascend" lastn="1"><$MTAssetThumbnailURL width="480"$></MTEntryAssets><mt:Else><mt:EntryBody regex_replace="/<[^i].*?>|<i[^m]*?>|<iframe.*?>|<input.*?>|<ins.*?>|<isindex.*?>|\s/g","" regex_replace='/(.*?src=")(.*?)(".*)/g','$2' regex_replace='/^[^\.\/h].*/g',''></mt:If></mt:If></mtif>" alt="<mtentrytitle>">
</picture>
<div>
<h3>
<$MTEntryDate format="%b" language="en"$> <$MTEntryDate format="%d" language="en"$>,<$MTEntryDate format="%Y" language="en"$> <mtentrytitle>
</h3>
<p><mtsetvarblock name="lastone"><mtfor regex_replace='/<p[^>]*>|<\/p>/g',""><mtfor regex_replace='/<a[^>]+>|<\/a>/g',""><mtfor regex_replace='/<span[^>]+>|<\/span>/g',""><mtentrybody mteval="1" regex_replace='/<img[^>]+>/g',""></mtfor></mtfor></mtfor></mtsetvarblock><mtvar name="lastone" trim_to="300">
</p>
<a href="<mtentrypermalink>" class="more">Read More...</a>
</div>
</section>
</mtentries>
<!--/if latest-->
</MTPaginateIfPreviousPage_>
<!--Masonry-->
<div>
<MTPaginateContent max_sections="20">
<mt:Entries offset="1" tag="$tagname">
<MTSetVarBlock name="img_cnt"><MTEntryImageCount this_entry="1"></MTSetVarBlock>
<MTsetVar name="ac2" value="0"><MTEntryAssets type="image"><MTSetVar name="ac2" value="1" op="+"></MTEntryAssets>
<mtsetvar name="eccntt"><mt:If tag="eyecatchImage"><MTSetVar name="eccntt" value="1" op="+"></mtif>
<MTRemoveBlank>
<a href="<$mt:ArchiveLink archive_type="Daily"$>" class="masonry-box">
<div>
<div>
<img src="<mtif name="eccntt" ge="1"><mt:eyecatchImageasset><mt:AssetThumbnailURL width="480"></mt:eyecatchImageasset><mtelse><mtif name="ac2" ge="1"><mt:EntryAssets lastn="1"><$mt:AssetThumbnailURL width="480"$></mt:EntryAssets><mt:Else><mtif name="img_cnt" ge="1"><mt:EntryBody regex_replace="/<[^i].*?>|<i[^m]*?>|<iframe.*?>|<input.*?>|<ins.*?>|<isindex.*?>|\s/g","" regex_replace='/(.*?src=")(.*?)(".*)/g','$2' regex_replace='/^[^\.\/h].*/g',''><mtelse>https://surf-plus.com/weekdaysurfreport/images/self_restraint.jpg</mtif></mtif></mtif>" alt="<mtentrytitle>">
</div>
</div>
<h3>
<span class="date-title"><$mt:EntryTitle$></span>
<$mt:EntryDate format="%b %d,%Y" language="en"$>
</h3>
</a>
</MTRemoveBlank>
<MTPaginateSectionBreak>
</mt:Entries>
</MTPaginateContent>
</div>
<MTPaginateIfMultiplePages>
<nav id="pagenation">
<MTPaginateIfPreviousPage_><a href="<MTPaginatePreviousPageLink>" class="link_before"><</a></MTPaginateIfPreviousPage_>
<MTPaginateNavigator separator=" " format_current="<span>%d</span>" format="%d">
<MTPaginateIfNextPage_><a href="<MTPaginateNextPageLink>" class="link_next">></a></MTPaginateIfNextPage_>
</nav>
</MTPaginateIfMultiplePages>
<!--/Masonry-->
</MTPaginate>
imgタグ内はそのサイト用にYoutubeのサムネだったり色々漁って画像無しにならないように組んであるが、基本は普通にサムネでOK。
LatestのExcerptだが、改行生かしたいのでmtfor+regexでシンプルにしてるが、文字数終端に改行タグがくるとhtml的にエラーになる。entrybodyを弄るのではなく、まんまentryexcerptでもOKというかその方が固いかも。
ページ数の多いMTの動的生成はWordpressのそれより重いと思うが、10年以上前のプラグインが普通に動くのでWordpressよりプラグインの存命率は高いかなとも思う。
単なる一覧ページでなく、Latestで最新1件を大きく出す部分は、1ページ目限定=プレビューページの有無で条件分岐するタグがあったのでそれを流用。
通常のアーカイブ一覧なら、mtforで1ページ目は都合21件で他は20(この場合ページ当たり20件だから)と組むが、要らねーって思うタグにより楽に組めた。