Intereting Posts
Есть ли способ добавить еще один ряд к переключению кухонной раковины tinyMCE? элемент формы, сгенерированный массивом, всегда вставляет последний элемент в db вместо выбранного элемента Overed get_template_part ('partials / post', 'sidebar'); с плагином Запрос WP Query на более чем 2000 сообщений Как выводить только содержимое сообщения Пользовательский тип сообщения не отображается в таблице wp_posts в базе данных с помощью navicat или PHPmyadmin Добавление colorbutton в диалоге tinymce с текущим api Что это за недокументированные аргументы для register_taxonomy? удаление персонализированной почты на основе пользовательской даты поля Есть ли лучший способ привлечь пользовательский контент без запроса сообщений? Как сделать многодольный субдомен wp AWS Bitnami WordPress – команда SELECT, запрещенная пользователю Создание одноразового URL-адреса WP Cron: wp_get_schedule ($ hook) ничего не возвращает Условный мета-запрос WooCommerce

esc_attr () искажает значения json

Является ли это esc_attr() и esc_js() или я делаю что-то неправильно?

 function _action_escape_test() { $json = json_encode(array('test' => '<>\'"[]&quot;')); foreach ( array( 'esc_attr' => esc_attr($json), 'esc_js' => esc_js($json), 'htmlspecialchars' => htmlspecialchars($json, ENT_COMPAT, 'UTF-8') ) as $func => $esc_value ) { ?><fieldset class="esc-test"> <legend><?php echo $func ?>()</legend> <textarea data-test-json="<?php echo $esc_value ?>" style="width: 100%"><?php echo htmlspecialchars($esc_value, ENT_COMPAT, 'UTF-8'); ?></textarea> </fieldset><?php } ?><script type="text/javascript"> jQuery(function($){ $('.esc-test').each(function(){ var $this = $(this); try { var json = JSON.parse($this.find('textarea').attr('data-test-json')); $this.css('border', '1px solid green'); } catch (e) { $this.css('border', '1px solid red'); } }); }); </script><?php } add_action('admin_notices', '_action_escape_test'); 

Скриншот

Обычно, когда нужно поместить строки в javascript, esc_js – это правильная функция, а не esc_attr .

Проблема в том, что esc_js , согласно документам :

Сбрасывает текстовые строки для эха в JS

(смелый рудник).

Таким образом, используя esc_js вы получаете строку, которая может быть безопасно отражена в js, а не анализируется: это не ошибка, это предполагаемое поведение.

Канонический способ передачи данных с PHP на js в WordPress – это wp_localize_script поэтому вы должны использовать его вместо этого. (Обратите внимание, что функция внутри не использует никаких функций esc_* , просто эхо результат json_encode ).

В качестве альтернативы я могу предложить вам использовать filter_var с фильтрами sanitize : IMHO это гораздо лучший способ выполнить задачу esc_* Функции WP. Учтите, что функция esc_* проходит через esc_* фильтров, поэтому целостность ваших данных может быть повреждена внешним кодом.

Пытаться:

 <?php $data_safe = filter_var( $json, FILTER_SANITIZE_SPECIAL_CHARS ); $out_safe = filter_var( $json, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); ?> <textarea data-test-json="<?php echo $data_safe; ?>"><?php echo $out_safe; ?></textarea>