ダイナミック・パブリッシングで関連記事が表示されない原因が判明
Posted by kumacchi on 2008年8月29日 , 5 Comments
原因が特定されました。WingMemoのTAEKOさんが問題が発生する僕のブログのエクスポートデータを使っていろいろ大変な検証を行って原因を特定してくださいました。検証作業大変だったと思います。感謝です。
WingMemo
http://taeko.w-museum.com/wing/
原因はタグの文字列の中に「!」(半角の感嘆符)が含まれている場合にダイナミックパブリッシングでMTのタグを利用した関連記事の表示がおかしくなってしまうというものでした。
検証には、VMware上で動いているCentOS4.6Final上に構築した環境でMovable Type 4.21を使ったダイナミック・パブリッシングの環境で行いました。
関連記事を表示するのに利用したMTタグのコードはWingMemoさんの記事から拝借しました。
WingMemo: エントリーアーカイブに関連する記事一覧を表示する(2) 応用編
http://taeko.w-museum.com/wing/200806181038.html
実際MTタグのコードを貼り付けて関連記事を表示しようとすると今までは以下の様に変なことになっていました。
管理画面のタグの管理画面で「!」(感嘆符)を含むタグを探すと6個ありました。
———————–
俺はぜったい!プレスリー
Balloo!
avast! 4
Yahoo!動画
Yahoo! JAPAN WEB API
avast!
———————–
1個ずつ修正しながら表示を確認し全ての修正が終わって表示を確認すると下の画像の様になんと関連記事が表示できるようになりました。
僕と同じで激しく困っている方はお試しください。
(Visited 57 times, 1 visits today)
タグ : MT
カテゴリ:
Movable Type
こんにちは。
遅くなりましたが(すみません、私がフィードバックするのが遅かったのです^^;)、関連記事のエラーの件、sixapartからお返事をいただきました。
タグにはデリミタ―というのがあって、それに半角の「!」が使われているため生じる現象だったようです。
それがなんと、以前は「!」ではなくて「/」が使われていたらしいんですね。ところが「/」はタグに使われることが多くエラーが頻発してたようで「!」に変更されたのだそうです。でも「!」もタグに使ってる人けっこうおられるような気が…。状況次第で変更も検討してもらえるような感じでしたが、とりあえず現時点では「仕様」ということだそうです。
そういうことで当面はタグに半角の「!」は使わないようにしてエラー回避するしかないようですが、仕様変更してもらえるとしても「!」「/」以外でデリミタに使えそうな文字って何があるでしょうねえ。
あ、どうもお世話になってます。
フィードバックご苦労様でした。TAEKOさんのフィードバックの結果を待ってから引っ越そうかと思ってましたが、あまりにMTがまともに動かないので我慢できなくなってブログをXREAに引っ越してしまいました。今は快適に利用してますw。
スパム対策など「ダイナミック・パブリッシングを快適に使う10の方法」を参考にさせていただきました。大変参考になりました。ありがとうございます。
元の文言にそって!を使っていたのでできれば変えたくなかったのですが、しょうがないので全角の!でとりあえず対処してますw。ヽ(´ー`)ノ
仕様なんですね。orz
でも、sixapartさんの返事も何だか的を得ない返事ですね。通常プログラム作る側としては使えない文字は入力できないようにするか別の文字に変換するようにするものですし、デリミタといってもデータベース上ではタグはデリミタ関係なく個別に登録されてるのでデリミタの意味ないですし、キーワードは,(カンマ)区切りですし、ダイナミックじゃないperlで動作する方は正常に動いてますし、どう考えてもダイナミックパブリッシング版のバグとしか思えないんですけどねー、どちらでも動かないのであれば仕様とも思えますけど、変な仕様ですねー。ダイナミックパブリッシング時のPHP版の処理としてmtタグでタグを処理する時に”!”をデリミタにしてるんでしょうか?謎です。なんとなくPHPの正規表現関係の気がします。エネルギーがあればPHP勉強がてらにソースを追っかけてみたいものです。
デリミタは普通には使われない文字にすべきなので例えば制御文字のTAB(perlだと\t文字コードだと0x09)にするとかすします。,(カンマ区切りにする場合は)入力された,は全角の,に変換するとか色々やったりします。
ソースをちょっと検索してみました。
以下の様な、行がたくさんありました。PHPはよくわからないのですが、正規表現時のデリミタに確かに「!」を使っているようです。PHPの場合デリミタの中に例え変数の中でもデリミタが含まれる場合エラーになってしまうようです。perlの場合はデリミタの間にデリミタ文字をを直で書いた場合は区切りがわからなくなるので当然エラーになりますが変数の中に入っていれば正常に処理されます。この違いがダイナミック・パブリッシングではダメでスタティック・パブリッシングではOKな違いになっているものと思います。デリミタには制御コードは使えないようなのでちょっとこれは修正できなそうですね。「~」とか「|」の方が「!」よりタグ内の文字としては使われないような気がしますけど。文字をどれかに変えるだけでは、あちらを立てればこちらが立たずになってしまうのでPHPのことはよくわからないのですがデリミタに依存しないような処理にしないと根本的な解決は出来なそうですね。
preg_match(‘!^(https?://[^/:]+)(:\d+)?/!’, $host, $matches)
おおっ、そういえばXREAに来られたんですね、ようこそいらっしゃいませ~。
XREAはどちらかというとPHPの動的生成に向いてるサーバーなので、ダイナミック派には居心地いいです。
機能も多いし、ここのドメイン設定の自由さに慣れるとなかなか他へいけません(笑)。
デリミタの件、なるほどなのですね。
私もPHPはまだよく分かってないのですが、perlとは違うところがいろいろあるようです。これはやっぱり根本的な仕様変更を期待するしかないのかもですね。いい方向に修正検討してもらえると嬉しいですけど。そう願うようにします。
XREAはなかなか面白いレンタルサーバーですね。
ちょっと癖が有りますが、自由度は高いですね。初心者の方にはちょっと勧め辛い点もあります。逆に使える段階まで進めば快適に使えるのではないかと思います。
TAEKOさんがいわれているようにPHPを動かすのにはいいですね。今のところ表面上は負荷の計測も行われていないようですし。MTをスタティックパブリッシングで使うのにはちょっと負荷的に大変そうですね。ダイナミックでも色々対策しないと負荷が厳しそうです。
ドメイン設定の自由度の高さは異常ですねw。
おかげでさくらさんからサブドメインだけ持ってきて運営できています。
そういうわけで宜しくお願いします。先輩w。