Заметки

Генерация alt-текста нейросетью для WooCommerce

M
Markabus
·15 августа 2026 г.
Монитор с сеткой миниатюр фотографий товаров интернет-магазина и полями подписей под ними, перед экраном на столе стоит замшевый ботинок с той же карточки, рядом фотоаппарат и клавиатура

В каталоге на пару тысяч товаров у большинства картинок alt-текст либо пустой, либо содержит остатки имени файла вроде IMG_20240117_final2.jpg. Руками это не чинится: даже по десять секунд на изображение — это неделя работы. Зато задача идеально ложится на модель, которая умеет смотреть на картинку: она видит товар, знает название из карточки и выдаёт короткое описание. Разберём, что вообще должно быть в alt, где WordPress его хранит, как прогнать через нейросеть весь каталог и сколько это стоит.

Зачем магазину alt-текст

Атрибут alt у тега <img> решает три задачи сразу.

Доступность. Скринридер — программа, которая читает страницу вслух незрячему пользователю, — вместо картинки произносит содержимое alt. Если атрибута нет, читалка проговорит имя файла: «и-эм-джи двадцать двадцать четыре ноль один семнадцать точка джей-пи-джи». Пользователь просто не поймёт, что перед ним. Требование зафиксировано в WCAG (критерий 1.1.1 «Non-text Content») и в России отражено в ГОСТ Р 52872 для сайтов, которые обязаны быть доступными.

Поиск. Картиночная выдача Яндекса и Google — заметный источник трафика для магазинов: человек ищет «ботинки челси коричневая замша», видит фото, переходит в карточку. Alt — один из немногих сигналов, по которым робот понимает, что изображено.

Запасной вариант. Если файл не загрузился или у посетителя отключены изображения, браузер покажет текст из alt.

Отдельно про WooCommerce: движок берёт alt из вложения (attachment) и подставляет его и в галерею товара, и в миниатюры каталога, и в блоки «похожие товары». То есть заполнили один раз у изображения — получили корректный alt везде, где эта картинка используется.

Что должно быть в alt, а что нет

W3C предлагает простое дерево решений. Изображение информативное (фото товара) — короткое описание сути. Декоративное (разделитель, фоновый узор, иконка рядом с уже написанным текстом) — пустой атрибут alt="", чтобы скринридер его пропустил; удалять атрибут целиком нельзя, это не то же самое. Функциональное (картинка-ссылка, кнопка) — описываем действие, а не картинку: «Перейти в корзину», а не «иконка тележки».

Практические рамки для магазина:

  • До ~125 символов. Формального лимита в стандарте нет, но многие скринридеры и SEO-аудиты ориентируются на эту величину.
  • Описываем то, что видно: тип товара, цвет, материал, ракурс, фон. «Коричневые замшевые ботинки челси, вид сбоку на белом фоне» — хорошо.
  • Без «фото», «изображение», «картинка» в начале — скринридер и так объявляет, что это графика.
  • Без набивки ключевыми словами. Перечисление «ботинки купить недорого Москва доставка» поисковик засчитает как спам, а пользователю читалка это озвучит целиком.
  • Не дублируем заголовок карточки. Если alt слово в слово повторяет <h1>, пользы ноль.
  • Разные ракурсы — разный текст. У пяти фото одного товара не должно быть пяти одинаковых alt.

Где WordPress хранит alt

Alt-текст живёт не в самом файле и не в таблице wp_posts, а в метаполе вложения с ключом _wp_attachment_image_alt. Функция wp_get_attachment_image() достаёт его через get_post_meta(), чистит от тегов и подставляет в разметку. Значит, записать сгенерированный текст можно одной строкой:

update_post_meta( $attachment_id, '_wp_attachment_image_alt', $alt );

Никаких плагинов для самой записи не нужно — это ядро WordPress. Найти изображения без alt тоже несложно:

$ids = get_posts( [
  'post_type'      => 'attachment',
  'post_mime_type' => 'image',
  'posts_per_page' => 50,
  'fields'         => 'ids',
  'meta_query'     => [
    'relation' => 'OR',
    [ 'key' => '_wp_attachment_image_alt', 'compare' => 'NOT EXISTS' ],
    [ 'key' => '_wp_attachment_image_alt', 'value' => '', 'compare' => '=' ],
  ],
] );

Путь первый: готовый плагин

Если задача разовая и лезть в код не хочется, в репозитории WordPress есть плагины, которые делают ровно это: перехватывают загрузку нового изображения, отправляют его в облачную модель и записывают ответ в то же метаполе. Из заметных — Alt Text AI: он умеет массовую обработку существующей библиотеки, поддерживает больше сотни языков, дружит с WPML и Polylang и отдельно учитывает название товара WooCommerce при генерации.

Плюсы очевидны: пять минут на установку, кнопка «сгенерировать всё». Минусы тоже: почти все такие плагины работают по кредитам — вы платите не провайдеру модели, а посреднику, и цена за изображение выходит заметно выше себестоимости. Плюс промпт вы не контролируете: если нужен свой тон или строгий шаблон вида «товар + цвет + материал», подстроиться получится не всегда.

Хороший критерий: до пары тысяч картинок и без особых требований к формулировкам — берите плагин. Каталог больше, регулярный поток новых товаров или нужен свой формат — пишите свой скрипт.

Путь второй: свой скрипт на API

Схема простая. Берём ID вложения → отдаём файл в мультимодальную модель вместе с названием и категорией товара → получаем строку → пишем в _wp_attachment_image_alt.

Подойдёт любая модель с поддержкой картинок на входе: Gemini (Flash-Lite — самый дешёвый вариант), Claude Haiku, младшие модели OpenAI. Если ещё не получали ключ, у нас есть пошаговая инструкция — Gemini API: как получить ключ и сделать первый запрос. Запрос — обычный POST с картинкой в base64 и текстовой инструкцией.

Ключевая часть — промпт. Он должен быть жёстким, иначе модель начнёт сочинять маркетинговые описания на три предложения:

Ты пишешь alt-текст для фотографии товара интернет-магазина.
Название товара: "{product_name}". Категория: "{category}".

Правила:
- одно предложение, максимум 120 символов;
- опиши только то, что реально видно на фото: тип предмета,
  цвет, материал, ракурс, фон;
- не начинай со слов "фото", "изображение", "на картинке";
- не придумывай характеристики, которых не видно;
- не перечисляй ключевые слова, пиши естественной фразой;
- язык — русский;
- верни ТОЛЬКО текст alt, без кавычек и пояснений.

Чтобы ответ гарантированно приходил в предсказуемом виде, удобно попросить JSON — про это подробнее в заметке Структурированный вывод (JSON) от модели. И обязательно обрежьте результат по длине на своей стороне: модель периодически игнорирует лимит символов.

Прогон каталога пачками

Тысячу запросов в один проход веб-страницы не сделать — упрётесь в таймаут PHP. Варианты:

  • WP-CLI. Своя команда wp alt generate --limit=200, запускаемая по SSH. Самый простой способ для разовой миграции.
  • Action Scheduler. Библиотека уже входит в WooCommerce: ставим по задаче на изображение, очередь разгребается фоном сама. Тот же приём мы описывали в заметке про описания товаров нейросетью.
  • Хук загрузки. add_action( 'add_attachment', ... ) — чтобы новые картинки получали alt автоматически.

Три вещи, которые сэкономят нервы: перед отправкой уменьшайте изображение до ~1024 px по длинной стороне (детали для alt не нужны, а токенов уходит кратно меньше), делайте процесс идемпотентным — пропускайте вложения, у которых alt уже заполнен, и ставьте свою метку вроде _alt_generated_by, чтобы потом отличить машинный текст от ручного и при желании перегенерировать.

Сколько это стоит

Считаем по самой дешёвой связке. У Gemini 3.1 Flash-Lite вход стоит $0,25 за миллион токенов, выход — $1,50. Одна сжатая фотография плюс промпт — примерно полторы тысячи входных токенов, ответ — около 60. На тысяче изображений выходит порядка 1,5 млн входных и 60 тыс. выходных токенов, то есть меньше половины доллара за весь каталог. У Claude Haiku 4.5 ($1 и $5 за миллион) та же тысяча обойдётся примерно в полтора-два доллара.

Цифры ориентировочные: реальный расход зависит от разрешения картинок и текущих тарифов, их стоит проверить в прайсе провайдера перед запуском. Но порядок понятен — по сравнению с кредитными тарифами плагинов разница в разы. Как считать токены аккуратнее, разбирали в заметке Токены и лимиты: как считать и экономить.

Типичные ошибки

Публиковать без выборочной проверки. Модель видит картинку, но не знает вашу номенклатуру: замшу назовёт нубуком, оттенок «марсала» — красным. Прогоните глазами хотя бы полсотни случайных результатов перед тем, как отпускать скрипт на весь каталог.

Генерировать alt для декоративной графики. Иконкам, разделителям и фоновым паттернам нужен пустой alt. Ограничьте выборку изображениями, привязанными к товарам.

Заполнять заодно title и caption тем же текстом. Это разные поля с разным назначением; дубли только мешают.

Забывать про вес картинок. Идеальный alt не спасёт карточку, которая грузится восемь секунд. Сжатие, WebP/AVIF и ленивая загрузка — отдельная работа, о ней в чек-листе Как ускорить WordPress в 2026.

Коротко

Alt-текст — та редкая рутина, где нейросеть закрывает задачу почти полностью: она реально видит картинку и описывает её лучше, чем менеджер, копирующий название товара во все пять фото. WordPress хранит alt в метаполе _wp_attachment_image_alt, так что техническая часть сводится к одному update_post_meta(). Небольшому магазину хватит плагина, большому дешевле собрать свой скрипт на API с жёстким промптом и фоновой очередью. Главное — оставить человека на выборочной проверке: alt читают живые люди, и ошибка в описании товара стоит дороже сэкономленных минут. Как встроить это в общий контур работы с контентом, смотрите в заметке Автоматизация контента нейросетями.

Частые вопросы

Q.Нужен ли alt-текст каждому изображению в магазине?

Нет. Информативным картинкам — фото товаров, схемам, скриншотам — alt нужен обязательно. Декоративной графике (разделители, фоновые узоры, иконки рядом с уже написанным текстом) нужен пустой атрибут alt="": так скринридер её пропустит. Полностью удалять атрибут нельзя — это не то же самое, что пустой.

Q.Какой длины должен быть alt-текст для карточки товара?

Формального лимита в WCAG нет, но на практике ориентируются на 125 символов: более длинные строки некоторые скринридеры обрезают, да и SEO-аудиты помечают их как проблему. Для фото товара обычно хватает одного предложения: тип предмета, цвет, материал, ракурс, фон.

Q.Сколько стоит прогнать через нейросеть тысячу изображений?

На самых дешёвых мультимодальных моделях — меньше доллара. Например, у Gemini 3.1 Flash-Lite вход стоит $0,25 за миллион токенов; сжатая фотография с промптом — около полутора тысяч токенов, то есть тысяча картинок укладывается примерно в 1,5 млн входных токенов. У Claude Haiku 4.5 та же тысяча выйдет в полтора-два доллара. Цифры ориентировочные — сверяйтесь с актуальным прайсом.

Q.Плагин или свой скрипт?

До пары тысяч изображений и без особых требований к формулировкам проще поставить плагин вроде Alt Text AI: пять минут на настройку и кнопка массовой генерации. Если каталог больше, товары добавляются потоком или нужен свой строгий шаблон текста, дешевле и гибче написать свой скрипт на API с очередью на Action Scheduler.

Источники

Предыдущая
Скиллы в Claude Code: как научить агента своим процессам
Следующая
MCP для WooCommerce: даём ИИ доступ к магазину

Читайте также

Рабочий стол разработчика в тёмной графитовой комнате: ноутбук с админкой интернет-магазина и списком заказов, рядом монитор с JSON-ответом и терминаломЗаметки
15 августа 2026 г.

MCP для WooCommerce: даём ИИ доступ к магазину

WooCommerce научился отдавать товары и заказы ИИ-клиентам по протоколу MCP. Разбираем, как это включить, чем канонические abilities отличаются от устаревшего эндпоинта, какие права выдавать и где подстелить соломки.

Читать →
Разработчик за монитором: в редакторе открыто дерево папок и файл SKILL.md с блоком метаданных — скиллы в Claude CodeЗаметки
13 августа 2026 г.

Скиллы в Claude Code: как научить агента своим процессам

Скилл — это папка с инструкцией, которую агент подхватывает только тогда, когда она нужна. Разбираем устройство SKILL.md, места хранения, поля фронтматтера, динамический контекст и типичные ошибки.

Читать →
Тёмная графитовая комната, крупный план монитора на рабочем столе: в редакторе вверху экрана небольшой блок подсвеченного синтаксисом текста настроек, ниже — терминал с зелёным выводом; клавиатура в расфокусе на переднем плане, тёплый отблеск от окна на кромке монитораЗаметки
13 августа 2026 г.

Системный промпт: как задать модели роль и правила

Системный промпт — отдельное поле запроса, где разработчик задаёт модели роль, правила и формат ответа. Разбираем иерархию инструкций, синтаксис в API Claude, OpenAI и Gemini, структуру рабочего промпта и частые ошибки.

Читать →