CMS プログラミング

WordPress2.7で長すぎる投稿が表示されない不具合の原因と対策

shortcodes
このドイツ語のブログでやっと原因と修正方法が分かりました。
几帳面にも、問題の正規表現の図解で解説までつけてくれたドイツ人に感謝。
それにつけても、やっぱりドイツ人てすげぇ・・・

 現象

そもそもの問題の現象ですが、WordPress2.7で長めの投稿をすると、何も表示されなくなるということが起こりました。
最初はプラグインを疑って利用停止したりしたのですが、それでも改善しません。

WordPressにはデフォルトでいくつかのフィルター(記事の内容に対して行われるコンテンツの更新機能)がありますが、途中のフィルターまではちゃんと動作している。
一つずつ確認していったところ、wpautopフィルターでコンテンツが削除されていることが分かりました。

wpautopフィルターの問題箇所を探していくと、下記の最終行で削除されています。

wpautop関数:
$pee = preg_replace('/<p>s*?(' . get_shortcode_regex() . ')s*</p>/s', '$1', $pee); // don't auto-p wrap shortcodes that stand alone

ここまできてGoogleで検索して確認しましたが、WordPress2.5.1のときからこの行に関しては問題を起こしていたようで、対応としてはコメントアウトする(臭いものにふたをする)というものばかり。

・・・で、件のブログを見つけました。

原因

ドイツ語ブログで書かれているとおり、本当の問題はショートコード(画像のキャプションなどを[caption] ~[/caption]のように記述する記法)用の正規表現を定義したget_shortcode_regex関数(wp-includes/shortcodes.php)にありました。

get_shortcode_regex関数(修正前):
return '[('.$tagregexp.')b(.*?)(?:(/)?](?:(.+?)[/1])?';

wpautop関数もそうですが、get_shortcode_regex関数もほとんどプログラム効率無視なコードになっていて、貪欲な正規表現によってpreg_replace関数が悲鳴を上げたのが原因のようでした。

対策

対策は、問題のget_shortcode_regex関数内のコードを修正すること。

get_shortcode_regex関数(修正後):
return '[('.$tagregexp.')b([^]]*?)(/)?](?:(.+?)[/1])?';

おおおっ!動いた~(T  T
プログラミングに国境なし、を改めて感じました。

#追記
次のバージョンで修正が消されるといやなので、WordPressサイトにバグ報告しました。
#再追記
と思ったら、http://trac.wordpress.org/ticket/8553とduplicateでしたorz
#2009/2/14 追記
WordPress2.7.1で直ってなかったので、自動アップグレードで元に戻ってしまった。
ぐはあ。

コメントを残す

メールアドレスが公開されることはありません。

Comments links could be nofollow free.