コアモジュールに手を入れるべきか否か

このブログはWordPressというツールを使って運用されているんですが、ちまたでもいろいろと書かれている通り、実は少々癖があるツールです。

最大の特徴は、XHTML的にWellFormedであることを目指しているためか、投稿者の意図しないタグを順次埋め込んでくれたり、或いは、不要(とWordPressが判断した)タグや改行を勝手に除去してくれます。 ただ、これが逆に困ったことを引き起こしてしまうこともある訳です。

たとえば、空の行を複数作って隙間を空けようとしても、WordPressではできません。 勝手に[p]タグでくくられてしまい、改行は除去されてしまうのです。 あるいは、(理由は私には分からないのですが)[input]タグなど幾つかのタグの前に勝手に[br /]タグを埋め込んでしまったりします。

実は昨日からContactページが導入されまして、これはコンタクトが欲しい訳ではなく導入するだけで非常に簡単にお問い合わせフォームが作れてしまう、WP-ContactFormというプラグインを試してみたかったからなのですが・・・。 まさにこのフォームの[input]タグの前に勝手に[br /]タグが書かれてしまうので、レイアウトがもろ崩れで困ってしまった訳なのです。

[label] タイトル [/label][input ….. /]

と例えば、左右にレイアウトしたい場合でも、

[label] タイトル [/label][br /][input ….. /]

とbrタグが挿入されてしまい、HTML的に改行されてしまうのです。 なぜ前者がXHTML的にNGで後者がWellFormedなのかは私には全然判りませんが、とても困るのは事実です。

おそらく、これを止めるプラグインがあるのでは無いかとも思って少しだけ探してみたのですが、残念ながら見あたらず、コアモジュールに直接手を加える事にしました。 ツールのコアモジュールに直接手を加えてしまうと、ツールそのものがヴァージョンアップした時に対応できなくなってしまうので、できれば避けたい訳ですが今回はプラグインを書いたりしている時間も無いので(そもそも、まだWordPressのプラグインの書き方も知らない訳でして)、最後の手段に出てしまおうと。

少しネットで検索してみたところ、./wp-includes/formatting.phpというファイルの中のwpautopというfunctionの中で調整されているということまで判りました。 私が使っているのは2.3.3という(現時点での)最新ヴァージョンなのですが、このfunctionは次のように定義されていて、どうも$br = 1というのがあやしいです。

function wpautop($pee, $br = 1) {

そこで、次のように変更してみたところ、とりあえずContactページの改行は収まりました。

function wpautop($pee, $br = 0) {

ただ、これがどこからどんな具合に呼び出されているのか?が気になりますので、一応次のようなコマンドで調べてみます。

$ find -name “*.php” -exec grep -nH “wpautop” {} \;
./wp-includes/default-filters.php:73: add_filter($filter, ‘wpautop’);
./wp-includes/default-filters.php:90:add_filter(‘the_content’, ‘wpautop’);
./wp-includes/default-filters.php:95:add_filter(‘the_excerpt’, ‘wpautop’);
./wp-includes/default-filters.php:103:add_filter(‘comment_text’, ‘wpautop’, 30);
./wp-includes/formatting.php:47:// Accepts matches array from preg_replace_callback in wpautop()
./wp-includes/formatting.php:62:function wpautop($pee, $br = 0) {
./wp-includes/formatting.php:1099: $output = wpautop($output);

どうも基本的には問題無さそうだったのですが・・・

残念ながら別の箇所の改行が今度は挿入されなくなってしまいました。 あちらを立てればこちらが立たず、何とも悩ましいです。 そこでさらに見ていくと、このwpautopの中で「改行処理等を加えるべきタグのリスト」が$allblocksという変数にセットされています。 これはもう本当に最後の手段で、結局このリストからinputを除去しました。

この結果、期待通りの結果を得たのですが・・・少々気持ち悪いのも確かです。 知人のサイトがWordPressを使っていて、このあたりがキッチリ処理されていたので、昨日会ったときに聞いてみたのですが、知人のサイトのWordPressはスペシャル版になっていて、インストールも実は一筋縄ではいかないとのことでした。

コアモジュールにも相当手が入っているとのこと。 セキュリティ上の問題がある可能性を否定できないので詳しく書けないのが残念ですが、まぁあそこまで実現できているのならばインストールが大変でも仕方ないか・・・というくらいのデキなので、納得ではありますが。

そういえば、WordPressの開発ブログが久々に更新されていて、次期ヴァージョンの開発リリースがされていました。

WordPress › Blog » 2.5 Sneak Peek

このあたりの処理がどうなっているのか?(変わっていないのか?)時間がないので、すぐには見られないですが、確認してみるのが楽しみです。

One Reply to “コアモジュールに手を入れるべきか否か”

コメントは受け付けていません。