2008年12月 1日 20:00

Movable Typeでkeywordsを設定する

Movable Typeでkeywordsを指定する場合、通常はブログ記事の「キーワード」もしくは「タグ」のデータをそのまま使うということになると思います。当ブログでは、タグ欄に記事に関するキーワードを埋め込んでいるため、

「ブログ記事のタグに列挙されている言葉をカンマ区切りで表示」

という処理になります。このMTタグの書き方は以下のとおりになります。


<meta name="keywords" content="<mt:entryiftagged><mt:entrytags glue=","><$mt:tagname$></mt:entrytags><mtelse>Movable Type,MT,MODx,WordPress,CMS,ジョギング,英語,育児,ウェブ,インターネット,音楽,ダンス</mt:entryiftagged>" />


もしタグ欄にキーワードが入力されている場合、それらを表示。もしタグ欄に入力忘れがあった場合、あらかじめ指定しておいたキーワードを表示させます。

 

これはブログ記事のkeywordsですが、問題はカテゴリアーカイブ(カテゴリ別ブログ記事リスト)と月別アーカイブ(月別ブログ記事リスト)です。こちらは、リストのhtmlに複数のブログ記事が収録されているため、上記のような方法では適切なkeywordsを取得できません。

そこで、別途ルーチンを作成します。

 

ブログ記事のリストからkeywordsをピックアップして、頻出単語を抜き出す

以下は、Movable Typeのブログとして著名な「Open Magic Vox」さんからの引用になります。

 

<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>
    <$MTTagName 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 備忘録が元ネタになっているそうですが、いずれにせよ、ハッシュを利用してkeywordsを取得してしまう発想はすごいです。元記事では「<$MTTag$>」というタグを利用しているのですが、このブログ記事を書いている時点(2008/12/1)では、このタグはなくなっています。このため、同機能と思われる「<$MTTagName$>」を利用しています。

やっていることは以下のとおりです。

  1. ハッシュ変数 all_tags を定義
  2. MTEntriesで、当該リストのブログ記事を全てピックアップ
  3. ブログ記事に格納されているタグを読み込み、一つずつ変数「tag_name」に代入
  4. ハッシュ変数「all_tags」の中に「tag_name」をハッシュのキーとして定義
  5. キーとして代入されたtag_nameの値を1とする
  6. 同一のタグが代入されたときは、値を1ずつ増やす
  7. ブログ記事がなくなるまでループ処理

次に、タグの使用頻度順に並び替えます

  1. <MTLoop>を利用して、ハッシュ「all_tags」に格納されたキーを、値の大きい順に並び替え。
  2. 全てのタグを並び替えるまで繰り返し
  3. 使用頻度の多いキー=タグの順番に変数「keywords」へ代入していく
  4. 10回繰り返したら終了
  5. 最後に、変数「keywords」の中身をメタタグに代入、一つずつ「,(カンマ)」で区切っていく

 

こんな手順で、リストの頻出キーワード(タグ)をピックアップしています。

後は、上記手順を「カテゴリ別ブログ記事リスト」「月別ブログ記事リスト」に反映させれば終了です。

category_list_keywords

僕は上記のリストを元に、テンプレートモジュールの「HTMLヘッダー」に変数代入する形でテンプレートを書きました。

これで、後は自動的にmeta keywordsを定義してくれます。非常に楽ちんです。

皆様もMTでメタタグを自動的に付与する必要が出た場合に、ぜひ一度お試しください。