BlogTop > MovableType Archive

MovableType Archive

1 of 7

Next Page >

すべてのページ

今月のいらんことしい(2022年 4月)

今月(2022年 4月)、サイトでカスタマイズした点をまとめたページです。

  • * テンプレートテーマ mt.Vicuna-HTML5 を lab に適用
  • * lab の Google Analytics を GA4タグに移行

MovableType向けテーマは、 HashiM 運営の mt.Vicuna 専用サイトにて配布されています。

https://mtvicuna.kita2.net/

mt.Vicuna-HTML5 ですと、Googleアナリティクス向けモジュールの読み込みが、</head> 付近にあったと思いますが、

GA側で指定されていますように、HAED 開始タグの直下にインクルードモジュールされた方が良いかと思われます。

(おそらく後で修正してくださるかと)

GA4 は、Google アナリティクス ユニバーサル アナリティクス 終了するとのアナウンスがありましたので対応しています。

https://support.google.com/analytics/answer/11583528

今月のカスタマイズは以上です。バックナンバーは以下です。

レンタルサーバーでのMovableType のオープンソース版の簡単インストール機能を終了する動き

  • Posted by: maRk
  • MovableType
  • はてなブックマークに追加

Movable Type のオープンソース、MTOSがレンタルサーバーでの簡単インストールの機能から外される、といった動きがあります。

以前、プロダクトライフサイクルに関して、下記のエントリにて言及していましたが。

流れとしては、現実として必然と申しますか、主要なレンタルサーバ会社で行動がおきていますから、他社も追随されることは予想されます。

すでに理由はそれぞれ示されていますが、まとめると

  • Movable Type のライセンスが変更となった
  • MTOSの製品ライフサイクル終了日を過ぎて以降、最新版の提供がされなくなる
  • これにより、セキュリティパッチが配布されないことになる
  • セキュリティ面の考慮

セキュリティ面でのことが触れられてはいますが、要因として一番大きいのは、ライセンスの変更にあると考えられます。

「簡単インストール機能」は、不特定のユーザー(サーバの収容アカウント数にはリミットがあるものとして)に再配布および、複数製品をインストールするものですので、新しくなったライセンスでは、現実としてホスティングサービス側がこれまでの機能として提供することが不可能だとおもいます。

レンタルサーバーとしては、言い方はよくないけど、簡単インストールという機能は、集客に貢献するものですからやむなく切る、といったところでしょうか。

既存のユーザーは、継続して使用するには、Movable Type 6 へのアップグレードが必要となってきます。その際に、必要とするライセンスのほうを選択ということになります。

また、Movable Type は、ウェブサービス型のものが提供されています。

  • MovableType.net | ウェブサービス型高機能CMS

ライセンスを検討すると場合によっては、こちらのほうがあっているということもありそうです。

事実の部分以外は全くまとまっていませんが、簡単インストール機能の終了の件は以上です。

Movable TypeでoEmbed提供 (仮)

oEmbed は、URLよりページに埋め込み可能なコードを得るのに便利なしくみです。Movable Typeのサイトでこれを提供するための方法(正式なものではありませんが)のメモです。

oEmbed については、以下のページが詳しく解説されています。

設計の概要は以下の通りです。

  • URL情報から、必要な情報を取得するのに Data-API を使用する
  • Data-API から、URLに対応する記事の情報を返すAPIのカスタムインデックステンプレートを作る。APIはとりあえず、PHPで作成する
  • APIは外部サイトからのクロスドメインアクセスの都合上、 Access-Control-Allow-Originヘッダー 出力で対策しておく
  • APIで返す内容は、パーマリンク、ページタイトル、ページコンテンツくらいでよい。タイプはrich(iframe 利用)にすることで、概要・記事で使用している画像サムネイル等も掲載できる
  • ページコンテンツは EntryExcerpt (Data-API でのキーは excerpt)を利用する(毎記事適切な概要入力されていること前提として)
  • iframe で返すためのアーカイブテンプレートが必要
  • エンベッド用アーカイブをアーカイブテンプレートに追加する
  • エンベッド用アーカイブのURIと元記事のURIを紐付けしないと呼び出しができない。このブログではパーマリンクに記事IDを含めていないため、そのままでは無理
  • 元記事のURI(/path/to/archives/記事ファイルネーム/)は /path/to/archives/embed/記事ファイルネーム/ のように置換する方針とする
  • /embed/* は robots.txt 等に検索でインデックスされないようにしておく
  • エンベッド用アーカイブは、使用頻度からダイナミックパブリッシングのほうで採用。表示パフォーマンスは不利になるが、仕組上、エンベッド記事の実体(静的なファイル)はないので、全体の再構築のときに響かない

流れとして、もう少し簡単にまとめます。

  • Data-APIをつかって、記事に関係するデータをJSON形式であらかじめ出力しておく
  • 記事URLのリクエストから、記事情報を得る
  • 必要な情報をパースして、oEmbedの仕様に合った形式で返す
  • エンベッド用のアーカイブを用意してこれを iframe にて埋め込む形にする

概説になりましたが、oEmbed対応については以上です。

以下に API のテンプレートのサンプルがあります。実際に使用しているもので、直に記述している部分をテンプレートタグに置き換えしたものです。

※ このブログのURLの構成に基づいているので、そのままコピーしただけでは使えません。

※ Movable Typeのテンプレートタグが入っていますので、他のCMSでも同様にそのままの状態では使用できません。

※ Data-APIの同梱されていない Movable Typeでは動作しません。出力のJSONのキャッシュとして、bit-part/mt-plugin-DataAPIPHPCache を使っています。

※ 作成したのが Data-API のバージョンが 1のときのもので現在は v2 が出ていますが、/v1/ のフォルダがのこっていればそのまま使えています。

実際に使用している記事は以下にあります。WordPressでは、標準で、oEmbedのサイトはホワイトリスト方式になっていますので、wp_oembed_add_provider()に追加しておくなどします。

(上の記事は出力結果の例で、oEmbed の使用は、記事作成の画面のところで記事URLのコピーを貼付けします)

MT:Plugin:RegexList:リスト作成に便利なRegular Expression拡張プラグイン

Movable Typeのテンプレートの置換を拡張したRegexListプラグインについてです

RegexList はRick Bychowsk (Hiranyaloka)氏(http://hiranyaloka.com)によりリリースされたプラグインです。

この記事のタイトルでは、「リスト作成」とかつけてしまいましたが、正確には Regex でマッチ(サーチ?)したものを配列にpushしてくれるといった動作のプラグインのようです。

ダウンロード

Downloads のところより入手可能です。

ファイル展開後のRegexListをpluginsディレクトリに収めます。

動作確認

使ってみないことにはご紹介というわけにもいかないので、とりあえずインデックステンプレートでカスタムテンプレートを組んで動作を確認してみました。

当方がが試したのは、MTOS-5.14-ja 上で、特に外部の依存モジュールはないようなので、ローカルで設置したMTOSのみで確認を行いました。

基本的な書式は、regex_replace のように、regex_list="","","" 3つ目の値に区切りとなる文字列のマッチパターンを書きます。

グローバルフィルターなので、任意のテンプレートタグに付与して使うことが出来ます。

プラグインの詳細は、README.markdown に記載されています。これを参考にサンプルを作りました。

1. カンマ区切りな文字列からリストを生成する

<mt:Setvar name="test1" value="apple,bannana,melon,kiwifruit">
<$mt:Var name="test1" regex_list="/(.+)/","$1","/([^,]+)/" setvar="thelist1"$>
<$mt:var name="thelist1"$>

<ul>
<mt:Loop name="thelist1">
<li><mt:Var name="__value__"></li>
</mt:Loop>

2. \u \l \U \L プレフィックスをつかった置換

\u \l がそれぞれ upper-case と lower-case。

大文字のほうの\U \Lですが、小文字のほうとの違いは、キャプチャされている文字全部に(\Eがつけられる前まで)その影響がおよびます。

以上を踏まえて、文字列を先頭1文字を大文字、以降を小文字に整形して出力するものが以下のテンプレートです。

<mt:Setvar name="test2" value="aPple,baNNnana,Melon,kiWiFruit">
<$mt:Var name="test2" regex_list="/(.)(.+)/","\u$1\L$2\E","/([^,]+)/" setvar="thelist2"$>
<ul>
<mt:Loop name="thelist2">
<li><mt:Var name="__value__"></li>
</mt:Loop>
</ul>

3. キー、ハッシュ風の記法からページ内リンクリストを生成

「フラグメント」: 「タイトル」, 「フラグメント」: 「タイトル」
といったルールのテキストを変数にセットしておいて、これを元にして、ページ内リンクを生成するというテンプレートです。

<mt:SetVars>
internal=t2:Title2, t3:Title3, t4:Title4, t5:Title5
</mt:SetVars>

<$mt:Var name="internal" regex_list="/(?:[\s]+)?(.+):[\s+]?(.+)/","<a href="#$1">$2</a>","/([^,]+)/" setvar="thelist3"$>

<ul>
<mt:Loop name="thelist3">
<li><mt:Var name="__value__"></li>
</mt:Loop>
</ul>

まとめ

もう少し複雑な例とか思いついたのですが、当方のスキルがいっぱいいっぱいなのでこの辺で。

RegexList をうまく活用すると標準のテンプレートタグのみでは複雑に組まなくてはならない場合を解決できることがあります。

なお、このプラグインはどの値を push したかをブログのログに記録するようになっています。ログはブログのツール>ログ からみられます。

Movable Typeの各ヴァージョンごとの管理画面を体験できるデモサイト

  • Posted by: maRk
  • MovableType
  • はてなブックマークに追加

movabletypedemo.orgにてMovable Typeのヴァージョンごとの管理ページのデモページが提供されています

だいぶ前に見つけたのですが、Movable Typeの1.xとか過去の版などを体験できるサイトがありました。

例えば、3.xですとこちら

のJust login to: のリンク先から管理画面にログインできます。入るときのアカウントとパスもそのページに記載されています。※Rulesページは目を通してください

ログイン後はこんな感じです。英語だけど

movable_type_demo.png

Open Melodyのデモページもありました。

MT:lower_caseグローバル・モディファイア

  • Posted by: maRk
  • MovableType
  • はてなブックマークに追加

lower_caseモディファイアを使用すると小文字で出力されます。

lower_case="1"を設定したときの出力のメモです。というよりはほぼ遊びに近くなってしまいました。グローバル・モディファイアリファレンスにあるとおりで、このモディファイアを利用するとアルファベットの大文字であるものが小文字で出力されるようになります。

お試しのテンプレートですがフォームで入力した値をlower_caseをつかって小文字での出力を試みるというものです。

CGIでの受け渡しを考えていたのですが、簡単に済ますためにMTのダイナミックパブリッシングを使ったテンプレートを作成してみました。GETとPOSTを動的に受け取りたいのですが、たしかGETの値など取得するようなプラグインがあったように記憶していたんですが、Smartyによる値の取得方法をmt ダイナミックテンプレート SmartyでGET/POSTなどの外部パラメータを取得 - wed@においてシンプルに提示くださってましたので今回参考にいたしました。

テンプレートは以下のとおりです。action属性には作成したテンプレートのパスでもいれるとします。LOLといれると、結果としてlolがかえるかとおもいます。

<MTSetVarBlock name="str">
{{$smarty.post.string}}
</MTSetVarBlock>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>lower_case=1 のテスト</title>
<style> em {color: blue;}</style>
</head>
<body>
<form action="path/to/this_page" method="post">
<fieldset>
<h1>フォーム</h1>
  <p><input name="string" type="text"></p>
  <p><input type="submit" value="Submit"></p>
</fieldset>
</form>

<p>Your Input: <em><MTVar name="str" encode_html="1" /></em></p>
<p>Lowercase : <MTVar name="str" encode_html="1" lower_case="1" /></p>
</body></html>

*テンプレートはテスト環境向けのものです。

スタティックページにおける関連記事表示について

  • Posted by: maRk
  • MovableType
  • はてなブックマークに追加

静的ページ内にカスタマイズした関連記事表示をおこなっている場合に関してです。

わかりきっているようなことなので簡単にすませようかとおもいます。。こちらの認識がまちがっているかもしれませんが。

以下のような要望を叶える場合についてなのですが

  • 過去記事でコメントやトラックバックを受けることはないが、コンスタントにアクセスがある
  • この記事に類似しそうな記事を新規に作成し、過去の記事の関連記事リストに表示されるようにしたい

ここで管理者がおこなえることは、例えば記事につけられたタグをもとにリストを作っているものとして、(1)ターゲットの過去記事につけられたタグと同じタグを新規の記事にもつける(2)過去の記事を管理画面の記事一覧のリストよりチェックボックスにチェックをいれて更新する(=再構築) あたりでしょうか。

これらのことは、TagSupplementalsプラグインを用いた関連記事表示でも、Movable Typeのテンプレートタグのみで実現した関連記事表示でも静的なページで構築されている場合では同じことがいえるのでないかと思います(静的ページなわけなので)。

キャッシュとSSIでの失敗談

  • Posted by: maRk
  • MovableType | mt4
  • はてなブックマークに追加

Movable Type4.2からのキャッシュとサーバーサイドインクルード機能を利用していて失敗したときのことを記します

キャッシュとSSI(サーバーサイドインクルード)機能の説明はここでは省略します。以下を参照してみてください。

この前サーヴァ間移動をおこなったときのことなのですが、ページを表示するとWarningがでているんですねえ。

でそのWarningの内容を見ると、パスのところに移動もとのほうのアカウントが。インクルードするファイルを読み込めないために警告されているようでした。

サイトパスとかブログの設定で書き換えた(移動のときサーヴァのアカウントも変えたので)ハズなんだけどおかしいなあと思っていたら、SSIのところだったというオチでした。*ヴァージョンは4.27にてということにしておきます。

キャッシュ設定がPHPでおこなわれたとすると、そのモジュールの出力ページは保存用のディレクトリに保存されて、読み込む側のページにおいて以下のように置き換わるようです。

  • <?php include("/path/to/site/includes_c/includemodule.php") ?>

これが静的ページに残ってるということですね。ちなみに保存用ディレクトリincludes_cは環境変数(IncludesDir)により変更可能です。新しいほうのサーヴァのパスになるためにはファイルが更新されないといけないので、結局のところ再構築をおこなう必要があります。

つまるところ、サーヴァ移動をおこなったときの全再構築を執り行うのを怠っていたワタくシのミスでした。

なんというか、テンプレート編集画面を見てもモジュールインクルードの箇所はSSIが展開されて表示されているのではないのでうっかりしてました。サーヴァ移動後の注意点としてはそんなところです。

メモ: MTEntriesでcounter変数による分岐

  • Posted by: maRk
  • MovableType
  • はてなブックマークに追加

MTEntriesで最初のN件とそれ以降のM件との処理の分岐の方法を試してみました。

タイトルと冒頭の記述のとおりですが、よく記事の最初だけ「全文表示」でそれ以降は「概要」を表示するといったカスタマイズがあります。

これを実装するに、offsetモディファイアを利用して除外する件数を指定して処理する方法があります。以下にサンプルを示します。

例えば、ブログ全体で記事が5件あり、最初の2件は記事本文(entrybody)を表示し、それ以降の3件については、記事概要(entryexcerpt)を表示する、といった処理をおこないたいとしましょう。(#たまたま自分のテスト環境が記事5件分しかなかったりするのでそうなっただけですが)それを、最初のほうで2件分のエントリを取り出し記事本文を表示。2回目のEntriesのループでは、先頭2つをoffsetにより除外、そのうち3件分を出力するコードが以下となります。

カウントの部分は趣味でいれてるので無視してくださってかまいません。マークアップはいい加減なものなのでそのまますぐ使えるというものでもないです。

<mt:entries lastn="2">
<div style="background:none #eee; border:1px padding:3em;">
<h2><mt:var name="__counter__" /></h2>
<h3><$mt:entrytitle$></h3>
<$mt:entrybody$>
</div>
</mt:entries>
<mt:entries lasn="3" offset="2">
<mt:setvar name="count" value="3" op="++">
<div>
<h2><mt:var name="count"></h2>
<h3><$mt:entrytitle$></h3>
<$mt:entryexcerpt$>
</div>
</mt:entries>

MT4以降でしたかちょっとヴァージョンが定かでないんですが、ループ処理に__counter__とかいった変数がセットされています。

この変数をMTIfを使い、最初2件までentrybodyでそれ以降はentryexcerptにしてみます。

<mt:entries lastn="5">
<mt:if name="__counter__" le="2">
<div style="background:none #eee; border:1px padding:3em;">
<h2><mt:var name="__counter__" /></h2>
<h3><$mt:entrytitle$></h3>
<div><$mt:entrybody$></div>
</div>
<mt:Else>
<div>
<h2><mt:var name="__counter__" /></h2>
<h3><$mt:entrytitle$></h3>
<p><$mt:entryexcerpt$></p>
</div>
</mt:if>
</mt:entries>

le="2"で、__counter__が2以下ならば、entrybody、そうでなければ、excerptといった感じです。サンプルではわざわざ__counter__の値も表示させてるますから、エントリ数とカウントの数値を確かめてみることができるかと。

MTIf/MTElseのタグがある分、先に示したコードのほうがすっきりしているように感じますが、1つのループ処理で完結してるところが違う点というか、そんなところです。以上です。

どうでもいい話とか

たまにMTIfとはなんぞ?みたいな検索でこられるかたもいらっしゃるようなので、おさらいといいましょうか、勉強を兼ねて試してみました。

最近はローカルで簡単なサンプルのテンプレートを作るときはダイナミックパブリッシングで作成して確認することが多くなってるなあとかなんとか。ファイルがやたら生成されてきては削除してくのもなんだし。。

09:28 +9:00 追記 : サンプルでcounter変数をいれたものが抜けていましたので追加しました。

Index of all entries

BlogTop > MovableType Archive

Feeds
Elsewhere

Action Streams

logo

Comment powered by DISQUS

Return to page top