Отчёты под своим брендом
PDF-отчёт под вашим брендом для одного сайта: общая оценка, динамика найденных проблем, исправленные и новые с прошлого отчёта, восстановленные 404 и битые ссылки, изменения Search Console и активность ИИ-роботов. Создаётся одной командой и по желанию отправляется по email по расписанию. Для агентств: добавьте свой логотип, цвет и «подготовлено для {client}», затем передайте клиенту.
Скачать созданный образец отчёта на английском (PDF, 98 КБ) или пройти пример сканирование → исправление → отчёт. Образец использует демонстрационный контент Merchant и два новых сканирования; он показывает одну исправленную проблему, 19 открытых и отсутствие данных Search Console.
Содержимое
- Общая оценка — среднее последних оценок страниц (опубликованная методика: A ≥ 90 … F), изменение с прошлого отчёта и динамика общей оценки по недавним сканированиям. Теперь каждое сканирование сохраняет оценку сайта в запуске, поэтому динамика — настоящая история сканирований. Она заполняется с первого сканирования после обновления (старые запуски без оценки просто пропускаются).
- Проблемы на сканирование — реальная динамика недавних завершённых сканирований (меньше — лучше).
- Исправленные и новые проблемы — сколько дефектов устранено и сколько появилось с прошлого отчёта. Используется настоящая история проблем — теперь с жизненным циклом исправления/повторного открытия, — когда под ним прошёл полный период, иначе снимок предыдущего отчёта.
- Восстановлено — устранённые битые ссылки, восстановленные 404 (путь снова сам возвращает 200 — см.
seo-pro:404-recheck) и перенаправленные 404 с прошлого отчёта, а также оставшиеся открытые. Восстановленный 404 — настоящее исправление на источнике, учитываемое отдельно от перенаправления. - Search Console — ведущие запросы и страницы, а также изменения: самые большие сдвиги кликов относительно прошлого отчёта. Раздел корректно пропускается, если GSC не настроен.
- Активность ИИ-роботов — запросы, отнесённые к роботам по user-agent (личность робота не подтверждена), накопленные итоги и, когда история дневных групп покрывает окно, реальные обращения за период и уникальные URL, обойдённые каждым роботом (иначе используется разница накопленных счётчиков снимков).
«С прошлого отчёта»
Отчёт сравнивает периоды относительно предыдущего отчёта, а не произвольной даты. При каждом создании сохраняется небольшой снимок (seo_report_runs): оценка, идентификаторы открытых проблем, строки Search Console и счётчик обращений каждого робота. Следующий отчёт сравнивает сегодняшнее состояние с этим снимком.
Это резервный путь для сигналов без собственной истории: оценки страниц хранят только последнее состояние. Снимок при создании отчёта позволяет сравнивать их корректно. Несколько сигналов теперь имеют настоящую историю; отчёт предпочитает её, оставляя снимок запасным вариантом: проблемы имеют жизненный цикл исправления/повторного открытия (настоящие количества исправленных/новых после полного периода), Search Console хранит дневные метрики, а обращения ИИ-роботов — дневные группы (реальные обращения за период и уникальные URL). Каждый источник возвращается к разнице снимков для первого отчёта после обновления или при неполной истории окна.
Два следствия:
- Первый отчёт — исходная точка. Он показывает текущее состояние; показатели «исправлено», «новые», изменения и «с прошлого отчёта» заполняются начиная со второго отчёта.
- Частоту выбираете вы. Ежемесячные отчёты сравнивают месяцы, еженедельные — недели. Для разового просмотра, который не должен сдвигать базу сравнения, используйте
--no-store.
Создание отчёта
php artisan seo-pro:reportБез параметров PDF записывается в storage/app/seo-reports/. Укажите другое место или отправьте по email:
# Write to a specific file or directory
php artisan seo-pro:report --output=/tmp/acme-october.pdf
# E-mail it to one or more recipients (the PDF is attached)
php artisan seo-pro:report --email=client@acme.com --email=pm@agency.com
# One-off preview that does NOT store a snapshot (deltas won't advance)
php artisan seo-pro:report --no-store --output=/tmp/preview.pdf
# Machine-readable summary
php artisan seo-pro:report --jsonПараметры
| Параметр | Действие |
|---|---|
--client= | Переопределяет имя клиента в подписи «подготовлено для» |
--agency= | Переопределяет название агентства в отчёте |
--accent= | Переопределяет акцентный цвет (hex, например #3D5AFE) |
--logo= | Переопределяет путь к логотипу |
--email= | Адрес получателя (можно повторять); отправляет отчёт по email |
--send | Отправляет настроенным получателям |
--output= | Записывает PDF в указанный файл или каталог |
--no-store | Не сохраняет снимок (база изменений за период не сдвигается) |
--json | Выводит машиночитаемую сводку |
Расписание отправки
Пакет сам не планирует отправку: частота определяется вами. В расписании консоли приложения (routes/console.php или app/Console/Kernel.php):
use Illuminate\Support\Facades\Schedule;
Schedule::command('seo-pro:report --send')->monthly();Один раз задайте получателей по умолчанию в конфигурации или .env:
SEO_PRO_REPORT_RECIPIENTS="client@acme.com,pm@agency.com"--send использует их, если адреса не указаны; явные параметры --email переопределяют список.
Оформление
Оформление не секретно, поэтому хранится в конфигурации: задайте его один раз, и каждый отчёт использует эти значения. Любое поле можно переопределить для отдельного отчёта параметрами команды выше (удобно, если одна установка готовит отчёты нескольким клиентам).
SEO_PRO_REPORT_AGENCY="Blue Whale Studio"
SEO_PRO_REPORT_LOGO="/var/www/brand/logo.png"
SEO_PRO_REPORT_ACCENT="#3D5AFE"
SEO_PRO_REPORT_CLIENT="Acme Outdoor Co."
SEO_PRO_REPORT_CONTACT="hello@bluewhale.studio · bluewhale.studio"
SEO_PRO_REPORT_FOOTER="Confidential — prepared for Acme Outdoor Co."Примечания:
- Логотип — абсолютный путь к файлу
PNG/JPG/GIF/WEBP/SVG. Приложение читает файл и встраивает его в PDF как data URI, поэтому рендереру не нужно загружать изображение по сети. Безопаснее всегоPNGилиJPG. - Акцентный цвет — проверяется как hex-значение; при ошибке берётся цвет по умолчанию. Он используется только как цвет, никогда как произвольный CSS.
- Название агентства — по умолчанию название приложения (
config('app.name')).
Полный блок конфигурации находится в reports файла config/seo-pro.php, включая paper (по умолчанию a4), include_gsc и число запусков динамики / строк GSC / роботов.
Один сайт на установку
Pro сканирует приложение, в котором установлен, поэтому отчёт описывает эту установку. Агентство с несколькими клиентскими сайтами создаёт отчёт для каждой установки (параметры --client / оформления подписывают каждый). Мультитенантной модели «sites» нет.
Как создаётся PDF
По умолчанию PDF выводится через dompdf: чистый PHP, без Node и headless Chromium. Поэтому отчёт по расписанию создаётся внутри воркера или cron без системных бинарных зависимостей, и Pro сохраняет работу без интерфейса. Удалённые загрузки в рендерере отключены; единственное изображение — логотип — встроено, поэтому ни одно отрендеренное поле не может вызвать сетевой запрос.
Отчёты для разных письменностей (Browsershot)
Начиная с core 3.20 / Pro 2.40 рендереры Chrome отключают JavaScript и блокируют запросы ресурсов по HTTP(S), FTP и WebSocket. Опубликованные шаблоны должны использовать статические HTML/CSS со встроенными ресурсами. Эти ограничения касаются ресурсов страницы; самому Chrome всё ещё нужны правильно настроенные хост и песочница. Если Fontconfig сообщает об отсутствующем шрифте для письменности, в том числе менее представленной в смешанном тексте, PDF-рендерер пишет в журнал предупреждение с рекомендацией установки. Отсутствующий шрифт не мешает Chrome создать PDF, поэтому проверьте результат до отправки.
dompdf использует только встроенный шрифт (DejaVu Sans: латиница, кириллица, греческий), поэтому для японского, тайского или арабского клиента в отчёте появятся квадраты вместо символов. С Pro 2.34 отчёт можно создавать через headless Chrome с spatie/browsershot — той же зависимостью, которую ядро использует для OG-изображений: машину настраивают один раз:
// config/seo-pro.php → 'reports'
'renderer' => 'browsershot', // default 'dompdf'
'browsershot' => [
'chrome_path' => null, // null = reuse seo.og_image.chrome_path
'node_binary' => null, // … seo.og_image.node_binary
'npm_module_path' => null, // … seo.og_image.npm_module_path
'no_sandbox' => null, // … seo.og_image.no_sandbox
'timeout' => 90,
],
'locale' => null, // report language; null captures the app locale
'format_locale' => null, // optional regional date/number formatChrome использует установленные на сервере шрифты, а шаблон — стек ядра по письменностям (Noto Sans, сначала семейство Noto Sans CJK языка страницы, затем тайский, арабский, иврит, деванагари, цветные emoji и DejaVu Sans для латиницы). Установите нужные семейства — apt install fonts-noto-cjk fonts-noto-core fonts-noto-color-emoji в Debian и Ubuntu — как для OG-изображений. seo:og-images предупреждает при запуске, если для письменности страницы нет установленного семейства; это применимо и к отчётам. Blade-шаблон, данные и снимок одинаковы для обоих движков; меняется только растеризатор, а ReportGenerator::renderer() показывает, какой подключён.
Даты и числа в локали читателя
При создании отчёта фиксируется seo-pro.reports.locale. Null означает локаль приложения. Выбранный язык перевода определяет подписи PDF и письма, тему по умолчанию, шрифты и HTML lang. Региональные локали без своего файла перевода используют базовый язык пакета, затем английский. Упрощённый (zh_CN) и традиционный (zh_TW) китайский остаются раздельными.
При установленном ext-intl даты и числа форматируются ICU по запрошенной локали. Чтобы намеренно выбрать другое региональное форматирование, задайте seo-pro.reports.format_locale: locale=it и format_locale=en_US дают итальянские подписи с американскими форматами дат и чисел. Без ext-intl сохраняется резервный английский формат дат и чисел с группировкой запятыми.
Письмо в очереди сохраняет зафиксированные язык, форматирование и тему даже при изменении конфигурации воркера. Выбирайте язык до создания PDF: последующее изменение локали mailable не переведёт вложение. Старые задания до Pro 2.39 используют конфигурацию воркера, поскольку не содержат сохранённых настроек. Пользовательские темы, оформление и сохранённые сообщения проблем остаются исходными данными.
Язык CLI задаётся отдельно: php artisan seo-pro:report --display-locale=it переводит сводку команды, а конфигурация отчёта выбирает язык PDF/email клиента. CLI по умолчанию английский; это настраивается через SEO_PRO_CLI_LOCALE. JSON-ключи и коды остаются стабильными, а понятные человеку подписи могут переводиться. Опубликуйте seo-pro-lang, чтобы переопределить сообщения отчётов и рабочих процессов в lang/vendor/seo-pro/{locale}/seo-pro.php.
Для программного использования получите ReportGenerator из контейнера:
use Rankbeam\Seo\Pro\Reports\Branding;
use Rankbeam\Seo\Pro\Reports\ReportGenerator;
$report = app(ReportGenerator::class)->generate(
Branding::fromConfig()->withOverrides(['prepared_for' => 'Acme Outdoor Co.']),
);
$report->pdf; // raw PDF bytes
$report->data; // the assembled ReportData
$report->run; // the persisted SEOReportRun snapshot