Ещё один простой блог в интернете, одного из жителей Сызрани, который считает себя дизайнером, WEB-мастером и фотографом-любителем

просто блог

QR CODE для записиQR CODE для записи “Свои смайлы в теме”

Свои смайлы в теме

Новогодний смайликВчера решил добавить новые смайлы в блог. И сразу вспомнил, что при обновление блога смайлы возвращаются, заменяются на дефолтные. Не айс постоянно менять. Поковырявшись в поиске я так и не смог найти нормального решения, а точнее вообще решения, кроме как замена картинок.

Поставленные перед собой задачи советы и решения с просторов интернета не решают:

  • Не возиться постоянно с перезалитием смайлов после обновления блога;
  • Автозамена текстовых смайлов графическими.

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

  • Назначение своих смайлов именно для темы;
  • Не надо тратить время на добавление своих смайлов постоянно, после каждого обновления;
  • Можно добавлять свои смайлы, т.е. расширять набор;
  • Текстовые смайлы преобразуются в графические.

Реализация

Открываем файл в теме 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', '*WALL*', $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 по регулярным выражениям

Рубрики: WordPress | Один комментарий
  1. Кирилл # link

    То что нужно. Искал, как же внедрить смайлики в тему и наконец нашёл.

    Благодарю.

Оставить комментарий

В блоге включена ручная модерация комментариев. Нет смысла повторно отправлять комментарий.
Поля отмеченный звездочкой * обязательны к заполнению

Перед отправкой формы: