SEO を考えた場合、ページの meta ヘッダには、そのページ内容を表す概要文(description)やキーワード(keywords)を設定することが重要とされています。MovableType によって生成される各アーカイブページの概要文については、MTBlogDescription、MTCategoryDescription、MTEntryExcerptを適宜使いわけることで問題ありません。一方、昨年の記事でも書いたのですが、特に日別(週別・月別・年別)アーカイブやカテゴリアーカイブでのキーワードについては、これという解決方法が見えていませんでした。しかし、MovableType 4 から強化された変数タグを利用して、これらアーカイブのキーワードをもう少し賢く設定できるようにしてみました。
MovableType で生成できる各種アーカイブごとに、meta ヘッダの概要文(description)とキーワード(keywords)に設定されると最適と思われる MovableType のテンプレートタグをまとめると以下のようになります。
| アーカイブの種類 | 概要文 (description) | キーワード (keywords) |
|---|---|---|
| インデックス(トップページ) | <$MTBlogDescription$> |
手作業で |
| インデックス(その他) | <$MTBlogDescription$>【B】無理に設定する必要なし |
【B】無理に設定する必要なし |
| 個別記事 | <$MTEntryExcerpt$><$MTEntryBody trim_to="N"$> |
<$MTEntryKeywords$><MTEntryTags> |
| ウェブページ | <$MTPageExcerpt$><$MTPageBody trim_to="N"$> |
<$MTPageKeywords$><MTPageTags> |
| カテゴリ別 | <$MTCategoryDescription$> |
<MTCategoryCustomFields>を利用【A】自動的に設定 |
| 日/週/月/年別 | 【B】無理に設定する必要なし | 【A】自動的に設定 |
| ユーザ別 | <MTAuthorCustomFields>を利用【B】無理に設定する必要なし |
<MTAuthorCustomFields>を利用【A】自動的に設定 |
一部のアーカイブページではカスタムフィールドを利用することで適切な値を個々に用意して利用することができます。しかし MTOS ではカスタムフィールドを利用できませんから、何かしら他の方法を考える必要があります。
先の表で"【A】自動的に設定"となっている部分がこの記事の本題(笑) カテゴリアーカイブや日/週/月/年別アーカイブの meta ヘッダのキーワード(keywords)には、そのアーカイブページに集約されている記事で利用されているタグを利用頻度が高いものから順に設定するのが最適と考えられます。例えば MovableType カテゴリのアーカイブページに集約されている記事を例に挙げると、それぞれの記事で MovableType に関係したタグ(MovableType カテゴリアーカイブだと MovableType,プラグイン,スパム,コード,JavaScript,hack,ブログ,CGI,Perl,tips)が必然的に多く使われるわけですから、これらの記事で頻出するタグはそのアーカイブページを代表するキーワードと考えるのが自然です。
幸い MovableType 4 からは、変数関係のテンプレートタグが強化されており、特にハッシュや配列が扱えるようになりました。これらのテンプレートタグと変数を利用して、アーカイブページ内の頻出タグを抽出することが簡単に行えます。
<MTIgnore>変数tagsを連想配列変数として実体化しておく</MTIgnore>
<MTIgnore>これをやっておかないと一発目のタグがカウントされない</MTIgnore>
<MTSetVar name="all_tags" key="(dummy)" value="0">
<MTIgnore>連想配列変数が実体化されたので、ダミーのキーはすぐに削除してしまっても問題なし</MTIgnore>
<MTSetVar name="all_tags" key="(dummy)" function="delete">
<MTIgnore>全てのエントリについて…</MTIgnore>
<MTEntries lastn="0">
<MTIgnore>指定されているタグを…</MTIgnore>
<MTEntryTags>
<MTIgnore>連想配列を使ってカウントする</MTIgnore>
<$MTTag setvar="tag_name"$><$MTSetVar name="all_tags" key="$tag_name" value="1" op="+"$>
</MTEntryTags>
</MTEntries>
<MTIgnore>集計されたタグの使用頻度に応じて降順に…</MTIgnore>
<MTLoop name="all_tags" sort_by="value numeric reverse">
<MTIgnore>上位10個の頻出タグをkeywordsに保存する</MTIgnore>
<MTIf name="__counter__" le="10">
<$MTSetVar name="keywords" value="$__key__" function="push"$>
</MTIf>
</MTLoop>
<meta name="keywords" content="<$MTGetVar name="keywords" glue=","$>" />
ソースコードの原型はハッシュ変数を使って最近のタグ一覧表示 - Movable Type 備忘録からです。最頻出タグを抽出するのにハッシュを用いるアイディアは素晴らしい。
やっていることは(多分)同じハズですが、(全てのエントリでループ)×(エントリ内のタグでループ)の二重ループ構造で大量のテンプレートタグの構築処理が発生するので、ループ内のタグは極力少なくする方向で書き換えさせて頂きました。元のソースコードでは、一回目の変数への代入処理を MTIf で分岐されていましたが、ここでは最初にハッシュの実体化を済ませておいて、ループ内では単純にタグをカウントだけするようにしてみました。MTIgnore は解説のためのコードなので本番では削除してください。
MTEntries の使える状況であれば、インデックスやカテゴリアーカイブ、日別アーカイブ、ユーザ別アーカイブなどの様々なページにおいて、そのアーカイブページを代表するタグを抽出して meta タグのキーワードとすることが可能です。全てのアーカイブページに仕方無しに同じキーワードを設定するよりも、SEO 上の効果は期待できるものと考えられます。
このサイトでは MT標準のタグ機能を使っていないのですが、アイディア的には同じ仕組みでキーワードを自動設定しています。例えばカテゴリアーカイブページのHTMLソースを見ると、ページ毎に異なるキーワードが設定されているのがご覧になれます。
最後に"【B】無理に設定する必要なし"とされた meta ヘッダの概要文(description) についてですが、これはまだ明快な答えが見えていません。しかし description については、特に文章である必要はないようなので、そのアーカイブのエントリのタイトルを並べておくだけでも十分に思えます。なぜなら、検索エンジンによる結果表示ページにおいて、description の内容が snippet として表示されることになるわけですが、もしかするとそこにユーザが求める内容に近い記事タイトルが表示される可能性は否定できないからです。
インデックスアーカイブページについては、どのページにおいても MTBlogDescription が無難に使えそうですが、やはり個々のインデックスページ毎に概要文のようなものが設定できると嬉しいですねぇ… あ、これってもしかしてプラグインネタ?