Изменяем список разрешенных 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);

Источник: misha.blog

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

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: