Проверка на заполнение атрибута alt у тега img

SEO-шники говорят что атрибут alt у тега img очень важен для поисковых роботов. Один из товарищей попросил написать на его сайт плагин, который на лету проверял бы наличие и заполнение атрибута ALT у всех изображений и не давал бы менеджеру сохранить ресурс если хоть 1 изображение без атрибута alt (не важно пустой он или его вообще нет).

____________________________________________________________________________________________

Внимание!


Сниппет превратился в пакет с более широкими возможностями и некоторыми багфиксами:
modstore.pro/packages/content/althelper
____________________________________________________________________________________________

Вчера вечером я не смог решить проблему «вечного сохранения» ресурса, такая конструкция почему-то не понравилась MODX'у.

$modx->resource->getContent();

Посему как временное решение я написал плагин на событие OnLoadWebDocument, который подставлял в атрибут alt название ресурса. Однако это оказалось плохим решением для SEO, одинаковое значение в атрибуте alt негативно воспринимают роботы. Сегодня @Евгений Webinmd подсказал мне как решить мою «вечернюю проблему» и я написал небольшой плагин, который, надеюсь, сделает многим сеошникам и контент-менеджерам работающим на MODX хорошо:

switch ($modx->event->name) {
    case 'OnBeforeDocFormSave':

        $content = $resource->getContent();
        if (!empty($content)) {

            $imgs = array();
            $img = '~<img[^>]+>~i';

            if (!empty(preg_match_all($img, $content, $imgs, PREG_PATTERN_ORDER))) {

                foreach ($imgs[0] as $img) {
                    $alt = preg_match('~alt="(.*?)"~u', $img, $alts);

                    if (empty($alts[0])) {
                        $modx->event->output("Сохранение не удалось. Не у всех изображений указан тег Alt.");
                        return;
                    } else {
                        if ($alts[0] == 'alt=""') {
                            $modx->event->output("Сохранение не удалось. Не у всех изображений заполнен тег Alt.");
                            return;
                        } else {
                            $img = preg_replace('~alt="(.*?)"~u', '<img$1 alt="' . $alts[1] . '" title="' . $alts[1] . '" $5 ', $img);
                            $images[] = $img;
                        }
                    }
                }
            }

            $imgCount = count($images);

            for ($i = 0; $i < $imgCount; $i++) {
                $content = str_replace($imgs[0][$i], $images[$i], $content);
            }

            $resource->set('content', $content);
            $resource->save();

        }

        break;
}

Отдельно отмечу что я добавил автоматическое дублирование значения атрибута alt в атрибут title. Т.е. он создается автоматически и уже заполненный, мелочь но приятно. :-)

Тестируйте, отписывайтесь что и как.
iWatchYouFromAfar
01 апреля 2019, 20:57
modx.pro
12
6 406
+13
Поблагодарить автора Отправить деньги

Комментарии: 10

UDAV
01 апреля 2019, 21:15
0
Наверно лучше не делать так, пусть сохраняют ресурс. Сделай лучше чтоб в alt попадал pagetitle и все.
    iWatchYouFromAfar
    01 апреля 2019, 21:22
    0
    Почитай статью, я написал почему такой вариант не подошел. Как пример, представь сайт который по госту должен иметь версию для слабовидящих. На таких версиях дают возможность отключать изображения и посетитель вместо изображений будет видеть alt. По твоей логике получится везде одинаковые названия изображений.

    Я уже молчу про SEO, они за такое по рукам бить будут.

    P.S.
    Раз тебе не нужно сбрасывать процесс сохранения, то ты можешь изменить скрипт. Там где проверяется alt на пустоту, вместо $alts[1] подставляй что угодно.
    g0dzilla
    02 апреля 2019, 13:25
    1
    +2
    Image SEO alt and title tags

    Не самое «быстрое» решение (в плане, плагин обрабатывает каждый вывод), зато самый надежный, если сайт небольшой. Добавляет alt и title ко всем картинкам, и не просто из title страницы, а ищет ближайшие к нему h1/h2/h3 и т.д. В настройках можно это поменять. Я его еще немного допилил для себя, что бы не добавлял альты к определенным директориям.
      iWatchYouFromAfar
      02 апреля 2019, 13:32
      +1
      Тоже вариант, но далеко не факт что alt должен содержать название заголовка. Alt отображает текстовую информацию о рисунке при отключенной в браузере загрузке изображений. Да и как там роботы воспринимают alt я не знаю. Может для них как раз важно что в alt будет вписан заголовок…

      И вообще, это работа менеджера сайта, писать хороший контент правильно. Так что я, например, свое решение установил и себе на сайты, дабы не забывать про alt.
        g0dzilla
        02 апреля 2019, 15:32
        0
        С одной стороны вы правы, на 100%, с другой стороны в спешке не всегда этот альт прописывают менеджеры, а если и прописывают — то полную хрень. В добавок, есть картинки и не из контента (которые вставляет вебмастер) и не всегда можно отследить эти косяки. Можно конечно же допилить подобный плагин и хранить отдельно варнинги о наличии пустых альтов в img в отдельно в таблице…
          iWatchYouFromAfar
          02 апреля 2019, 15:39
          0
          По этой причине я и написал этот плагин. Менеджеры могут забыть указать альт, но плагин им об этом напомнит и они пройдутся еще раз по всем изображениям и проверят их заполненность. Это их работа, а если уж они пишут там полную хрень, то это вопросы не к плагинам или сниппетам, а к менеджеру сайта. :) На картинки не из контента плагин не обращает внимания, т.к. большинство сайтов работают именно с полем content.

          Применив должную фантазию и совсем немного строк кода, можно прописать любую логику в этом плагине и не только в поле content. Это минимум функционала, что-то типа базовой функции. Ну а дальше этот сниппет можно развивать и даже собрать из него дополнение.

          Может быть так и произойдет, если найду причины его расширения.
      Алексей Шумаев
      02 сентября 2019, 17:33
      +1
      Спасибо за компонент!
      Обнаружена ошибка при сохранении ресурса:
      PHP message: PHP Fatal error:  Uncaught Error: Call to a member function get() on null in /home/s/www/core/cache/includes/elements/modplugin/34.include.cache.php:65
        iWatchYouFromAfar
        02 сентября 2019, 18:16
        +1
        Впервые встречаю такую ошибку в моем компоненте. Если есть возможность выдать мне доступы, чтобы я посмотрел, пиши в личку или в телеге.

        t.me/iWatchYouFromAfar

        P.S.
        Компонент работает только с типом содержимого HTML — чей идентификатор 1 (по умолчанию). Но тут скорее всего дело в другом.
          iWatchYouFromAfar
          03 сентября 2019, 12:57
          0
          Спасибо за фидбэк, поправил.
          newbmod
          25 декабря 2023, 18:30
          0
          Спасибо за дополнение altHelper!
          Заметил такую ошибку при выставлении уровня althelper_alt_from_title.
          Если в содержании вставляется не путь к изображению а изображение из ms2gallery, к примеру
          <img class="img-responsive" src="[[+ms2g.0.url]]" alt="" />
          то тег alt заполняется, а вот само изображение пропадает. Видимо что-то с рендером страницы при наличии MODX-овских выражений
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10