Изменяем список разрешенных HTML-тегов в комментариях

Если вы не впервые на моем блоге, то заметили, что я добавил в форму комментирования кнопки для вставки HTML-тегов (жирный текст, курсив, цитата, ссылка и код).

Сначала никаких проблем не было, но когда я дошёл до подсветки синтаксиса в комментах, начался хаос :)

Первое. Удалялись все HTML-теги (ну кроме <strong>, <em> и прочее), находящиеся между <code> и </code>, а также между <pre> и </pre>, или <blockquote> и </blockquote>. То есть обычный пользователь сайта не смог бы нормально вставить код или процитировать его. Я ещё не сразу это заметил, ведь на админа такие ограничения не распространяются :)

Нет, для исправления этой проблемы не стоит разрешать юзерам использовать любые HTML-теги, об этом чуть ниже. А сейчас нужно просто заменить все символы < на &lt; находящиеся в тегах, предназначенных для вставки кода.

На моем блоге это теги <pre> и <blockquote>

Для тех, кто не в курсе — вставьте этот код в файл functions.php

function replace_html_code ($matches){
    $out = str_replace( array('<','>'), array('&amp;lt;','&amp;gt;'), $matches[3] );
    return "<{$matches[1]}{$matches[2]}>".$out."</{$matches[1]}>";
}
function replace_comments_code($comment_text){
    $comment_text = preg_replace_callback ('!<(pre|blockquote)([^>]*)>(.*?)</\\1>!ims', 'replace_html_code', $comment_text);
    return $comment_text;
}
 
add_filter ('pre_comment_content','replace_comments_code');

Отлично, теперь второе. Смотрите, вот список разрешенных для вставки в комментарии HTML-тегов для обычного пользователя по умолчанию:

<a href="" title=""> <abbr title=""> <acronym title=""> <b>
<blockquote cite=""> <cite> <code> <del datetime=""> <em> <i>
<q cite=""> <strike> <strong>

Кстати, вы сами можете вывести этот список на своем блоге, вставив куда-нибудь (например в comments.php) функцию:

<?php echo allowed_tags(); ?>

Ну так вот, загвоздка была в том, что подсвеченный код вставляется через тег <pre> и атрибут class="" А WordPress удалял всё это. Что же, пришло время немного подредактировать список разрешенных HTML-тегов в комментах.

add_action('init', 'edit_html_tags_in_comments', 10);
 
function edit_html_tags_in_comments() {
define('CUSTOM_TAGS', true);
global $allowedtags;
$allowedtags = array(
	'strong' => array(),
	'em' => array(),
	'blockquote' => array(),
	'pre' => array(
		'class' => array()
	),
	'a' => array(
		'href' => array (),
		'title' => array ()
	)
);
}

Вы можете и не составлять новый массив HTML-тегов и их атрибутов, а просто добавить нужные теги в старый. Второй способ:

global $allowedtags;  
$allowedtags_add = array (  
	'pre' => array(  
		'class' => array()
	)
);
$allowedtags = array_merge ($allowedtags, $allowedtags_add);

Смотрите также

Комментарии 4

  • seemoonlight11 марта 2013 в 18:03 #

    Спасибо! Добавил таким образом цвет и выравнивание текста в комментариях!

  • Сергей10 октября 2014 в 18:10 #

    Здравствуйте Михаил. Почему-то не срабатывает ваш код, да и не только ваш, не хочет вордпрес добавлять теги в комментарии, не простым пользователям не даже мне. Не знаете, в чем может быть проблема?

    • Сергей10 октября 2014 в 21:10 #

      Я дико извиняюсь, ваш код прекрасно работает!!! :)
      Нашел проблему. Я сам виноват, поставил хук, который превращает все ссылки комментаторов в простой текст, а он оказывается превращает любые теги в комментах а текст, вот так вот.
      Спасибо за ваш хук, еще раз прошу прощения.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.