Меняем HTML символы (< >) на спецсимволы при комментировании
Недавно писал о том, как вставлять код в текст статьи. Сегодня хочу поделится способом удобной вставки кода в тело комментария.
Задача: в комментариях, найти теги <pre> и <code> и внутри них заменить все символы < и > на соответствующие им спецсимволы: < и>.
Тут важно определится, когда делать замену. К примеру, некоторые плагины делают замену во время генерации страницы, т.е. всегда при открытии страницы к каждому комментарию применяется функция преобразования и измененный комментарий выводится на экран. Я еще не видел плагина, который бы делал замену перед записью текста в базу данных, чтобы потом просто получить текст, без преобразований. Мне кажется это лучшим подходом. В крайнем случае всегда можно обратно произвести замену, там где это нужно...
Решение задачи (новая версия кода):
add_filter('pre_comment_content', 'kama_convert_html'); /* * Преобразует html символы: < > внутри тегов pre|code во спецсимволы < > в тексте * v1.0 */ function kama_convert_html_entities( $text, $convert_in='pre|code|var'){ return preg_replace_callback ('!<('. $convert_in .')([^>]*)>(.*?)</\\1>!ims', '__kama_convert_html_entities_cb', $text); } function __kama_convert_html_entities_cb( $matches ){ $out = str_replace( array('<','>'), array('<','>'), $matches[3] ); $out = preg_replace( "~((?<=\n|^|\t))[ ]{4}~m", "\\1\t", $out ); // заменяем 4 пробела на табы return "<$matches[1]$matches[2]>$out</$matches[1]>"; }
Функцию поместите в файл functions.php вашего шаблона (вашей темы).
Что делает функция?
При публикации комментария, функция находит текст внутри тегов <pre> и/или <code> и в найденном тексте заменяет символы < и > на < и >.
Замена происходит перед тем, как текст комментария записывается в Базу Данных. Если нужно заменять прямо перед выводом текста на экран, то замените строку:
add_filter('pre_comment_content', 'kama_convert_html'); // на add_filter('comment_text', 'kama_convert_html');
Как проверить что все работает?
После установки функции попробуйте оставить комментарий с таким текстом:
Проверка преобразования символов в комментариях. <div></div> <code>Здесь будет код <div> </code> Первый промежуточный текст <span></span> <pre>Здесь будет код 2 <span> </pre> Промежуточный текст <strong></strong> <code>Здесь будет еще немного кода <div> </code> Еще немного простого текста <b></b> <pre>Здесь будет код <span> </pre> В заключении еще немного текста <div></div>
В результате в базу данных должен записаться следующий текст:
Проверка преобразования символов в комментариях. <div></div> <code>Здесь будет код <div> </code> Первый промежуточный текст <span></span> <pre>Здесь будет код 2 <span> </pre> Промежуточный текст <strong></strong> <code>Здесь будет еще немного кода <div> </code> Еще немного простого текста <b></b> <pre>Здесь будет код <span> </pre> В заключении еще немного текста <div></div>
Сохранение любого кода в тексте статьи (поста)
Такой же трюк можно сделать и с контентом статьи. Для этого внизу функции допишите еще один фильтр:
add_filter('pre_comment_content', 'kama_convert_html'); // При обновлении поста в админке add_filter('content_save_pre', 'kama_convert_html');
Старая версия
Старая (первая) версия кода, работает также, только код более длинный:
/* Преобразуем хтмл символы < > в спецсимволы при отправке комментария */ function kama_html_replace_char_pre( $matches ){ $out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] ); return "<pre{$matches[1]}>".$out."</pre>"; } function kama_html_replace_char_code ($matches){ $out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] ); return "<code{$matches[1]}>".$out."</code>"; } function kama_convert_html ($comment_text){ // подготавливает контент комментатора $comment_text = preg_replace_callback ('!<pre([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</pre>!ims', 'kama_html_replace_char_pre', $comment_text); $comment_text = preg_replace_callback ('!<code([^>]*)>(?:\r\n|\n|\r|)(.*?)(?:\r\n|\n|\r|)</code>!ims', 'kama_html_replace_char_code', $comment_text); return $comment_text; } add_filter ('pre_comment_content','kama_convert_html');