WordPress でプラグインを書こうとしたら、$_POST とか $_GET とか使うことになると思います。
ところが、これらの外部入力は無条件に magic quotes されています。
しかも、WordPress によって。PHP 関係なしで。
また、プレーンな値を直接取得する方法も無いようです。
で、プレーンな入力値が必要な時は、stripslashes です。
ちょっとびっくりしましたが、これも WordPress の流儀。
WordPress 始めたばっかりのプログラマ側の人はびっくりするかも知れないと思ってのメモでした。
詳細
最初、まさか php がマジッククオート ON なのか? と思ったりして php.ini とか見たり、.htaccess 見たりしてけれど、magic qoutes なんてされてません。もちろん、get_magic_quotes_gpc() で確認しても、大丈夫、ちゃんとオフ。
なぜー? なんでー?! (?_?)
まさかと思いつつ、WordPress のコードを彷徨ったら、load.php の中に次の関数を見つけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
function wp_magic_quotes() { // If already slashed, strip. if ( get_magic_quotes_gpc() ) { $_GET = stripslashes_deep( $_GET ); $_POST = stripslashes_deep( $_POST ); $_COOKIE = stripslashes_deep( $_COOKIE ); } // Escape with wpdb. $_GET = add_magic_quotes( $_GET ); $_POST = add_magic_quotes( $_POST ); $_COOKIE = add_magic_quotes( $_COOKIE ); $_SERVER = add_magic_quotes( $_SERVER ); // Force REQUEST to be GET + POST. $_REQUEST = array_merge( $_GET, $_POST ); } |
これはつまり…、PHP の設定に関わらず、オレオレマジッククォート適用しちゃうぞって事ですね。
これは WordPress の流儀のようです。
では、プレーンな値が欲しい時はどうするのか?
これが調べてもそれらしい情報が出てこなかったのですが、Twitter で @horike37 さんがビシッと教えてくれました。
自動でシングルコートつけてきよるのでstripslashesするしかない!
とのこと。
潔いですね。というか、html escape がデフォルトのテンプレートエンジンと同じじゃないか、合理的じゃないか、ということで、納得しておきます!
参考
いちおう自分でも見つけた情報。みんな最初は戸惑うようです。
http://wordpress.stackexchange.com/questions/21693/wordpress-and-magic-quotes