BlogTop > MovableType > MTカスタムフィールド Archive

MTカスタムフィールド Archive

1 of 2

Next Page >

すべてのページ

メモ:MT:ウェブページむけの Next|Previous URL カスタムフィールド

Movable Typeのウェブページ用カスタムフィールドで次のページURL を示すフィールドをつくってみました。

背景など

ウェブページの link 要素のrel=next および、rel=prev に入れるURLをあつかうとき、 や がありますが、これはページの作成順序を考慮していないと、「本当はあのページを次のページとして指定したかったのに」なんてことがおこるかどうかは定かでありませんけれども、そんな環境を想定してみました。

細かな前提とかおいておき、さっそく作成例として示しておきます。

ざっと NextURL のほうだけですが以下のようなものです。previous は文字列変更するだけですので省略。

名前のところは、管理画面の「表示オプション」などが使用するので、わかりやすくて簡潔な名前のほうがいいでしょう(ここの例は思いつきでつけただけですので)。ベースネームは他のと重ならないもの、テンプレートタグも既存のものと違うもので、CFなどの接頭辞をつけてテンプレートタグとわけておくのがいいです。

システムオブジェクト

      ウェブページ

名前
      nextURL

説明
       次のページ

種類
      テキスト

必須?
      なし

規定値
      なし

ベースネーム
   cf_pagenexturl

テンプレートタグ

   CFPageNextURL

テンプレートの例

<mt:If tag="CFPageNextURL">
nextURL: <mt:CFPageNextURL>
</mt:If>

使用する場合は、 ウェブページのそれぞれのページ編集のところで、表示オプションで作成したフィールド名にチェックを入れてフィールド表示させておきます。

あとは、URLを入力すれば、MTCFPageNextURLは入力したURLに展開されます。

以下は、簡単な link要素の next prev の設置です。

head 要素内に以下を追加します。

<mt:If tag="CFPageNextURL"><link rel="next" href="<mt:CFPageNextURL>"></mt:If>
<mt:If tag="CFPagePreviousURL"><link rel="prev" href="<mt:CFPagePreviousURL>"></mt:If>

title 属性を入れたい場合は、 :title=XXX とか独自に記法を決めておいて、URLとtitle部分を regex_replace で取り出すか、新たにタイトル用のフィールドも作るかになるとおもいます。

カスタムフィールドとフラグメント識別子

今回は、Movable Typeのカスタムフィールドで、フラグメント識別子を入れたものを利用して、ページ内のリストメニューとして出力させる方法のメモです。

MTでフラグメントをあつかう方法はいろいろとあるのですが、以前からカスタムフィールドを利用して何かできないものか考えていましたので試してみることにしました。

設定の流れとしては以下のとおりです。

  • ブログ記事用として識別子を入力するカスタムフィールドを作る
  • 値には区切り文字をいれて区切っておくようにする
  • 区切り文字から内容を解析してテンプレートタグを使いリストを生成する

といった具合です。で、カスタムフィールドの作成はこの際端折ってしまうとして、問題は区切り文字をどう解釈させるかにあります。

ちょうどよさそうなプラグインが見つかりましたので、今回利用させていただくことにしました。以下に解説が記載されています。

以下のテンプレートタグによるコードは、カスタムフィールド(mt:cf_fragment)を作成して、エントリページのカスタムフィールドにsection_01,section_02,section_03のような入力があった場合に、a href="#section_01" のようなリンクを出力します。

<mt:if tag="cf_fragment">
<$mt:setarray tag="cf_fragment" name="frag" sep=","$>
<ul>
<mtloop name="frag">
 <li><a href="#<$mt:Var name="__value__"$>">section<$mt:var name="__counter__"$></a></li>
</mtloop>
</ul>
</mt:if>

メモ:特定カスタムフィールドの値は提供されたタグで

特定のカスタムフィールドの値の出力のメモ。MTEntryCustomFieldsにおいてinculudeモディファイアを利用できるようですが、特定のカスタムフィールドには提供された専用のタグを使います

折角、カスタムフィールドのカテゴリを設けたので、久久にカスタムフィールドねたでいきます。

以下はカスタムフィールドにフラグメント識別子をいれてその内容にもとづいたURIを作成する目的のものです。

カスタムフィールド名として「フラグメント」、使用するテンプレートタグは「cf_fragment」にしたとします。

カスタムフィールド用タグを利用した(通常の)書き方
<ul>
<MTEntries>
  <mt:if tag="cf_fragment">
    <li><$MTEntryTitle$>: <a href="<$MTEntryPermaLink$>#<$MTcf_fragment$>">
          <$MTcf_fragment$></a>
    </li>
  </mt:if>
</MTEntries>
</ul>

で、以下はMTEntryCustomFieldsタグにinculudeモディファイアを使って、「フラグメント」のカスタムフィールドのみ出力になるようにした書き方です。

MTEntryCustomFieldsでinculudeモディファイアを使った場合
<ul>
<MTEntries>
  <MTEntryCustomFields include="フラグメント">
    <MTIfNonEmpty tag="EntryCustomFieldValue">
      <li><$MTEntryTitle$>: <a href="<$MTEntryPermaLink$>#<$MTEntryCustomFieldValue$>">
          <$MTEntryCustomFieldValue$></a>
      </li>
    </MTIfNonEmpty>
    </MTEntryCustomFields>
</MTEntries>
</ul>

結果的には等しくなりますが、コードとしてどちらがすっきりとしているのかはいわずともわかりますね。

なお、についてはタグリファレンスには、exclude(特定のカスタムフィールドを除外する)のみのモディファイアが掲載されています。特定のカスタムフィールドの内容の出力は、そのカスタムフィールドのテンプレートタグを使う(*リファレンスにも明記されています)ということで頭の中にいれておけばいいのでないでしょうか。Tipsでもなんでもなく、リファレンスをよく読めばいいという話であります。

ダッシュボードで最近のカスタムフィールドの内容を見れるウィジェット

Movable Typeのダッシュボードから最近の記事で使っているカスタムフィールドの内容を見ることができるようにウィジェットを作ってみました。

前にダッシュボードのウィジェットを作ったりしていたのですが(MT:ダッシュボードにブログパーツを表示させてみた)、その続きです。

まずはスクリーンショットを。

recent_cfieldwidget.gif

テンプレートファイルのソースはこのようなものです。

<mt:setvarblock name="html_head" prepend="1">
    <link rel="stylesheet" href="<mt:var name="static_uri">plugins/c_field_widget/css/styles.css" type="text/css" media="screen" />
</mt:setvarblock>

<mt:setvartemplate name="showCustomField">
<MTEntries days="30" sort_by="modified_on" limit="5">
<div id="cf_entry-<$MTEntryID$>" class="entry-<mt:if name="__odd__">odd<mt:else>even</mt:if>">
    <MTEntryCustomFields>
        <MTIfNonEmpty tag="EntryCustomFieldValue">
        <div class="entry-title cf_entryTitle"><MTEntryAuthorID setvar="entry_author_id"><MTSetVarBlock name="entry_title"><MTIfNonEmpty tag="MTEntryTitle"><$MTEntryTitle$><MTElse><__trans phrase="..."></MTIfNonEmpty></MTSetVarBlock>
             <h4><MTIf name="editable"><a href="<mt:var name="script_url">?__mode=view&amp;_type=<$MTEntryClass lower_case="1"$>&amp;blog_id=<MTEntryBlogID>&amp;id=<MTEntryID>"><$MTEntryTitle$></a><MTElse name="author_id" eq="$entry_author_id"><a href="<mt:var name="script_url">?__mode=view&amp;_type=<$MTEntryClass lower_case="1"$>&amp;blog_id=<MTEntryBlogID>&amp;id=<MTEntryID>"><$MTEntryTitle$></a><MTElse><$MTEntryTitle$></MTIf></h4>
        </div>
            <div class="entry-meta cf_fieldName"><$MTEntryCustomFieldName$><mt:if tag="EntryCustomFieldDescription">(<$MTEntryCustomFieldDescription$>)</mt:if></div>
            <div class="entry-content cf_fieldValue"><$MTEntryCustomFieldValue encode_html="1"$></div>
        </MTIfNonEmpty>
    </MTEntryCustomFields>
</div>
</MTEntries>
</mt:setvartemplate>
<mtapp:widget id="DashbordWidgetCalendar" class="widget" label="最近のカスタムフィールド" can_close="1">
    <mt:getvar name="showCustomField">
</mtapp:widget>

直近の記事のカスタムフィールドの内容を全て出力します。のexcludeモディファイアを使えば、除外するフィールドを指定して、特定のフィールドだけ出すこともできます。

pluginとしてセットしたものをここに置いておきます。mt-staticフォルダにCSSファイルが入ってますが、気に入らなかったら使わないとか好きに書き換えするとよろしいかと。

Download

MovableTypeのカスタムフィールドで特定キーワードを含む記事をリストアップするテンプレート

Movable Typeのカスタムフィールドに書いてある内容から、任意の「キーワード」で記事を絞り込んでリストアップするというテンプレートを書いてみました。

コチラが説明しづらい部分がありますので、先ずは人力検索はてなの質問をご覧ください。

要点をまとめると、このようなかんじでしょうか。

  1. 大阪一円のレストランに関する記事が作成されている
  2. 各記事には、「最寄り駅」という名のカスタムフィールドがある
  3. カスタムフィールドには最寄り駅から何分という情報が記載されている
  4. カスタムフィールドに書いてある最寄り駅の駅名から記事をリストアップしたい

MovableType.jpの「カスタムフィールドの値で並べ替えやフィルタリングする」に書かれている、「カスタムフィールドの値を利用したフィルタリング」を試してみたのですが、どうもfield:customfieldbasename=fooの中身が完全一致でないと期待の動作にならないようなのです。

そうなると、大阪一円の駅名の部分だけのフィールドを「ドロップダウンメニュー」や「ラジオボタン」タイプで別途設けておいてそのフィールドのほうで、評価してみるというような使い方でないと、カスタムフィールドの値でソートというのが実現されないように思います。それならば、一旦変数にフィールドの内容を格納してそこから評価してみるというのでどうでしょうか。

ということで、回答は閉め切られてますが、コチラがこの命題に答えた解答は以下のような感じです。あまりすっきりしない感じですが。

カスタムフィールドから特定キーワードを含む記事をリストアップするテンプレート

<mt:setvars>filterName=JR大阪駅</mt:setvars>
<mt:setvartemplate name="showMoyorieki">
<MTEntries><mt:setvarblock name="station"><mt:cf_MoyoriEki></mt:setvarblock><mt:if name="station" like="$filterName"><li><a href="<$MTEntryPermalink$>"><MTEntryTitle></a>:<mt:cf_Moyorieki></li>
</mt:if></MTEntries>
</mt:setvartemplate>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<$mt:PublishCharset$>" />
<title>test custom field filtering</title>
</head>
<body>
<div>
<h1>最寄り駅: <em><mt:var name="filterName" /></em>を含む記事</h1>
<ul>
<mt:getvar name="showMoyorieki" trim="1" />
</ul>
</div>
</body>
</html>

Note:

  • カスタムフィールドは記事用で作成し、テキストタイプ、カスタムフィールドを出力するタグ名は「mt:cf_MoyoriEki」とした
  • cf_MoyoriEkiを変数(station)に収め、任意のキーワードを含んでいる記事をリストアップさせた

参考までに、一連の動作の検証で使用したファイル群は以下。

Download:

カスタムフィールドを配信する(?)

記事に設定したカスタムフィールドもあわせてフィードに配信する方法を考えてみました

自分のところに検索された語から何かを読み取って勝手に回答してしまうエントリです。ということで今回はMovable Typeのカスタムフィールドネタをします。

ここで以前、カスタムフィールドに書いたものはフィード配信にならないという内容の記事を書きました。

今回はその逆ですね。フィードのテンプレートを少しカスタマイズすると恐らくいけるのかとおもいます。

フィードにカスタムフィールドの内容を反映させる(案)

まずカスタムフィールドを作成します。ありきたりですが、ここでは「関連記事」というカスタムフィールドを作り、複数行テキストにて、関連記事へのリンクを示すというものを作ったと仮定して説明してみます。

例として以下のようなカスタムフィールドを出力するコードをフィードのテンプレートに埋めてみます。

このフィールドはcf_relatedentryというテンプレートタグ名とし、出力させるコードは以下のようなものとします。

<mt:If tag="cf_relatedentry">
        <div id="related" class="relatedEntry">
          <dl>
          <dt><b>関連記事</b>:</dt>
               <dd><mt:cf_relatedentry></dd>
          </dl>
        </div>
</mt:If>

テンプレート編集で「最新記事のフィード」(Atomフィード)を編集します。

content要素の内容で、mt:EntryMoreタグの下に追加します。

Atomフィードにカスタムフィードを反映(1)

カスタムフィールドの内容をCDATAセクションにします。

ただ、この方法ですと、mt:EntryBodyタグにある、encode_xmlオプションのために、CDATA区間が2箇所できることになります(*環境変数でNoCDATAを使用してない場合です)。このことが原因で正しく表示できないフィードリーダーがもしかしたらあるかもしれないです。

これがキモいというときは、encode_xmlを使わずに直接CDATA区間を指定する方法を使ってみます。

Atomフィードにカスタムフィードを反映(2)

なお、確認は簡単なテスト記事にてIE7のフィードプレビューでしか(Firefoxだと、summary要素の内容がでてしまうので)おこなっていません。実際の運用のところまでは一寸自信がありませんのでその点はご承知おきいただけたらと思います。

カスタムフィールドで選択項目が多い場合ドロップダウンを使ってみては。

カスタムフィールドのお話。カスタムフィールドであつかう内容にあったタイプを使って見るというのはどうでしょうか。

Movable Typeのカスタムフィールドで、管理画面をからみたスタイルを調整するのに、/mt-static/addons/Commercial.pack/styles-customfields.cssにスタイルを加える、といった情報を見つけたのですが、見た目だけの問題でしたら、ブラウザのユーザースタイルでおこなうというのもアリだと思っています。バージョンが変わるごとに書き換えの必要がでてきますし、userChrome.cssを書き換えるのと、styles-customfields.cssを書き換えてからサーバに上書アップロードするというのでは、どちらのほうが手間でしょうか。

さて、選択式のフィールドでラジオボタンタイプなどを使われていたとして、項目が増えてきますと、横並びであったとしても少し見づらかったり、場所をとってしまったりもします(表示オプションの設定で使うたびに表示・非表示という手はありますが、勝手が悪いように思います)。

そこで選択項目が多く、ある程度までは増えることもないものであれば、ドロップダウンタイプを使って、フィールドの表示スペースを少なくしてみるという手もあります。

「二十八宿」をその日書いたエントリーで指定して表示させるといったカスタムフィールドを作るとします。ま、このようなフィールドを作るヒトはまずいないとおもうのですが、例えとしてですので。このような感じで設定しておきます。

edit_customfield_dropdown.png

カンマ(,)で区切ってデフォルトのところで、デフォルトで指定したい値を決めることができます。(=selected属性の値)

=====,角宿,亢宿,テイ宿,房宿, (・・・以下、軫宿まで)

小技ですが、デフォルト値を、選択項目にないものにしておき、選択をおこなわなかったときに表示されないといった振り分けもできます。

<MTIfNonEmpty tag="entrydatatestdropdowmenu">
<mt:SetVarBlock name="menu_value"><MTentrydatatestdropdowmenu></mt:SetVarBlock>
</MTIfNonEmpty>
<mt:if name="menu_value" ne="=====">
<p>二十八宿: <MTentrydatatestdropdowmenu></p>
</mt:if>

というわけで余計なお世話なことですが、型にあったフィールドのタイプを選択してみようということでした。

Index of all entries

BlogTop > MovableType > MTカスタムフィールド Archive

Feeds
Elsewhere

Action Streams

logo

Comment powered by DISQUS

Return to page top