movable-type MovableType canonical関連の正規化
作成日: 2023年11月25日

たいしたことではないが、SEO的にはやっておいた方が良い。
今はGoogleの独占状態で、Googleもページングについては理解があるが将来は解らない。それにBingも微増だが伸長してきているなど動きはあるのでこういった部分も正規化しておくに越したことは無い。
※前提条件として「PageBute」プラグインが入っている事。
先ずはcanonical

<link rel="canonical" href="<?php $str="<mtvar name="htd">"; preg_replace("/\/https/","https",$str);?><mtvar name="curl"><MTIfPageFirst>index_<$MTPageCount$>.php</MTIfPageFirst>" />

これは親サイト・子サイト関係にあり、相対パスに変えるPLを利用しているので面倒だが<?php $str=”<mtvar name=”htd”>”; preg_replace(“/\/https/”,”https”,$str);?>これでサイトパスを絶対URLにして拾う変数に。
<mtvar name=”curl”>は子サイトのパス=相対になるから、サイトの絶対URLの下に付ければちょうど嵌る。
<MTIfPageFirst>index_<$MTPageCount$>.php</MTIfPageFirst>ここはページ分けした場合の何ページ目かを出力。
ここは条件分岐を書かなくても無いものは空白で出すMTの仕様ならではで、Wordだと時に値がないとエラーを吐く、特にphp8upはその辺厳格になってきてるので面倒だが、mtmlでこの程度なら空白/nullを気にしなくて済む。

次にページネーションでのlink rel=”xxx”対応。
エントリーアーカイブはそのサイトの内容等によりページの連続性は不要だが、月別やカテゴリーアーカイブの分割の際は次・前は一応指定した方がSEO上良いらしい。

先ずはカテゴリーアーカイブやカスタムインデックスを分けた場合などのページ分割の場合。

<MTPageBefore setvar="prv"><MTPageAfter setvar="nxt">

ここで、前のページ・次のページを変数化。

<MTIfPageBefore><link rel="prev" href="<?php$html = '<MTVar name="prv">';$pattern = '/href=["\'](https?:\/\/[^"\']+)["\']/i';if (preg_match_all($pattern, $html, $matches)) {foreach ($matches[1] as $url) {echo "$url";}}?>" /></MTIfPageBefore><MTIfPageAfter><link rel="next" href="<?php$html = '<MTVar name="nxt">';$pattern = '/href=["\'](https?:\/\/[^"\']+)["\']/i';if (preg_match_all($pattern, $html, $matches)) {foreach ($matches[1] as $url) {echo "$url";}}?>" /></MTIfPageAfter>

ここでlinkタグに整形する。

次に日別・月別(年別)など日付による前後指定。

<mt:If name="datebased_monthly_archive"><mt:ArchivePrevious><link rel="prev" href="<$mt:ArchiveLink encode_html="1"$>" /></mt:ArchivePrevious><mt:ArchiveNext><link rel="next" href="<$mt:ArchiveLink encode_html="1"$>" /></mt:ArchiveNext></mtif><mt:If name="datebased_daily_archive"><mt:ArchivePrevious><link rel="prev" href="<$mt:ArchiveLink encode_html="1"$>" /></mt:ArchivePrevious><mt:ArchiveNext><link rel="next" href="<$mt:ArchiveLink encode_html="1"$>" /></mt:ArchiveNext></mtif>

これでif文で分岐させているが日別・月別(年別)は出せる。
ここはif文で分岐させないと先ほどのコードとArchiveと名の付くものは被るからだが、先ほどのものはPageButeにより「無いものはないから空で出力」というある意味便利な特性を活かしている。
そのうえでif文のいる方を減らしている。

応用でaタグに書いてボタンにすることもできるのが、ちっちゃな事だがこうしたロボットへの案内があればUIやSEOも有利になるかも。