Задача
В каталоге на тысячи позиций мета-теги пустые у большинства товаров, а заполнять их вручную никто не будет. Нужен шаблон с подстановками — но такой, который не испортит то, что люди уже написали руками.
Главное правило: ручное важнее автоматического
Плагин заполняет поле, только если оно пустое. Это не украшение, а защита от молчаливой потери чужой работы: модуль, который переписывает заполненные поля, обнаруживают через месяц и по последствиям.
Три вещи, из-за которых такие модули выдают мусор
Пустая подстановка оставляет след. Шаблон {name} — {brand} у товара без бренда даёт «дрель — » с висящим тире. Пустые значения убираются вместе с осиротевшими разделителями, двойными пробелами и пробелами перед запятой.
Обрезка посреди слова. Описание режется по границе слова и по символам, а не по байтам: на кириллице побайтовая обрезка даёт вдвое короче задуманного и рвёт букву пополам.
Отсутствующий атрибут роняет страницу. Значения берутся через getData, а не через геттеры: атрибута может не быть у половины каталога.
Как проверено без установленного Magento
Вся логика вынесена в класс, не зависящий ни от фреймворка, ни от базы. Именно там и можно ошибиться — поэтому именно она покрыта 15 юнит-тестами: подстановка, регистр имён, пустые и null-значения, висящие тире, обрезка по словам, одно длинное слово, счёт символов на кириллице, незакрытая скобка.
Конфигурация проверена официальными схемами Magento 2.4: module.xml, di.xml и system.xml проходят валидацию по module.xsd, config.xsd и system_file.xsd. Это не формальность: неверный system.xml не показывает ошибку, он просто не рисует раздел в админке.
Собственный проект. В работающий Magento модуль не устанавливался — развернуть его без ключей Adobe Marketplace нельзя, и это указано в документации.