Изменяем список разрешенных 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);
Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

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