Замена HTML-символов на специальные символы в комментариях на WordPress

Замена HTML-символов (< >) на специальные символы при комментировании

В этой статье мы рассмотрим удобный способ вставки кода в текст комментариев на WordPress. Иногда нам нужно будет заменить символы < и > на их специальные эквиваленты < и >, чтобы избежать их интерпретации браузером как HTML-код. Давайте разберемся, как это сделать.

Задача

Необходимо найти теги <pre> и <code> в комментариях и заменить все символы < и > внутри них на специальные символы < и >.

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

Решение задачи (новая версия кода)

Чтобы сделать замену, используйте следующий код. Вставьте его в файл functions.php вашей темы:


add_filter('pre_comment_content', 'kama_convert_html');
/*

  • Преобразует HTML-символы: < > внутри тегов pre, code в специальные символы < и > в тексте
  • версия 1.0
    /
    function kama_convert_html_entities( $text, $convert_in='pre|code|var'){
    return preg_replace_callback ('!<('. $convert_in .')([^>]
    )>(.*?)!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", "1t", $out ); // заменяем 4 пробела на табуляцию

return "<$matches[1]$matches[2]>$out";

}

Что делает эта функция?

При публикации комментария функция ищет текст внутри тегов <pre> и/или <code> и заменяет символы < и > в найденном тексте на < и >.

Замена происходит перед тем, как текст комментария будет записан в базу данных. Если нужно сделать замену непосредственно перед отображением текста на экране, замените строку:


add_filter('pre_comment_content', 'kama_convert_html');
// на
add_filter('comment_text', 'kama_convert_html');

Как проверить, что все работает?

После установки функции попробуйте оставить комментарий с таким текстом:

Проверка конвертации символов в комментариях. 
Здесь будет код
Первый промежуточный текст
Здесь будет код 2 

Промежуточный текст
Здесь будет еще код


Еще один простой текст

Здесь будет код 

Наконец, еще текст

В результате в базу данных должен быть записан следующий текст:

Проверка конвертации символов в комментариях. 
Здесь будет код <div> Первый промежуточный текст
Здесь будет код 2 <span>

Промежуточный текст
Здесь будет еще код <div>
Еще один простой текст

Здесь будет код <span>

Наконец, еще текст

Сохранение любого кода в тексте статьи

Тот же подход можно применить и к содержимому статей. Для этого добавьте еще один фильтр в вашу функцию:


add_filter('content_save_pre', 'kama_convert_html');

Старая версия

Старая версия кода функционирует аналогично, но код больше и менее лаконичен:


/ Преобразование HTML-символов < > в специальные символы при отправке комментария /
function kama_html_replace_char_pre( $matches ){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<pre{$matches[1]}>".$out."";
}

function kama_html_replace_char_code ($matches){
$out = str_replace (array ('<' ,'>'), array ('<','>'), $matches[2] );
return "<code{$matches[1]}>".$out."";
}

function kama_convert_html ( $comment_text ){ // подготавливает содержимое комментатора
$comment_text = preg_replace_callback ('!<pre([^>])>(?:rn|n|r|)(.?)(?:rn|n|r|)!ims', 'kama_html_replace_char_pre', $comment_text);
$comment_text = preg_replace_callback ('!<code([^>])>(?:rn|n|r|)(.?)(?:rn|n|r|)!ims', 'kama_html_replace_char_code', $comment_text);
return $comment_text;
}

add_filter ('pre_comment_content','kama_convert_html');

Теперь вы знаете, как заменить HTML-символы на специальные в комментариях и статьях! Это позволит вам поддерживать порядок в отображении кода на вашем сайте.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *