WordPress. Фильтруем HTML в записях и комментариях

Я давно уже наблюдаю мучения читателей, которые пытаются оставить примеры html-разметки в комментариях. К сожалению, в прошлом году, долго не находилось времени, для решения этой проблемы.
Но сегодня, с радостью хочу объявить о том, что проблема наконец-то решена – теперь вы можете использовать любую html-разметку в комментариях, предварительно заключив ее в теги <code>, а если вам интересно как это реализовано, то читайте далее.

Описание проблемы

HTML – это структурированный язык разметки, в котором текст заключается внутри тегов с угловыми скобками. Эти тэги сообщает браузеру, каким образом необходимо структурировать/отобразить информацию, содержащуюся между ними. Одни из самых распространенных тегов – это открывающий и закрывающий тег параграфа (<p>, </p>); они сообщают браузеру, что текст, который находится внутри, является параграфом, в общей структуре документа.

Но что если, вы захотите показать читателям пример html-разметки?

Вы не сможете вывести тэги на экран, просто напечатав их, поскольку браузер решит, что это html-код и не отобразит их. Поэтому, для того чтобы вывести html-код, мы должны использовать специальные угловые скобки. Для вывода таких скобок используется их символьный объект – специальный код, который выведет нужный символ. Этот код может быть как в форме имени, так и в форме числа, можно использовать то, что больше нравится. Например, прямые кавычки “ можно вывести двумя способами – используя объект-имя &quot; или объект-число &#34;.

Левую угловую скобку можно вывести с помощью &lt; или &#60;. В нашем примере, для вывода угловых скобок, мы будем использовать символьные объекты &lt; и &gt;.

Добавляем HTML-код в текст записи WordPress

Теперь, после того как мы разобрались, как отобразить HTML-код на экране, давайте разберемся как нам это использовать в записях WordPress. На первый взгляд все очень просто – нужно всего лишь заменить левые и правые угловые скобки в их символьные эквиваленты. Это хорошо пока у вас одна-две строчки кода, но что делать, если их значительно больше? Существуют различные плагины для решения этой проблемы, но большинство их них требуют дополнительной разметки в статье.

Поэтому я решил создать WordPress-фильтр, который будет находить определенные секции записи и автоматически конвертировать угловые скобки в их числовой эквивалент.

С помощью специального фильтра WordPress, мы сможем нормально отображать примеры html-кода в статьях и комментариях, внутри тегов <pre>.

Фильтры WordPress

Из Кодекса:

Фильтры – это функции, через которые WordPress пропускает данные, в определенные моменты исполнения, до того, как с ними будут произведены какие-то действия (такие как добавление в базу данных или отображение в окне браузера).

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

Специальный WordPress HTML фильтр

Вот так выглядит код фильтра:

[php]
<?php
function mish_code_filter($content_text) {
$content_text = preg_replace(‘!(<pre.*?>)(.*?)</pre>!ise’, " ‘$1’ . stripslashes( str_replace(array(‘<‘,’>’),array(‘&lt;’,’&gt;’),’$2′) ) . ‘</pre>’ ", $content_text);
return $content_text;
}

add_filter(‘the_content’,’mish_code_filter’, 1, 1);
?>
[/php]

Теперь, давайте разберем код на части. Сначала мы создаем новую функцию, под названием “mish_code_filter”:

[php]
function mish_code_filter($content_text) {
<!– function actions –>
}
[/php]

Далее, мы описываем, что будет делать функция. В нашем примере, мы используем PHP-функцию preg_replace(), которая будет отыскивать текст внутри тэгов <pre>

[php]
$content_text = preg_replace(‘!(<pre.*?>)(.*?)</pre>!ise’,
[/php]

…и заменять их на зашифрованный текст:

[php]
" ‘$1’ . stripslashes( str_replace(array(‘<‘,’>’),array(‘&lt;’,’&gt;’),’$2′) ) . ‘</pre>’ ",
[/php]

Вторая часть функции preg_replace(), использует две PHP-функции: stripslashes() и str_replace().

stripslashes() удаляет обратные слэши (\), которые добавляет WordPress, до того как вставляет запись в базу данных. Обычно, WordPress самостоятельно удаляет эти слэши, до того как вывести контент на экран, но поскольку наш фильтр инициализируется до того как данные будут отображены, эта функция обязательна.

str_replace() – ищет угловые скобки и заменяет их на символьные объекты.

$1 и $2 – это значения выражения, где $1 = (<pre.*?>) и $2 = (.*?).

Последняя часть функции возвращает значение (результат) функции, чтобы мы могли его использовать:

[php]
return $content_text;
[/php]

Теперь, нам нужно внедрить наш фильтр в WordPress, так, чтобы он срабатывал в определенное время. В нашем случае, мы внедрим фильтр, внутрь фильтра «the_content»:

[php]
add_filter(‘the_content’,’mish_code_filter’, 1, 1);
[/php]

Фильтр “the_content”, как нетрудно догадаться, используется для фильтрации записей, после того, как они получены из базы данных и до того, как они выведены на экран. Поэтому, в нашем случае, мы сообщаем вордпрессу, о том, что наш фильтр (mish_code_filter) нужно использовать совместно с фильтром “the_content”.

Первая единица в годе, говорит WordPress, о том, что фильтр имеет высокий приоритет и должен быть выполнен раньше любых, других фильтров. Вторая единица говорит WordPress, о том, что мы передаем нашему фильтру только 1 параметр.

Установка Фильтра

Откройте ваш файл functions.php (расположен в папке с вашей темой), и вставьте туда следующий код:

[php]
<?php
function mish_code_filter($content_text) {
$content_text = preg_replace(‘!(<pre.*?>)(.*?)</pre>!ise’, " ‘$1’ . stripslashes( str_replace(array(‘<‘,’>’),array(‘&lt;’,’&gt;’),’$2′) ) . ‘</pre>’ ", $content_text);
return $content_text;
}

add_filter(‘the_content’,’mish_code_filter’, 1, 1);
?>
[/php]

Фильтр для Комментариев

Наш фильтр также можно использовать для фильтрации html, в тексте комментариев, для этого понадобятся совсем небольшие изменения. Первое, что нам нужно сделать – это заменить фильтр «the_content», на фильтр «comment_text», который выполняет ту же функцию, только для текста комментариев.

Ну и второе, необязательное изменение – теги <pre> мы заменим на теги <code>, так как они чаще используются в тексте комментариев. В результате у нас получится вот такой фильтр:

[php]
function mish_code_filter($content_text) {
$content_text = preg_replace(‘!(<code.*?>)(.*?)</code>!ise’, " ‘$1’ . stripslashes( str_replace(array(‘<‘,’>’),array(‘&lt;’,’&gt;’),’$2′) ) . ‘</code>’ ", $content_text);
return $content_text;
}

add_filter(‘comment_text’,’mish_code_filter’, 1, 1);
[/php]

Устанавливается он точно так же, как фильтр контента. Вот и все, можете проверить – наш фильтр работает.

Плагины с похожей функциональностью

Перевод статьи “Adding and Filtering Raw HTML in WordPress Posts“, автор Martin


Posted

in

,

by

Comments

14 responses to “WordPress. Фильтруем HTML в записях и комментариях”

  1. Дмитрий Чебаков Avatar

    А почему бы не использовать для этого привычный многим и более функциональный плагин SyntaxHighlighter?

    1. dreamhelg Avatar
      dreamhelg

      Ну это специальное решение _без_плагинов_. А SyntaxHighlighter можно использовать в комментариях?

  2. tiaurus Avatar

    После добавления этого кода блог не грузится – отображается просто пустая страница. Поэтому я уж лучше по старинке, как и вы, с помощью плагина.

    1. dreamhelg Avatar
      dreamhelg

      Очень интересно, тестировала на локальном блоге работает отлично. Делали точно так как в статье? И какая версия вордпресс установлена?

      1. tiaurus Avatar

        WordPress 2.9.1
        Все дело оказалось в коде для комментариев. Убрал – заработало.
        Однако не все так просто оказалось – все равно выдаваемый текст содержит ошибки: код становится непригодным из за того, что после < и до ?php вкрадывается пробел. То есть вместо <?php получается < ?php. Будучи скопированным и вставленным, такой код неработоспособен. А вычищать каждый такой пробел в большом куске кода – дело утомительное.
        Честно говоря, не понимаю, почему разработчики WordPress до сих пор не реализовали корректную вставку и отображение исходного кода?

  3. Игорь Avatar

    Да, я тоже на локальном протестировал, вроде работает, но, боязно на сайт который уже в интернете переносить 🙁

  4. AzzePis Avatar

    Большое спасибо за код для коментариев.
    В нём, кстати, небольшая ошибка. Вы не заменили в конце вызова функции preg_replace тег на .
    из-за этого, если в коментарии после вставки кода написать ещё произвольный текст, он тоже фроматируется вашим фильтром.

  5. AzzePis Avatar

    в предыдущем коментарии я прописал ошибочные теги, но они не отображаются… 🙁

    1. dreamhelg Avatar
      dreamhelg

      Спасибо за комментарий, действительно вместо закрывающей скобки code, стояла pre. Внесла изменения в пример и на сайт заодно.

      1. AzzePis Avatar

        Рад помочь. Тем более, что данный код и мне помог 😉

  6. OZ Avatar
    OZ

    проверил скрипт для комментов – не работает

  7. Лариса Avatar

    Здравствуйте! Я новичок в вордпрессе, девушка) У меня возникла проблема с комментариями – перед кнопкой Отправить комментарий стоят слова : “Можно использовать следующие HTML-теги и атрибуты:

    "
    Можете подсказать как убрать их?
    В редактировании comments.php не нашла таких слов, может еще где посмотреть и удалить код?
    Буду очень признательна за подробный ответ!
    Спасибо!

  8. Программист Avatar

    где можно посмотреть сам фильтр the_content, как он работает?

  9. zmoe Avatar

    Не работает код, видимо устарел. Может поправите?

Leave a Reply

Your email address will not be published. Required fields are marked *