Не отключается экранирование кавычек в WordPress

Написано 18 Январь, 2013 в категории Wordpress

Периодически меня посещают ВатЗэФаки. Это статья как раз об одном из них.
Однажды, я делал плагин для WordPress. Нужно было сделать форму для управления настройками.
На этой форме было текстовое поле, где периодически приходилось использовать кавычки.

Но кавычки экранировались обратными слэшами, что выглядело совсем не красиво в тексте, а в поле редактирования текст после первой кавычки вообще не отображался. После гугления, я проверил в php.ini параметр magic_quotes_gpc. Он изначально был установлен в Off, т.е. экранирования быть не должно, но текст упорно продолжал экранироваться.

Немного поразмыслив я предположил, что возможно посмотрел не в том php.ini, и вызвал php функцию get_magic_quotes_gpc(). Результат был равен 0. Т.е. этот параметр точно выключен. Магия какая-то... подумал я и написал простенький php скрипт, с одним текстовым полем на форме:

<?php
$title = $_REQUEST['title'];
echo $title;
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
	</head>
	<body>
		<form action="" method="post">
			<input type="text" name="title" value="<?=htmlentities($title,ENT_QUOTES,'UTF-8')?>"/>
			<input type="submit" value="Обновить"/>
		</form>
	</body>
</html>

И тут произошло чудо, строка из поля ввода не экранировалась! А вот WordPress продолжал упорно добавлять к кавычкам обратные слэши. Стало понятно, что wordpress где то меня нае обманывает.

И такое место нашлось. Жалко что гуглением сделать это не получилось. Пришлось искать по коду.
wp-settings.php содержит вот такие строчки:

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

Тут-то вордпресс и переходит в режим Бога, раздавая всем _GET и _POST массивам слэши.
Непонятно, как отключение этого экранирования скажется на безопасности и работоспособности wodpress, поэтому отключать этот "костыль" не решился. Однако спать я теперь буду намного спокойнее знаю что и тут нет никакой магии!

Ну, и в заключении, если нет возможность отключить magic_quotes или просто страшно это делать, то вот как можно выкрутиться:

<?php
echo 'before =',$_REQUEST['title'];
$title = html_entity_decode(stripslashes($_REQUEST['title']),ENT_QUOTES,'UTF-8');
echo 'after =',$title;
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
	</head>
	<body>
		<form action="" method="post">
			<input type="text" name="title" value="<?=htmlentities($title,ENT_QUOTES,'UTF-8')?>"/>
			<input type="submit" value="Обновить"/>
		</form>
	</body>
</html>

Хорошего дня! :)