Плагин «AutoAlt» — автоматические alt-ы изображений

Уважаемые коллеги,

Пользователи вашего сайта всегда заполняют описание (alt) изображений в создаваемых топиках? А вы сами — всегда? Но по идее это важно, из соображений доступности для людей с ограниченными возможностями, и для поисковой оптимизации.

Поэтому вам может оказаться полезным плагин AutoAlt, который заполняет пустые alt-аттрибуты на изображениях топика автоматически (при сохранении топика).



Плагин написан для и используется на сайте ММОзговед. Отправной точкой в создании плагина стал фрагмент TopicExtend, который был значительно переработан для работы с названием блога.

Работает по следующему сценарию:

  • Если alt-а нет или он пустой, то создаёт его со значением «Название блога: Название топика».
  • Если alt есть и не содержит название блога, то добавляет «Название блога: Существующий ALT». Иначе alt не изменяется.

В config/config.php можно отключить добавление названия блога (тогда берётся только название топика).

Изменение производится при сохранении топика — т.е. чтобы увидеть его на существующих топиках, их необходимо пересохранить. Фотосеты не затрагиваются данным плагином.

Исходный код доступен на GitHub (только надо переименовать папку с плагином в autoalt, если будете качать его оттуда до прохождения модерации).

Дайте знать, если встретятся какие-либо проблемы.

PS Аватар сгенерен забавным сервисом RoboHash по тексту “AutoAlt LS plugin”. Не всегда же быть серьёзными! :)

68 комментариев

avatar
А если в топике будет много изображений, они все получат одинаковые названия?
  • ARM
  • 0
avatar
Если у них нет своих альтов — то да, «Блог: Топик». По сути, это в руках автора.

У вас есть идеи, как это можно разнообразить? Добавлять просто нумерацию не очень осмысленно, по-моему :)
avatar
безусловно +
НО зачем название блога в альт? недостаточно название топика?
avatar
Настраивается в конфиге плагина, название блога можно отключить.

В нашем случае название блога — одно из важных ключевых слов ресурса (заметки пишутся о разных играх, блог — это игра, и поиском люди больше приходят на игру, а не название отдельной новости), поэтому нам полезно его акцентировать и на изображениях тоже. Так решили, так я и сделал :)
avatar
А теги еще можно вписать?
avatar
Неплохая идея, может кому-то действительно пригодится. Можно будет включить в следующей версии :)

А какой формат ожидается? «Название блога: Заголовок заметки (тег1, тег2, тег3)», примерно так?
avatar
«Название блога: Заголовок заметки — тег1, тег2, тег3» — так лучше.
avatar
Вариант. Спасибо за идею, посмотрю на это, когда будет возможность!
avatar
Было бы лучше пустить теги по кругу. То есть в alt первого изображения — первый тег, второго изображения — второй тег и т.д. Если тегов всего 2, а изображения 3, то на третьем использовать первый тег и т.д.
avatar
Так же хотел бы теги в альты, любая реализация
avatar
Хороший и нужный плагин. Правда, все это может каждый за пару минут сам реализовать сразу в движке :) А вообще, у меня какое-то странное чувство, что идеи плагинов начинают высасывать из пальца.
  • aex
  • 0
avatar
aex , я как раз тот человек который две недели уговаривал ребят это сделать, и отрывал их ради этого от более важного. Поэтому мне ваша реплика насчёт «высасывать из пальца» немного обидна. Нам это было действительно нужно. И я был бы страшно рад если бы LS поддерживал это изначально, но чего нет — того нет. И, да, это наверняка не самая сложная штука (хотя, про две минуты — это вы зря ), что вовсе не умоляет её полезности.
avatar
Извини, не хотел обидеть. Просто мне уже самому даже трудно придумать новую идею плагина, которой бы еще кто-то, где-то не реализовал.
avatar
Странно мне это :). У нас длинный список того, что приходиться делать с нуля. Начиная вот с таких, как этот плагин, мелочей… Не так уж много модулей у LS, на самом деле. Хотеось бы больше. Раз в 10 :)
avatar
Посмотри у других движков, например у Друпала. Там их тысячи этих плагинов. Для всех движков идеи плагинов однотипны. Немного адаптировать их под ЛС и вуаля :)
avatar
Насчёт «немного адаптировать» это вы опять преуменьшаете, всё же. Но идеи черпать можно, это да…
avatar
А уже есть где-то? Я только в TopicExtend нашёл (о котором пишу в описании плагина, потому что действительно код Фальконов помог разобраться с тем, как это делать), но он тоже не совсем подходил (и не поддерживает последнюю LS, и там много — для нас, — лишнего), поэтому доделал и упаковал как плагин.

Если дупликат — то наверное не пройдёт модерацию :) Хотя в любом случае было полезно его сделать, хороший опыт.
avatar
Чего не пройдет? Плагин полезный и многим даже нужный. Главное, чтобы не глючил и с другими уживался. А насчет дубликата… Так придумать новую идею для плагина это сложно, и кто это может, тому большой респект :)
avatar
я бы рекомендовал не делать
$oTopic->setTextSource($sText);

исходник должен быть исходником.
avatar
Спасибо за рекомендацию, но я не вижу альтернатив. Если есть — посоветуйте, пожалуйста. Как можно изменить атрибут тега в исходном тексте топика? Тут ещё удобно, что автор потом мог ещё пересмотреть и поменять, если его не устроит результат.

В плагине TopicExtend так же написано, правда может быть с тех пор появились более безопасные методы?
avatar
можно подойти к решению задачи по-другому: просто подставлять альт прямо в окне загрузки изображений. автоматически
avatar
С точки зрения чистоты кода, я с вами соглашусь, а вот с точки зрения постановки задачи — нет. Нам нужно чтобы alt гарантированно был, а чтобы в нем гарантировано фигурировало название блога. Всегда. Если подмена alt происходит в момент сохранения поста — это гарантируется, если в момент загрузки картинки — то нет, ибо автор может подправить. Чуть-чуть не честно по отношению к автору, но… :)
avatar
Может можно как-то реализовать замену «на лету»? У меня получилось с помощью джевикса сделать редирект ссылки. То есть в базе ссылки выглядят как обычно, а при сохранении статьи заменяются на мой редирект. Сейчас хочу прописать ссылки к картинкам, чтобы тоже добавляло на лету. Но у меня затык в получении данных поля topic_extra (ссылки там хранятся).
avatar
Хм, хотя, может оно и не надо. Потестирую. Ещё раз спасибо!
avatar
Проверил, именно это и сохраняет нужные изменения в топик :) Так что нужен альтернативный вызов — или придётся оставить так.
avatar
если нужно чтобы автор топика могу отредактировать, то тогда это, наверное, лучший вариант.
avatar
Отправной точкой в создании плагина стал фрагмент TopicExtend, который был значительно переработан для работы с названием блога.
Можно детальней об этом. Чем отличается от TopicExtend
avatar
Спасибо за полезный плагин!

Отличия — всё, кроме работы с alt-ом, убрано. Сами же alt-ы, вместо подстановки одного значения атрибута для всех изображений заметки, анализируются, и обрабатываются на предмет а) наличия (если непустой альт уже есть, то добавляется только название блога — исходный текст альта не теряется, давая возможность автору его редактировать), и б) наличия в них названия блога (если в альте уже есть название блога, то очевидно, что автор сделал всё нужное с альтом, и он тогда оставляется как есть).
avatar
по моему в TopicExtend если alt уже есть, тогда туда уже ничего не добавляется. очевидно, что автор лучше знает, что должно быть в alt
avatar
TopicExtend не совместим с LS 1.0.1 (что очень, к слову, жаль). И он никак не учитывает название блога, а это и есть краеугольный камень в нашем случае. Независимо от желания автора :)
avatar
это 100% инфа? по идее должен работать
даже если не совместим, то проще было допилить адаптацию и отправить pull request

И он никак не учитывает название блога, а это и есть краеугольный камень в нашем случае. Независимо от желания автора :)
это поведение достаточно легко расширить или изменить :)
и тоже можно отправить pull request
avatar
Можно было, если бы стояла задача использовать TopicExtend. Но у меня была конкретная и другая задача. Поэтому, чем разбираться с чужим устаревшим кодом, дающим четыре ненужных нам (но полезных в целом) фичи из пяти, мы посмотрели, как сделано у вас, и написали логику, требуемую нам.

Я буду только рад, если вы эту логику ретрофитнете в свой плагин, чтобы расширить его возможности работы с альтами — от этого всем будет только польза. GNU — дружелюбная лицензия :)
avatar
Ну, вообще судя по этому коду из TopicExtend, там находятся все картинки, у них убираются альты и тайтлы, и потом во все них вставляется свой альт и тайтл (если я верно всё понимаю):

protected function _addImageParam($sText, $sInsert) {
        $sTextNew = '';
        $patternImg = "(<img([^<>+]*)>)";
        if (preg_match_all($patternImg, $sText, $aMathces)) {
            $aMathcesImg = $aMathces[0];
            $iLast = count($aMathcesImg) - 1;
            foreach ($aMathcesImg as $key => $sImg) {
                $sImgNew = preg_replace('/alt.?=[^".]?".*?"/', '', $sImg);
                $sImgNew = preg_replace('/title.?=[^".]?".*?"/', '', $sImgNew);
                $sText = str_replace($sImg, $sImgNew, $sText);
                $aMathcesImg[$key] = $sImgNew;
            }
            $sImgFirst = preg_replace('/\/?>/', $sInsert . ' />', $aMathcesImg[0]);
            $sText = str_replace($aMathcesImg[0], $sImgFirst, $sText);
            $sImgLast = preg_replace('/\/?>/', $sInsert . ' />', $aMathcesImg[$iLast]);
            $sText = str_replace($aMathcesImg[$iLast], $sImgLast, $sText);
            $sTextNew = $sText;
        }
        return $sTextNew;
    }


Моим задачам такой метод массового поражения не подходит, пришлось переписать поиск и замену для более тонкой работы с альтами (и без тайтлов) — можете посмотреть в GitHub.
avatar
проверил на Кукораме — обрабатываются только те картинки у которых вобще нет аттрибутов. т.е. все ок.
нужно проверить этот момент на сборке с гитхаба.
avatar
autoalt ломает autocut
livestreetcms.com/addons/view/171/

Автор помоги исправить, плиз!
avatar
Спасибо за оповещение! Разобрался: AutoAlt после подстановки альтов в изображения применяет стандартный Text_Cut() (чтобы получить обновлённые тизер и боди), и поэтому кастомный кат из AutoCut попросту теряется.

Пока предлагаю такое решение — в AutoAlt проверять наличие класса PluginAutocut, и если он есть, то вызывать его метод для построения тизера и боди. Это не очень эффективно в том смысле, что AutoCut вызывается два раза, но я пока не вижу способа этого не делать. Можно в нём продублировать такой же код, и вообще не делать AutoCut если присутствует PluginAutoalt, но это уже автору AutoCut-а решать, надо ли оно там.

Вот соответствующий коммит на GitHub-е (по нему можешь понять, что и где менять), и сейчас перезалью обновлённый плагин в каталог (но он, наверное, снова модерацию будет проходить некоторое время).
avatar
Огромное спасибо. Логичнее всего будет объединить их в один. Так ?!
avatar
На самом деле авто-кат не мешало бы в сам движок встроить, важная штука ведь :) А мой AutoAlt — уже по желанию.

Но и объединить можно, при согласии обеих сторон, тогда можно будет продумать и прописать логику, по которой cut будет применяться в разных местах кода, в зависимости от настроек обоих функциональностей. Чуть поморочиться придётся, но в целом реально.
avatar
и кто может сделать AutoTags (все слова(длинной больше 3х) из названия топика через запятую) ?! :)
avatar
По идее, кто угодно может сделать, но по-моему это слишком уж брутальный подход — много мусора в тегах получится (глаголы всякие, прилагательные и т.п.).
avatar
согласен полностью, но во мне борется «вообще без тэгов» и «хоть какие тэги»
побеждают хоть какие нибудь, причем из мусора будет и пару нормальных, по которым потом смогут найти статью.
avatar
Спорно. Я пока не возьмусь делать плагин для идеи, с которой не совсем согласен, извини.

PS Но подумать можно :) Может какая идея и зародится. Как вариант — предлагать автору теги, чтобы он из них составил что-то разумное, если хватит внимания к таким деталям. Но сейчас форсировать «непустой» тег работает лучше, чем заполнить чем угодно — большинство людей могут тогда вообще игнорировать это поле. Обычно проблема найти инфу на большом сайте заключается не в недостатке данных, а в их избытке, поэтому служить генератором хаоса не хотелось бы.
avatar
$tag = random( $allWordsFromSite );
вот такой генератор будет круто ))))
avatar
А как вообще получилось что заметка в LS без тегов? нельзя же без тегов создать.
avatar
Учи матчасть. Чего это низя? :)

$config['module']['topic']['allow_empty_tags'] = true; // Разрешать или нет не заполнять теги
avatar
Понятно. Не понятно только зачем разрешать.
avatar
Шоб юзеры не парились. На некоторых сайтах для блондинок, у меня вообще в топиках есть только поля Название, Текст и одна кнопочка Опубликовать :)
avatar
Поскажите, можно ли «проALT-ить» этим плагином (или как-то по-другому) уже написанные посты?
avatar
Пока такого не делали, предпочли пересохранить руками на нашем сайте — всё надёжней, чем отдельный кусок кода писать для одноразовой (хотя и большой) операции.
avatar
400 статей пересохранили руками. Нудная работа, конечно, и часа 3 отняло. Зато выловили благодаря этому мелкий баг (который уже исправлен в версии плагина 1.1)
avatar
Доброго дня! Спасибо за плагин, начали тестировать. Столкнулись с одной неприятной особенностью — если при загрузки картинки прописываешь теги, то эти теги и подставляются в алт. А потом после сохранения топика алт выглядит таким образом — блог: теги. Как можно исправить, что бы при загрузки картинки с тегами алт не подставлялся?
avatar
Добрый день! Может, я что-то упускаю, но я не вижу возможность прописать теги в диалоге загрузки картики, а теги заметки не влияют на альт. Можете подробней объяснить, что вы делаете, пожалуйста?
avatar
Загружаю картинку с тегами.
<img src="http://***.ru/uploads/images/00/00/02/2013/03/22/df73fc.jpg"  title="Пепси, Кока, Кола, Pepsi, Coca, Cola, стоимость"  alt="Пепси, Кока, Кола, Pepsi, Coca, Cola, стоимость" />


Эти алты берутся из тегов, а когда обрабатываются Вашим плагином, то к ним подставляется название блога и все. Можно сделать так, что бы Алты по любому переписывались названием топика, независимо от наличия в них текста?
avatar
Насколько я понимаю Ваше описание, поведение в точности соответствует заявленному: «Если alt есть и не содержит название блога, то добавляет «Название блога: Существующий ALT». Иначе alt не изменяется.»

А то что хотите вы — новая функциональность.
avatar
Вы эти теги, судя по всему, вводите в описание картинки?

Тогда это не теги, с точки зрения кода, а просто описание. LS его использует в качестве альта и без моего плагина, и я не имею права не использовать описание в альте — ведь это решение создателя заметки.
avatar
Можно ли сделать так, что бы алт заполнялся обязательно, при публикации топика, независимо от наличия в нем текста?
avatar
Или так нельзя делать?
avatar
В описании плагина написано “Если alt-а нет или он пустой, то создаёт его со значением «Название блога: Название топика».”

То есть альт уже заполняется обязательно. Я, честно говоря, не могу понять, с чем у вас затруднение. Вы пробовали это делать? Или спрашиваете заранее?
avatar
Ок. Попробую объяснить проще. Мы загружаем картинку, к ней пишем описание, которое при загрузке подставляется не только в тайтл, но и в альт. Ваш плагин создает такую запись «блог: тайтл». И нам приходится руками вычищать альт, что бы Ваш плагин вставил в нее альт в в виде «блог: топик».
Как сделать так, что бы независимо от наличия текста в альт подставлялся «блог: топик»?
avatar
Ага, понял. С точки зрения SEO (как я её понимаю) это не очень полезно, но в принципе такую фичу можно добавить, через флажок в настройках, это нетрудно.

Я постараюсь на следующей неделе посмотреть.
avatar
Почему не полезно?

Может я не все понимаю, но альт — это текст, который показывается в браузерах без поддержки картинок. Мне кажется, что более выгодным будет показ названия топика, чем набор тегов, ибо картинки и текст у Яндекса индексируются по-разному.

Это мое представление, оно может быть неправильным. Поправьте, плиз.
avatar
Даже с точки зрения пользователя — если картинка не показывается, то лучше вывести её описание, чем повторять один и тот же заголовок заметки для каждой картинки.

Так же и для поискового движка (тут я не знаком с тем, как именно Яндекс с этим работает) — лучше конкретное описание картинки (которое, надеюсь, как-то относится к теме заметки и т.п.), чем повторение одного и того же заголовка в разных ипостасях. По идее, за такие бездумные повторения надо бы наказывать, и если Яндекс этого ещё не делает — то рано или поздно научится.

Дополню, что режим «если нет описания — в альте будет заголовок заметки» я добавил как вынужденную меру. На самом деле предпочтительнее всегда иметь описания.
avatar
Де факто ALT заполняется для поисковых движков, потому что они используют ALT как текстовое описание картинки, то бишь анкор. А значит, с точки зрения SEO, он должен содержать не красивый текст а ключевые слова. Предполагается что коль уж автор заполнил Title, то там более осмысленное что-то чем просто заголовок топика, который будет одним и тем же для всех картинок в нём.
avatar
Эм… Вы полагаете, что для Яши будет лучше, если альт картинки будет совпадать с тайтл? Насколько я знаю, картинки обрабатываются отдельно от текста и логичнее было бы внедрить в альт название топика, чем набор тегов.
Это мои размышления, все может быть наоборот… ;)
avatar
Добрый день! Хотелось бы узнать, будут ли изменения в плагине?
avatar
Я же говорил, что на этой неделе посмотрю. Посмотрел, сделал, выложил новую версию в каталог (будет доступна после модерации), и залил на GitHub.

Эта логика (игнорировать исходный ALT изображения) включится, если вы проставите true для параметра $config['ignore_description'] в файле config.php плагина.

Надеюсь, вам это будет полезно. По умолчанию эта логика, естественно, отключена.
avatar
Премного благодарен! Именно так, как мы хотели!
avatar
О, хорошо, рад, что смог помочь :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.