読者です 読者をやめる 読者になる 読者になる

MTのカスタムフィールドとダイナミックパブリッシングを使ってXHR用のデータを作る

久しぶりにMTを触っているのでせっかくだから作業メモ。
前提として、MT-5.03+MySQLを使っていて、「ブログ」ではなく「ウェブページ」でサイトを作成してます。
(MTEntry系ではなくMTPage系を使うくらいの違いかな?)


少し前まで使ってたのはオープンソース版のMTOSだったので知らなかったのですが、
MTにはMTOSにはない「カスタムフィールド」って機能があるのですね。
コレと動的にページを作るダイナミックパブリッシング機能を使ってXHR用のデータを作ろうと思いました。
(ホントはもっといい方法あるのかもですが思いつかず)


やりたかったことは、

  1. 元々ページが存在する
  2. そのページの一部を他のページでも使いたい
    • JavaScriptでhtmlや動画などを非同期で取得したい
  3. なるべく他のページ同様、普通の記事を登録する感覚で作業をしたい

というもの。


具体的に説明すると、

2カラムのサイトがあったときに、サイドバーはテンプレートに組み込んでしまうので、
ページを作成する際はメイン部分のみ投稿することになり、
で、そのメイン部分には例えばh3タグとdivタグとかがあったりする。
違うページのタブみたいなところをクリックした時に、ページ遷移なしで、divの部分だけ取得したい(xhrで取ってきたい)

みたいな感じ。


はじめ考えたときは、
「ページごと全部取得してどうにかJavaScriptで切り出そうかな」
とか思ったのだけど、でかいサイズを取ってくるのも切り出すのもコストかかるなと思い再考。


次に考えたのが、
「非同期で取り出したい部分をテンプレートかウィジェットにして、ウェブページの本文のところでMTIncludeする(<$MTPageBody mteval="1"$>しておけばMTタグが有効になるので)」
ってのだけど、新規ページを作る流れでテンプレートとかウィジェット作るのはイマイチだなぁと思い却下。


ということで、たどり着いたのがカスタムフィールド。
この機能を使うとウェブページを作成する時に「本文」「タグ」「概要」「キーワード」のようなフィールドを追加できます。
なので「xhrコンテント」みたいな複数行テキストのフィールドを追加し、
その中に非同期で取得したい部分、さっきの例だとdivタグを入れる。


そしたら本文の中で、その内容を呼び出すために

<MTIf tag="PageDataXhrContent">
  <$MTPageDataXhrContent$>
</MTIf>

みたいなのを書く
(カスタムフィールドのテンプレートタグをPageDataXhrContentにしてる)


あとは、この「xhrコンテント」の部分だけのページと、本文全体のページの2種類のページを作れば良いので、
アーカイブテンプレートの「ウェブページ」とは別にもう一つ「xhr用テンプレート」みたいなのを作ればいい。
本文の時と同じで、以下のような感じ。

<MTIf tag="PageDataXhrContent">
  <$MTPageDataXhrContent$>
</MTIf>

(ページの本文内のMTタグを有効にするためにmteval属性を付けて、<$MTPageBody mteval="1"$>とする)


さて、ここまで考えたのだけど、「xhr用テンプレート」がスタティックだと無駄なページがたくさんできてしまう。
xhr用テンプレートのアーカイブパスを例えばxhr/folder-path/page-basename.htmlにしたとすると、
xhrディレクトリ配下には無駄なファイルがたくさんできてしまうということです。


「まぁ、いいかな」とも思ったのだけど、たまにディレクトリ内を覗いた時に空のファイルがたくさんあるのは気持ち悪いので、
はじめに書いたもう一つの機能であるダイナミックパブリッシングを使いました。


xhr用テンプレートを作った後に編集で「テンプレートの設定」を選び、アーカイブパスを「ダイナミック」にすると、
ドキュメントルート配下にmtview.php.htaccessが作られる(と思う)
なので、それをxhrディレクトリの下に移動してしまえば完成。
.htaccessは多分こんな感じ

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ ./mtview.php [L,QSA]

(詳しくはどっかに書いてあると思うので。)


ダイナミックパブリッシングを使えばxhrディレクトリ配下にはmtview.php.htaccessしかファイルがないし、
気持ち悪さが少し解消されるかなと。
(カスタムフィールドに入力がないページが白紙ページになるのは変わりがないのでそこはイマイチだけど)


ホントは必要ないページをエラーページとかにしたいんだけど、
そこまではやり方がわからず。
まぁでも大体やりたいことはできたので満足です。


これで、aタグのhrefには普通のURLを入力しつつ、
javascriptが有効の時にはclickイベントで

href.replace(/(^http:\/\/[^\/]+)\/(.*)/, "$1/xhr/$2")));

みたいにhrefのURLを書き換えて非同期で取得してしまえばOK。
(href変数にはhttp://から始まるリンク先のURLが入ってるとする)


今回のことに限らずカスタムフィールドは便利ですね。
MTOSの時はあまり使わない「タグ」とかのフィールドを使って無理矢理あれやこれや作業してました。
この機能使えるのは案外大きいなぁと思った今日この頃です。