feat: Integrate DataForSEO for indexed pages tracking

- Updated CRON documentation to include DataForSEO metrics synchronization.
- Enhanced SettingsController to manage DataForSEO API credentials and settings.
- Modified SiteController to handle DataForSEO domain input.
- Updated Site model to accommodate DataForSEO data handling.
- Added methods in SiteSeoMetric model for DataForSEO data retrieval and validation.
- Implemented SiteSeoSyncService to synchronize SEO metrics from both SEMSTORM and DataForSEO.
- Enhanced dashboard templates to display indexed pages data.
- Updated settings and site creation/edit templates to include DataForSEO fields.
- Created migration for adding DataForSEO related columns in the database.
- Developed DataForSeoService to fetch indexed pages count from DataForSEO API.
This commit is contained in:
2026-02-21 11:41:17 +01:00
parent 10ddd2ac1c
commit b2aead1fbe
15 changed files with 541 additions and 219 deletions

View File

@@ -15,7 +15,7 @@
<div class="row g-4">
<div class="col-lg-8">
<div class="card h-100">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Widocznosc SEO (SEMSTORM)</h5>
<form method="post" action="/sites/<?= (int) $site['id'] ?>/seo/sync" data-confirm="Pobrac i nadpisac dane SEO dla biezacego miesiaca?">
@@ -25,7 +25,26 @@
</form>
</div>
<div class="card-body">
<canvas id="seoVisibilityChart" height="320"></canvas>
<div class="position-relative" style="height: 340px;">
<canvas id="seoVisibilityChart"></canvas>
</div>
</div>
</div>
<div class="card mt-4 border-secondary-subtle">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0">Zaindeksowane strony (DataForSEO)</h6>
</div>
<div class="card-body">
<?php if (!empty($seoLatest)): ?>
<div class="display-6 fw-semibold mb-1"><?= (int) ($seoLatest['indexed_pages'] ?? 0) ?></div>
<p class="small text-muted mb-0">
Ostatnia aktualizacja miesieczna:
<?= htmlspecialchars(date('m.Y', strtotime((string) $seoLatest['metric_month']))) ?>
</p>
<?php else: ?>
<p class="text-muted small mb-0">Brak danych o indeksacji. Uzyj przycisku "Synchronizuj teraz".</p>
<?php endif; ?>
</div>
</div>
</div>
@@ -64,6 +83,7 @@
</div>
</div>
<p class="small mb-2"><strong>Ruch:</strong> <?= (int) $seoLatest['traffic'] ?></p>
<p class="small mb-2"><strong>Zaindeksowane strony:</strong> <?= (int) ($seoLatest['indexed_pages'] ?? 0) ?></p>
<p class="small text-muted mb-0">
Ostatni zapis: <?= htmlspecialchars(date('d.m.Y H:i', strtotime((string) $seoLatest['updated_at']))) ?><br>
Miesiac: <?= htmlspecialchars(date('m.Y', strtotime((string) $seoLatest['metric_month']))) ?>