フォームに入力された文字列を操作して出力させるスクリプトを作っていたときにwordpressだけで起きる問題について書いていきます。
作ったスクリプトを普通にサーバーにアップすると問題なく動作していたものが、wordpressの個別ページに組み込んで動かしたら正常に働かなくなったんです。
原因はwordpress内でpostするとダブルクォーテーションがエスケープされるから。
どんな症状?
フォームに文字列を入力してpostで飛ばす。
飛んできたものをそのまま表示させるとダブルクォーテーション部分がすべてエスケープされていた。
【“】→【\”】こういう事ですね。
入力 width=”560″ height=”315″
出力 width=\”560\” height=\”315\”
入力された文字列の特定のパラメータだけ変更して出力させたいのにこれでは使えません。
原因はマジッククォート
原因はマジッククォート(magic_quotes)というphpの機能のせいでした。
php.iniの設定で
magic_quotes_gpcをonかoffに設定します。
レンタルサーバーの管理画面から編集出来る場合が多い。
magic_quotes_gpcがONの場合
フォームから入力した文字列に
“ |
‘ |
\ |
NULL |
この4つが含まれていた場合バックスラッシュ【\】でエスケープするという仕様になっている。
データベースを扱うときのセキュリティのためですって。
では普通にサーバーにスクリプトをアップしたときはマジッククォートされなくて、同じサーバーにインストールしているwordpress内からだとマジッククォートされてしまうのは何故か?
https://codex.wordpress.org/ 公式サイトによると
WordPressは組み込みのPHPマジッククォート設定とget_magic_quotes_gpc()の値を無視し、マジッククォートを常に追加します。
(PHP5.4以降、マジッククォート機能が削除された後もWordPressはそのまま)
ということだそうです。
magic_quotes_gpcの設定がどうなっているか調べる関数が
get_magic_quotes_gpc()
get_magic_quotes_gpc()で調べると僕が使っているサーバーの設定はmagic_quotes_gpcがoffになっている。
なので普通にサーバーにスクリプトを上げて動かすとフォームからpostしたものはエスケープされない。
だけど同じスクリプトをwordpress内に埋め込んで動かすとマジッククォート機能が働いてエスケープされる。
こういう事なのでした。
解決策
原因がわかったところで解決策を探ります。
エスケープ処理された文字列からバックスラッシュを削除してやればいい。
width=\”560\” height=\”315\” これを
width=”560″ height=”315″ こうする。
こういう関数がありました。
クォート=エスケープということで良さそうです。
stripslashes()は、引数に文字列を指定するとバックスラッシュ【\】が取り除かれた文字列が返ってくる、という関数です
magic_quotes_gpcの値を調べる関数
get_magic_quotes_gpc()
引数なしで使います。
magic_quotes_gpcの設定がONなら1を、OFFなら0を返します。
if ( get_magic_quotes_gpc() ) {
$str = stripslashes( $str );
}
これでmagic_quotes_gpcの値を調べてonならバックスラッシュでクォートされた文字列を元に戻すことが出来ます。
ただし今回の場合はwordpress内で使います。
wordpress内ではmagic_quotes_gpcの設定がONでもOFFでもマジッククォート機能が働いてエスケープされてしまいます。
だからif文で条件をつける事なしに問答無用でstripslashes()でクォートされた文字列を元に戻してやります。
スクリプトの適当な位置にstripslashes()を置いてクォートされた文字列を元に戻す設定にしました。
結果はwordpressの記事内からpostした文字列が正常に出力出来ました。
参考にさせてもらった記事
今回のphpの基本的な事はこちらの記事
wordpressだとmagic_quotes_gpc()の設定を無視してマジッククォートを実行してしまうという情報はこちらの記事
それぞれ参考にさせていただきました。
ありがとうございます!
以上「wordpressでPOSTした文字列のダブルクォーテーションがエスケープされる問題」という記事でした。
気に入ってもらえたらシェアしてくれると嬉しいです。