May 18

Столкнулся с багом в WordPress’е при выводе постов, а точнее в “применении” к ним “типографики”:

wptexturize

Как видите, кавычки в некоторых словах расставлены абсолютно не так, как нужно. В поисках решения проблемы обнаружил следующее - в WordPress’е на каждый блок выходных данных, будь то заголовок, сам пост, его комментарии или что-либо еще, навешиваются фильтры, которые определенным образом изменяют блок - убирают теги, заменяют одни символы на другие и т. д.

В данном случае меня интересовал блок the_content (в данном случае понятие “блок” можно интерпретировать как “функция WP, которая возвращает некий контент”), который выводит содержимое поста. В файле wp-includes/default-filters.php можно увидеть, какие фильтры применяются к этому блоку:

add_filter('the_content', 'wptexturize');
add_filter('the_content', 'convert_smilies');
add_filter('the_content', 'convert_chars');
add_filter('the_content', 'wpautop');
add_filter('the_content', 'prepend_attachment');

Методом проб и ошибок было установлено, что найденный мной баг “создает” фильтр wptexturize (в WP “фильтр” - это функция, которая принимает 1 аргумент - входящий текст, и возвращает обработанный текст). Функция нашлась в файле wp-includes/formatting.php. Она выполняет “типографскую” работу, при этом пропуская всё, что находится между тегами pre, code, kbd, style и script. В теории… На практике - нихрена она не пропускает, если внутри одного из этих тегов будет какой-либо другой тег (что, в принципе, возможно, но встречается редко, а случай pre > code система хавает на ура), либо если внутри какого-нибудь из этих тегов встретится \[.*\] - вот такой кусок (у меня этим куском был ['comment_post_ID'], например). Почему так - не могу знать (мне вообще непонятно зачем наряду с тегами <.*> рассматривать еще и \[.*\]), но факт остается фактом. Улучшенная версия этого файла находится здесь (у меня WP 2.5.1, если что).

written by fxposter \\ tags: ,

One Ping to “WordPress Filters: баг в wptexturize”

  1. wptexturize bugfix plugin » Блог FX'а Says:

    […] мне WordPress Filters: баг в wptexturize May […]


5 Responses to “WordPress Filters: баг в wptexturize”

  1. 1. Vadim Voituk Says:

    Негоже файлики WP патчить имея столь мощный механизм расширения.
    Я уже 2жды на это наступил – теперь при каждом обновлении diff-ом приходится изменения merge-ить
    По хорошему неплохо бы создать плагин, который добавит свой фильтр тем самым этот баг пофиксит.

  2. 2. FX Poster Says:

    Уже. Спасибо.

  3. 3. Ilya Says:

    непонятно зачем наряду с тегами <.*> рассматривать еще и \[.*\]),
    bb-codes?

  4. 4. FX Poster Says:

    bb-codes?
    Может быть…

  5. 5. Владимир Says:

    С фильтрами действительно морока. На днях написал плагин, который добавляет блок ссылок из поисковых фраз, по которым приходят на блог – берется из рефера и задача стояла в коннце поста добавить список ul. WordPress тег ul закавычивал в пааграф p. Пришлось крутить и вертеть добавляемым html кодом. Решение нашел такое: перед списком ul ставлю строку закавыченную в p /p тогда все нормально. ненормально то, что примитивный html код приходится напильником обрабатывать…,

Leave a Reply