Если вы не впервые на моем блоге, то заметили, что я добавил в форму комментирования кнопки для вставки HTML-тегов (жирный текст, курсив, цитата, ссылка и код).
Сначала никаких проблем не было, но когда я дошёл до подсветки синтаксиса в комментах, начался хаос 🙂
Первое. Удалялись все HTML-теги (ну кроме <strong>, <em> и прочее), находящиеся между <code> и </code>, а также между <pre> и </pre>, или <blockquote> и </blockquote>. То есть обычный пользователь сайта не смог бы нормально вставить код или процитировать его. Я ещё не сразу это заметил, ведь на админа такие ограничения не распространяются 🙂
Нет, для исправления этой проблемы не стоит разрешать юзерам использовать любые HTML-теги, об этом чуть ниже. А сейчас нужно просто заменить все символы < на < находящиеся в тегах, предназначенных для вставки кода.
На моем блоге это теги <pre> и <blockquote>
Для тех, кто не в курсе — вставьте этот код в файл functions.php
function replace_html_code ($matches){ $out = str_replace( array('<','>'), array('<','>'), $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);