
Сегодня поделюсь, очередным своим плагином, который создает миниатюры для записей в WordPress.
Преамбула
В недалеком прошлом, когда я был совсем еще зеленым в мире WordPress и программирования. В тот зимний вечер, когда я трудился над своим первым шаблон для WordPress, мне нужно было настроить вывод миниатюр к записям. К тому моменту я уже познакомился с рядом шаблонов для WordPress, в которых встречалась реализация этой задачи. А реализовывалась она посредством, наверняка, известного вам скрипта timthumb.php (создает уменьшенную копию изображения по передаваемой ссылке на это самое изображение). Скрипт этот я конечно в итоге прикрутил к шаблону и, по началу, был доволен результатом.
Работало все как и принято: вставляешь в запись изображение, брешь ссылку на него и добавлял её в специально созданное под это дело произвольное поле. В шаблоне, ссылка с этого поля считывается и по ней создается миниатюра.
Спустя какое-то время, постоянное копирование ссылки и добавление её в произвольное поле, стало для меня адским трудом, потому что — это самая настоящая рутина. К тому же, бывало что я вообще забывал вставить эту пресловутую ссылку и после публикации приходилось возвращаться к редактированию записи. Вам такое не знакомо? Знакомо? Все это осложнялось еще и тем, что для некоторых записей использовались шоткоды NextGen Gallery, а по шоткоду узнать ссылку на картинку проблематично, там ведь id указывается...
Опираясь на все вышесказанное и недосказанное, я написал функцию, которая ищет изображение в посте, вырезать из него ссылку и создает произвольное поле для этого поста автоматически. Позднее эта функция претерпела некоторые изменения, а потом еще и буквально вчера, получился плагин, с которым вы можете познакомиться ниже.
О плагине создания миниатюры на WordPress
Забегая вперед предупрежу, что после активации плагин ничего не делает, чтобы он начал работать нужно будет редактировать шаблон (вызывать функции в том месте, где необходимы миниатюры изображений).
Оформить скрипт в виде плагина, было необходимо, потому что для его работы нужна папка, куда будут создаваться (кэшироваться) копии изображений, а так же нужен был файл заглушка (картинка, если фотка в записи не найдена). А вообще, этот скрипт можно легко подключить через functions.php (если сами делаете шаболон(ы) будет полезно).
В целом, скрипт очень похож на timthumb.php, однако отличается и в чем-то лучше:
- Не нужно вручную создавать произвольное поле со ссылкой на картинку. Поле создается автоматически. Также скрипт понимает шоткод NextGen Gallery [singlepic данные];
- Работает немного быстрее timthumb.php (timthumb.php - универсальный скрипт и поэтому там много лишних операций-проверок данных);
- Ссылка на картинку будет выглядеть HTML валидно
/images/название файла.jpg, а не/functions.php?src=/images/название файла.jpg&w=100&h=100&q=80; - Кэш чиститься по необходимости. В timthumb.php кэш постоянно проверяется, старые файлы удаляются. На проверку уходят ресурсы (мелочь, но все же), которые думаю можно без болезненно сэкономить;
- Ресайзинг можно использовать в посте через шоткод;
- Гораздо удобнее использовать при интеграции в WordPress тему: не нужно получать значение произвольного поля, проверять существует ли поле, чтобы вывести картинку заглушку. Все это будет делаться автоматом.
Принцип работы Kama Thumbnail
Если в вызываемую функцию прямо не передана ссылка на картинку, и миниатюра вызывается из цикла WordPress, то сканируется контент на наличие картинки, если картинка найдена, то создается произвольное поле и её мини-копия.
В будущем, после того, как произвольно поле создано, контент сканироваться уже не будет, пока это поле существует.
Если в контенте картинка не найдена, также, создается произвольное поле со значением no_photo. Делается это для того, чтобы не сканировать постоянно контент на наличие в нем картинки (своего рода заглушка).
Установка
Ставиться все как обычно: копируем папку kama-thumbnail в каталог/wp_content/plugins и активируем плагин в админке. На вложенную папку thumb нужно поставить права на запись 777, а то миниатюры создаваться не смогут.
После установки необходимые функции плагина доступны в шаблоне.
Также можно установить "плагин" внедрением файла kama_thumbnail.php в файл шаблона functions.php, например, так: скопировать kama_thumbnail.php в папку с шаблоном и добавить такую строчку в ваш functions.php
include('kama_thumbnail.php');
После этого нужно будет открыть kama_thumbnail.php и определить там переменные:
- $kt_cache_folder – каталог куда будут создаваться миниатюры (нужны права доступа 777);
- $link_to_no_photo – ссылка на картинку-заглушку.
Скачать плагин
Использование
Доступные в шаблоне (теме) WordPress функции:
- kama_thumb_src($args) – возвращает ссылку на созданную миниатюру
- kama_thumb_img($args) – возвращает готовую картинку (img тег)
- kama_thumb_a_img($args) – возвращает ссылку-картинку. Ссылка ведет на оригинал картинки.
Параметры, передаваемые функциям:
- w – ширина миниатюры (обязательный)
- h – высота миниатуюры (обязательный)
- q – качество сжатия jpg (по умолчанию 80. макс.100)
- src – ссылка на оригинал картинки, который нужно уменьшить (обязателен для шоткода)
- alt – alt атрибут картинки
- class – class атрибут картинки
- no_stub – указываем, если не нужно выводить заглушку. Вместо нее будет возвращен пустой результат
- post_id - идентификатор поста. Его нужно передавать, когда функция вызывается не из Цикла WordPress (например, внутри какой-нибудь функции) или, когда переменная $post определяется неправильно (например, определяется картинка от другой записи или еще какие-нибудь глюки). Если передать этот параметр, то скрипт будет точно знать какой пост обрабатывать. Если этот параметр не передан, то будет обрабатываться пост, находящийся в текущий момент (когда вызывается функция) в переменной $post.
Примечание:
- Можно указать только ширину, тогда высота будет подобрана пропорционально уменьшенной копии. Так же, можно указать только высоту, ширина будет аналогично подобрана;
- src нужен для тех случаев, когда нужно получить/создать миниатюру, без использования произвольных полей (взять любую картинку и создать миниатюру к ней).
- Каталог с создаваемыми миниатюрами автоматически очищается каждые 3 дня. Проверка на необходимость очистки происходит, когда пользователь находится в админ-панели.
Шоткод
В посте можно использовать такой шоткод:
[thumb=ссылка на картинку w=Ширина h=высота alt=Текст class=CSSкласс q=качество]
Обязательные параметры: thumb и h или w.
Примеры создания миниатюр
Создаем миниатюру, произвольное поле и получаем ссылку на миниатюру
В шаблоне используем такой вызов функции:
<?php echo kama_thumb_src ('w=100 &h=80 &q=75'); ?>
вернет ссылку на миниатюру. Можно использовать, например, так:
<img src='<?php echo kama_thumb_src ('w=100 &h=80 &q=75'); ?>' alt='' />
Сразу получаем миниатюру
Внутрь цыкла WordPress, там где нужна миниатюра, вставляем такой код:
<?php echo kama_thumb_img('w=150 &h=100 &class=alignleft myimg &q=75'); ?>
В результате на месте этого кода появится:
<img src='ссылка на миниатюру' alt='' class='alignleft myimg' width='150' height='100' />
Чтобы картинка-заглушка не выводилась, если у записи нет картинок, то нужно определить параметр no_stub, вот пример:
<?php echo kama_thumb_img('w=150 &h=100 &no_stub'); ?>
Создаем миниатюру-ссылку на оригинал
Если нужно сделать миниатюру, как картинку, по клику на которую откроется большое изображение, то можно использовать такой код:
<?php echo kama_thumb_a_img('w=150 &h=100 &class=alignleft myimg &q=75'); ?>
выведет на экран:
<a href='ссылка на оригинал картинки'><img src='ссылка на миниатюру' alt='' class='alignleft myimg' width='150' height='100' /></a>
Получаем миниатюру по ссылке на картинку
Если нужно создать миниатюру на определенную картинку (не картинку из текста статьи), то можно передать параметр src, в котором указать ссылку на картинку, выглядит так:
<?php echo kama_thumb_img('src=http://домен/картинка.jpg &w=150 &h=100 &class=alignleft'); ?>
Параметр post_id
Чтобы точно определить для какого поста должна создаться миниатюра нужно определить параметр post_id. Этот параметр нужен, если встречаются глюки с переменной $post. Или если функция вызывается внутри другой функции. Если вызов происходит в Цикле WordPress, то этот параметр указывать не нужно!
<?php echo kama_thumb_img("w=150 &h=100 &post_id=идентификатор_поста"); ?>
Очистка кэша или произвольных полей:
Так как страницу настроек для плагина я не делал (возможно в будущем), то кэш картинок (каталог, куда записываются миниатюры) сбрасывается (очищается) со страницы плагинов. В описании плагина две сслыки: сброс кэша и удаление всех произвольных полей со ссылками на картинки.
Также, кэш можно сбросить, добавив в любой URL ?kt_clear_cache, а произвольные поля удалить, добавив ?kt_clear_customs. Например, если вы уже используете мой плагин: kama easy admin, то можно в нем использовать такую ссылку для очистки кэша картинок: http://домен/?kt_clear_cache. Сброс кэша работает, только для залогиненных пользователей, с правами админа.
Вроде все, если что-то забыл, дополню позже.
Если не понятно как использовать функции, в конкретных примерах, спрашивайте в комментариях, помогу! Заодно добавлю сюда парочку примеров.
Обновление
Версия 1.4.0 (11 апреля 2011)
Исправил получение ссылки на картинку, если картинка в тексте является анкором ссылки на оригинал (см. комментарий). Переработал код. Добавил автоматическую очистку каталога с миниатюрами, каждые 3 дня.
Версия 1.3.1 (11 ноября 2010)
Исправлен нюанс с ресайзом, теперь можно указывать размеры сторон у миниатюр больше чем у оригинала (до этого лишнее пространство заполнялось черным цветом).
Версия 1.3 (9 ноября 2010)
Немного изменен принцип создания миниатюр, теперь если исходный файл png, то миниатюра создается тоже png с сохранением прозрачного слоя. Спасибо Роману, который указал на эту ошибку и сподвиг на её исправление.
22 октября 2010
Добавил аргумент post_id. Исправлены некоторые ошибки и недоработки в коде. Изменил вывод на экран, теперь все функции просто возвращают результат, выводить на экран нужно через echo.
28 октября 2010 v1.2.5
Исправил ошибку с очисткой кеша.
- Предыдущие по меткам
- Предыдущие записи
- Сравнение СЕО плагинов platinum SEO Pack и All in One SEO Pack и отказ от них ← 24.Май.2010 // 77
- Произвольное меню в WP 3.0+ (wp_nav_menu) ← 16 Октябрь 2010 // 23
- Плагин для легкого управления сайтом на WordPress (версия 3) ← 30 Июль 2010 // 76
- Обзор WordPress 3.0. Что несет нам прогресс? ← 30 Июль 2010 // 4

как избавиться от ошибок в логах апача? на дню их создается по 50 штук. Это связано с тем что они через 3 дня удаляются с сервака чтобы не захламлять. но от ошибки ведь можно избавиться?
Не знаю, к сожалению.
Жаль. У вас они (ошибки) тоже создаются? или как вариант не удалять картинки? но что будет при 2500 записях?
А как сделать так чтобы в базу данных не писался абсолютный путь, а записывался относительный - ведь мы и так домен знаем. к чему лишние байты в базе.
Или это будет нагрузку дополнительную нести?
Относительный пусть тоже можно указывать вроде. Я сейчас точно не помню, почему сделал именно так, но вроде это не спроста... Но эти байты - это сущие пустяки ведь!
Привет.
Пользуюсь плагином кеширования. Как бы мне синхронизировать очистку миниатюр и сброс кэша?
Ведь когда срабатывает функция удаления миниатюр из вашего плагина:
private function clear(){ $folder = $_SERVER['DOCUMENT_ROOT'] . $this->cache_folder; $expire = @file_get_contents($folder.'/expire'); if(!$expire || (int)$expire < time() ){ file_put_contents($folder.'/expire', time()+3600*24*3); $this->clear_cache(); } return; }- через 3 дня - то кэш оставшийся от плагина выдает нам html с битыми картинками (все удалены)
в плагине кэширования есть строка url по которой сбрасывается кэш: site.ru/?reset если запрос произошел от админа (вроде 10 level).
Как мне дописать в функцию вашего плагина миниатюр - чтобы он входил по заданному url и очищал кэш?
Допиливаем код плагина таким кодом (можно добавить в конец, где хуки):
//принудительная очистка function clear_thumb_with_cache(){ $a = new kama_clear_thumb(); return $a->clear_cache(); } //цепляем очистку на переменную запроса reset if( isset($_GET['reset']) ) add_action('init', 'clear_thumb_with_cache' );Теперь по ссылке site.ru/?reset должен очищаться и кэш картинок.
Только возможно хук нужно будет использовать другой, не init, но это вряд ли.
Спасибо за ответ. Применил я эту функцию. Перевел системные часы на месяц - в папке с миниатюрами они удалились, а кэш остался на месте. Не сработал хук. куча битых ссылок заместо картинок.
ммм, ясно. Тогда еще этот хук в плагине нужно выключить:
add_action('admin_init', create_function($a, 'new kama_clear_thumb();') );Чтобы он очищал кэш картинок, только с очисткой кэша обычного и никак иначе.
Вот это было бы не желательно. Вообще думаю не выставить ли значение чтоб кэш картинок не очищался?(задать ему ооочень большое время хранения картинок-миниатюр). просто кеш веб страниц сбрасывается раз в сутки. За это время там накапливается 200-300 html страниц. а за сутки картинок создается 800-2000.
Скажи Тимур - вообще может что поломаться если кеш картинок не очищать? Я так понимаю - что просто они занимают место и все. Зато плагин создания миниатюр их не будет генерировать всякий раз, а это снижение нагрузки на сервер.
И еще вопрос - у тебя сейчас посещаемость -700ч в сутки. Ты используешь кеширование? плагины для этого или аналогичным скриптом кеширования?
Кэш чистить не нужно в целом, ты все правильно понял — занимает только место. Я сделал очистку, чтобы совсем старые картинки все-таки удалялись, если их уже не существует. Без очистки кэша плагин будет работать так же и нагрузки будет меньше...
Использую скрипт файлового кэширования sj object cache. Сдается мне, сейчас уже есть что-то лучше, пока не тревожит, поэтому не копаю в эту сторону...
WordPress 3.3.1 - плагин не работает (не создает миниатюры вообще)
Всё, разобрался: на сервере не работала библиотека GD2. Не плохо было бы прописать это в требованиях к плагину.
Не может такого быть - плагин самодостаточен. Хотя, проверю. Есть еще у кого-то такая проблема?