Свои смайлы в теме
Вчера решил добавить новые смайлы в блог. И сразу вспомнил, что при обновление блога смайлы возвращаются, заменяются на дефолтные. Не айс постоянно менять. Поковырявшись в поиске я так и не смог найти нормального решения, а точнее вообще решения, кроме как замена картинок.
Поставленные перед собой задачи советы и решения с просторов интернета не решают:
- Не возиться постоянно с перезалитием смайлов после обновления блога;
- Автозамена текстовых смайлов графическими.
Поэтому я решил написать свое решение через функцию, благодаря чему у меня появилось несколько преимуществ перед другими решениями:
- Назначение своих смайлов именно для темы;
- Не надо тратить время на добавление своих смайлов постоянно, после каждого обновления;
- Можно добавлять свои смайлы, т.е. расширять набор;
- Текстовые смайлы преобразуются в графические.
Реализация
Открываем файл в теме functions.php и вставляем туда такие строки
/* Смайлы */
function smiles ($content) {
$content = str_replace('/wp-content/themes/prosto_blog/smilies/', '/wp-content/themes/'.get_stylesheet().'/smilies/', $content);
$content = preg_replace('~\*WALL\*~i', '', $content);
return $content;
}
add_filter ( 'the_content', 'smiles' );
Тут всё очень просто.
- Создаем свою функцию smiles;
- Далее работаем с обычными регулярными выражениями. Первая строка — это замена имеющихся, а точнее заменяем путь к смайлам, т.е. назначаем папку со смайлами. Вторая — это создаем свои смайлы;
- Закрываем функцию;
- Говорим WP, что надо применить эту функцию. Рекомендую все фильтры скидывать в одно место, в конце файла functions.php
Как же это все работает?
Объявляем переменную. И, чтобы не вводить себя в заблуждение, назовем её $content, мы ведь тут работаем именно с контентом.
В первом случае мы применяем обычную функцию поиска и замены на PHP — str_replace, и заменяем путь до папки. Я папку со смайлами поместил в папку smiles внутри моей темы (я же делаю именно для темы!). Теперь залейте свои смайлы в папку и всё новые смайлы должны начать работать.
Второй же строкой мы добавляем новые смайлы. Применяем функцию поиска и замены по регулярным выражениям preg_replace. Её я применил в виду того, что смайлы могут писаться в разном регистре, например смайл *WALL* и *wall*.
Тут будет посложнее разобраться из-за регулярных выражений. Разумеется, если вы с ними не знакомы.
Вкратце расскажу, но более подробное смотрите на просторах интернета, там полно разжеванной информации. Если вы не можете разобраться, составить регулярку на какой-то смайл, то пишите в комментах, я вам составлю для вашего смайла.
Тут сложность только в том, что надо обязательно экранировать спецсимволы, а именно звездочку. Экранировать — это ставить слэш.
На примере моего смайла ~\*WALL\*~i.
Тильда (~) — это ограничитель регулярного выражения, правильнее Delimiter. Вместо тильды, если в смайле присутствует оная, можно использовать например #.
Между ограничителями пишем текст смайла, который нам необходим. А вот в конце можно назначить свои модификаторы. В данном случаи i означает, что текст регистронезависимый.
Далее пишем код, который будем вставлять вместо смайла.
И все, новый смайл готов к употреблению. Таким образом можно сделать сколько угодно своих смайлов, просто дублируйте строку.
Всё это можно упростить, переведя в массивы. После Нового года я приведу пример с массивами, сейчас уже предпраздничное настроение и думать лень.
С помощью этого примера можно делать замену не только смайлов. Однако, каждая такая замена, пусть и не сильно, но создает нагрузку на сервер/хостинг, поэтому рекомендую всегда использовать плагины кэширования.
UPDATE 30.01.2012
Данный скрипт не работал в комментариях. Чтобы смайлы заработали в комментариях, необходимо добавить еще один фильтр:
add_filter ( 'comment_text', 'smiles', 20 );
Где число 20 является обязательным параметром. Как я понимаю — это порядок выполнения фильтра.
Если открыть файл /wp-includes/default-filters.php, то там можно увидеть строки:
add_filter( 'comment_text', 'wptexturize' );
add_filter( 'comment_text', 'convert_chars' );
add_filter( 'comment_text', 'make_clickable', 9 );
add_filter( 'comment_text', 'force_balance_tags', 25 );
add_filter( 'comment_text', 'convert_smilies', 20 );
add_filter( 'comment_text', 'wpautop', 30 );
Тут у данного фильтра (convert_smilies) приоритет 20, следовательно нам надо выставить такой же или выше.
Ссылки по теме
Очень толковый справочник по регулярным выражениям — основы в доступной форме.
Несколько Cheat Sheet по регулярным выражениям
То что нужно. Искал, как же внедрить смайлики в тему и наконец нашёл.
Благодарю.