Перейти к содержимому

Отчёты под своим брендом

PDF-отчёт под вашим брендом для одного сайта: общая оценка, динамика найденных проблем, исправленные и новые с прошлого отчёта, восстановленные 404 и битые ссылки, изменения Search Console и активность ИИ-роботов. Создаётся одной командой и по желанию отправляется по email по расписанию. Для агентств: добавьте свой логотип, цвет и «подготовлено для {client}», затем передайте клиенту.

Скачать созданный образец отчёта на английском (PDF, 98 КБ) или пройти пример сканирование → исправление → отчёт. Образец использует демонстрационный контент Merchant и два новых сканирования; он показывает одну исправленную проблему, 19 открытых и отсутствие данных Search Console.

Первая страница созданного отчёта демоприложения Merchant.

Содержимое

  • Общая оценка — среднее последних оценок страниц (опубликованная методика: 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.

Создание отчёта

bash
php artisan seo-pro:report

Без параметров PDF записывается в storage/app/seo-reports/. Укажите другое место или отправьте по email:

bash
# 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):

php
use Illuminate\Support\Facades\Schedule;

Schedule::command('seo-pro:report --send')->monthly();

Один раз задайте получателей по умолчанию в конфигурации или .env:

dotenv
SEO_PRO_REPORT_RECIPIENTS="client@acme.com,pm@agency.com"

--send использует их, если адреса не указаны; явные параметры --email переопределяют список.

Оформление

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

dotenv
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-изображений: машину настраивают один раз:

php
// 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 format

Chrome использует установленные на сервере шрифты, а шаблон — стек ядра по письменностям (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 из контейнера:

php
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

rankbeam/laravel-seo распространяется под лицензией MIT.