この記事を書いた際のWordPressのバージョンは3.9.1です。
バージョン5.4.0以前のPHPでは、magic_quotesがONに設定されていると、POSTやGETで送ったデータの中にある全ての ' (シングルクオート)、 " (ダブルクオート)、 \ (バックスラッシュ)、NULL文字の4つに自動的にバックスラッシュがついてエスケープされます。
バージョン5.4.0から削除されたんですが、まだそれ以前のPHPは多いです。
そこで、get_magic_quotes_gpc関数で、magic_quotesがONかOFFか判別して、ONの場合にはstripslashesを使ってバックスラッシュを削除します。
if(get_magic_quotes_gpc()){ $hoge = stripslashes($_POST['hoge']); }else{ $hoge = $_POST['hoge']; }
ところが、今作っているプラグインで、この作業をしてもPOSTで送ったtextareaのデータにバックスラッシュがついたまま消えません。しかも、テスト環境のmagic_quotesはOFFなのにです。
調べたところ、「POST送信時にバックスラッシュが付加される現象: wordpressメモ」というページを見つけました。
結論を書くと、WordPressを使っているとmagic_quotesの設定は関係なく、$_GET,$_POST,$_COOKIE,$_SERVERの4つは、必ずaddslashesされてバックスラッシュがつきます。
詳細は「POST送信時にバックスラッシュが付加される現象: wordpressメモ」に書いてあるとおりなんですが、wp-includes/load.phpに、wp_magic_quotesという関数があります。
ここで、上記のget_magic_quotes_gpc関数で、magic_quotesが有効になっているか調べ、ONの場合にはstripslashesを使ってバックスラッシュを削除しています。
そして、それで終わらずに、add_magic_quotesという関数を実行しています。
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 ); }
この、add_magic_quotesは何かというとWordpressの独自関数で、実体はwp-includes/functions.phpにあります。
この中で、addslashes関数を使って、$_GET,$_POST,$_COOKIE,$_SERVERの全てのデータをエスケープしています。
function add_magic_quotes( $array ) {
foreach ( (array) $array as $k => $v ) {
if ( is_array( $v ) ) {
$array[$k] = add_magic_quotes( $v );
} else {
$array[$k] = addslashes( $v );
}
}
return $array;
}
wp_magic_quotes関数はどこで呼び出されているかというと、wp-settings.phpの242行目です。(バージョン3.9.1の場合)
なのでWordPressを使う場合は、magic_quotesの設定に関係なく、stripslashesが必要でした。
これがわかるまで随分ハマりました。「POST送信時にバックスラッシュが付加される現象: wordpressメモ」を書かれた方には感謝です。