WordPressの管理ページ作成時に編集フォームPOSTデータを独自テーブルへストアする際にハマったのでメモ。
入力フォームから取得したPOSTデータが意図せずシングルクォートでエスケープされてしまう。
php.ini を確認するも magic_quotes_gpc = Off
になっている。
調べてみると、WordPressの仕様で magic_quotes_gpc の有効、無効問わず常に内部的にクォートされている
状態で処理がされる前提となっておりWordPress側の前処理でクォートエスケープされているためでした。
この時私は、WPにくっつけない構成で既に作成済みのコードをそのまま流用したかっため2つのファイルを
用意して、
magic_quotes済みPOST,GETをキャンセル▶やりたいこと▶元に戻す
で対処しました。
具体的には下記の通り。
1 2 3 4 5 6 7 8 9 |
function sudeni_aru_function(){ require_once dirname(__FILE__) . '/proc_do_cancel_wp_preprocessing.php'; // 元々用意している magic_quotes_gpc = Off 前提で正常動作のソース... ---- はじまり ... // 元々用意している magic_quotes_gpc = Off 前提で正常動作のソース... ---- おわり require_once dirname(__FILE__) . '/proc_undo_cancel_wp_preprocessing.php'; return; } |
proc_do_cancel_wp_preprocessing.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php function strip_magic_quotes_slashes($arr){ if(is_array($arr)){ return array_map('strip_magic_quotes_slashes', $arr); } else { return stripslashes($arr); } } // WP側で常に強制的にadd_magic_quotesされてしまっているので解除 $_GET = strip_magic_quotes_slashes($_GET); $_POST = strip_magic_quotes_slashes($_POST); |
proc_undo_cancel_wp_preprocessing.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php function undo_strip_magic_quotes_slashes($arr){ if(is_array($arr)){ return array_map('add_magic_quotes', $arr); } else { return add_magic_quotes($arr); } } // 先行してWP側で常に強制的エスケープを解除したものを元の状態に戻す。 $_GET = undo_strip_magic_quotes_slashes($_GET); $_POST = undo_strip_magic_quotes_slashes($_POST); |