特にセキュリティの観点から、静的HTMLでサイト構築をしたいという要望は、今でも根強く存在している。
そのような要望を満たすCMSとして、候補に必ず上がってくるのがMovable Typeだ。
Movable Type設置サーバーと公開サーバーが違う場合に困ること
良くやるのが、開発兼ステージングサーバーにMovable Typeを設置し、MTがステージングに出力したHTMLファイルを、rsyncやlftpなどのコマンドを使って公開サーバーに同期する方法だ。
これならMTが外部に晒されないので、セキュリティ面で安心感がある。
しかも静的ファイル中心の構成になるので、公開サーバーが多少非力でも多くのアクセスを捌くことができる。
ところがこのような構成では、サイト内検索ができなくなってしまうのが難点だ。
公開サーバーにMTを設置している場合でも、検索時にmt-search.cgiをそのまま使うとmtの設置ディレクトリが想像できてしまう。あまり良い気分はしない。
そこで、PHPなどのサーバーサイドのプログラムでラップし、検索結果を取得する仕組みを使うことになる。
そんなときに便利なのが、 DataAPIのSearchエンドポイントだ。
しかもDataAPIのSearchは、mt-search.cgiよりも速いと公式に書かれている。
MTの検索機能はもともと弱いと評判なので、直接データベースにアクセスして検索をすることを検討しても良いとは思う。たぶんそっちのが処理も速い。
しかし、公開サーバーとMT設置サーバーが違う場合、データベースへの外部アクセスを許すかどうかという問題や、何よりもお手軽にできるかどうかといった点を考え、今回はPHPでDataAPIにアクセスし検索結果を受け取ることにする。
Data APIへのアクセス
まずは、公開サーバーからMT設置サーバーへアクセスできるようなサーバー設定が必要だ。
公開サーバーのIPアドレスからのアクセスのみを受け付けるように設定しておけば良いだろう。
エンドポイント
DataAPIのSearchは、GETでパラメータを送信しJSONで返り値を受け取る。
GET https://MT設置サーバー.com/mt/mt-data-api.cgi/v4/search?search=&blog_id=&IncludeBlogs=&ExcludeBlogs=&limit=20&offset=0&SearchSortBy=&SearchResultDisplay=ascend&SearchMaxResults=20&class=&cdSearch=
サンプルPHP
PHPでラップする場合のサンプルコードを載せておく。
$search = $str; //POSTされた検索キーワードを代入 $endPoint = "https://MT設置サーバー.com/mt/mt-data-api.cgi/v4/search?"; $includeBlogs = "1"; $offset = "0"; $limit = "20"; $searchResultDisplay = "decend"; $searchMaxResults = "20"; $url = $endPoint ."search=".$search ."&IncludeBlogs=".$includeBlogs ."&limit=".$limit ."&offset=".$offset ."&SearchResultDisplay=".$searchResultDisplay ."&SearchMaxResults=".$searchMaxResults; $json = file_get_contents($url); $array = json_decode($json,true); // 表示例 echo "<pre>"; foreach ($array[items] as $value) { echo "タイトル:".$value['title']."\n"; echo "作成日:".$value['createdDate']."\n"; echo "更新日:".$value['modifiedDate']."\n"; echo "パーマリンク:".$value['permalink']."\n"; echo "概要:".$value['excerpt']."\n"; echo "種別:".$value['class']."\n"; echo "<hr>\n"; } echo "</pre>"; // 配列の全表示 echo "<pre>"; print_r($array); echo "</pre>";
なお、検索ヒット数は、$array[totalResults] で取得できる。
複数キーワードの場合
キーワードを半角スペースで区切ると、複数キーワードで検索が可能だ。
しかし、スペースはそのままではURLに使えないので、%20にURLエンコードする必要がある。
例えば、「MT 検索」というキーワードなら、「$search=”MT%20検索”;」といったようにする。
つまり、_POSTに受けたキーワードをサニタイズする際に、半角および全角スペースを%20に置換してしまえば良い。
整形
返り値
上記のサンプルPHPを走らせれば、print_r で配列の内容を全部確認できる。
それぞれ必要な情報が格納されているキー値を確認して、foreachループ内で $value から取り出せば良い。
URLと本文の整形
PHPで配列に受け取ったデータは、そのまま使うとちょっと見づらいので、Bodyのtrimやstrip_tags、日付の整形、検索キーワードをハイライトなどをすると良いだろう。
また、パーマリンクについては、公開サーバーのURLになるようにドメイン名部分を置換するなどの処理が必要だ。
多少手間はかかるが、これならエンドポイントが訪問者にバレることもないし、思い通りに整形した検索結果画面を作れるので、なかなか便利だと思う。
コメント