MovableTypeで絶対パスをルート相対パスに書き換える

MovableTypeが出力するURLは、絶対パスです。
それをスラッシュで始まるルート相対パスに置換する方法を下記の参考サイトを元にテンプレに反映しました。

タグの、href 属性、src 属性、content 属性の URL にウェブサイトURLが含まれている場合、そのURLの絶対パスの部分を <mt:WebsiteRelativeURL> の値に書き換えします。
<mt:WebsiteRelativeURL>で生成されるURLは下記です。

ウェブサイトの URL を、ホストからの相対 URL で表示します。たとえば、ウェブサイトのサイトURL が http://www.example.com/first-website/ の場合、/first-weblog/ を表示します。

https://www.movabletype.jp/documentation/appendices/tags/websiterelativeurl.html

テンプレートモジュールを作る

テンプレート名:impovRootPath

<mt:SetVars>
  impov_siteURL_regex=/(?!\s*?<link[^>]+?rel="canonical")(.*?<[^>]+?(href|src|content)=")<mt:WebsiteURL>/mig
  impov_siteURL_replace=$1<mt:WebsiteRelativeURL>
</mt:SetVars>

インデックステンプレート、アーカイブテンプレート、コンテンツタイプテンプレートに適用する

テンプレートに先ほど作ったテンプレートモジュールを適用します。
テンプレートのソースを下記のコードで囲みます。

<mt:Include module="impovRootPath">
<mt:Unless regex_replace="$impov_siteURL_regex","$impov_siteURL_replace">
 
//テンプレート本体

</mt:Unless>

再構築すると絶対パスがルート相対パスに置換されています。
canonical属性のついたURLとhref属性の外にあるURLは置換しません。
外部サイトのURLに影響が出ることはありません。

正規表現により、条件に合致する部分のみ regex_replace で置換しています。

ページャープラグインPageButeを使っていると絶対パスに書き換えられてしまう問題

サイト内でどうしても絶対パスが吐き出されてしまうページがあり、他のページと見比べていると、PageButeのタグ内のURLだけ絶対パスで吐き出されてしまっていました。

やってみた解決法

下記のようにPageContents内に<mt:Unless regex_replace=”$impov_siteURL_regex”,”$impov_siteURL_replace”>の記述を書きました。

<mt:PageContents count="10" navi_count="4" abs2rel="1">
<mt:Unless regex_replace="$impov_siteURL_regex","$impov_siteURL_replace">
	<mt:Entries lastn="0">
		<a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>
	<mt:PageSeparator>
	</mt:Entries>
</mt:Unless>
</mt:PageContents>

無事にルート相対パスに書き換えられました。