Προγραμματισμός σαρώσεων και διαφορές
Εκτελέστε πλήρη σάρωση SEO με πρόγραμμα και δείτε τι άλλαξε από την τελευταία σάρωση — τα ζητήματα που εμφανίστηκαν, επέστρεψαν ή διορθώθηκαν — με σειρά αντίκτυπου, στον πίνακα ελέγχου και (προαιρετικά) σε συνοπτικό email.
Δύο λειτουργίες στην ίδια σελίδα, επειδή συνεργάζονται: οι διαφορές κάνουν μια προγραμματισμένη σάρωση να αξίζει να τη λάβετε.
Τι άλλαξε από την τελευταία σάρωση
Κάθε ολοκληρωμένη σάρωση παγώνει το σύνολο ανοιχτών ζητημάτων της σε ελαφρύ στιγμιότυπο (seo_scan_run_issues). Η σύγκριση στιγμιοτύπων δύο εκτελέσεων δίνει ακριβή διαφορά σε τρεις κατηγορίες:
- Νέα — πρόβλημα που δεν ήταν ανοιχτό πριν και είναι τώρα, και δεν ήταν ποτέ ανοιχτό σε προηγούμενη σάρωση: εύρημα που εμφανίζεται πραγματικά για πρώτη φορά.
- Επανεμφανισμένα — πρόβλημα που είχε διορθωθεί και επέστρεψε. (Όχι «έγινε πιο σοβαρό»: η σοβαρότητα είναι σταθερή ανά τύπο ζητήματος, οπότε η ουσιαστική παλινδρόμηση είναι η επιστροφή, ακριβώς αυτό που ο κύκλος ζωής ζητήματος ονομάζει εκ νέου άνοιγμα.)
- Διορθωμένα — πρόβλημα που ήταν ανοιχτό στην προηγούμενη σάρωση και τώρα απουσιάζει.
Κάθε κατηγορία ταξινομείται βάσει αντίκτυπου, ώστε η λίστα να ξεκινά με όσα έχουν σημασία.
Γιατί στιγμιότυπο και όχι ο πίνακας ζητημάτων
Τα ζητήματα έχουν κύκλο ζωής διόρθωσης / εκ νέου ανοίγματος: η ίδια εγγραφή ενημερώνεται επί τόπου μεταξύ σαρώσεων (το scan_run_id της ενημερώνεται στην τελευταία εκτέλεση κάθε φορά που παραμένει ανοιχτή). Αυτό είναι καλό για ανθεκτικό ιστορικό ζητημάτων, αλλά σημαίνει ότι ο ενεργός πίνακας δεν μπορεί να σας πει ποια ζητήματα ήταν ανοιχτά στο τέλος της εκτέλεσης N — ένα επίμονο ζήτημα δείχνει πάντα μόνο την τελευταία εκτέλεση.
Έτσι, κάθε εκτέλεση αποθηκεύει στιγμιότυπο του ανοιχτού συνόλου της, με κλειδί ένα σταθερό αποτύπωμα ζητήματος — issue_type | target | field (την ίδια ταυτότητα βάσει της οποίας συγκρίνει η αναφορά με δική σας επωνυμία). Οι διαφορές προκύπτουν έπειτα από απλές πράξεις συνόλων πάνω σε δύο παγωμένα σύνολα αποτυπωμάτων, σωστά για οποιεσδήποτε δύο εκτελέσεις, όχι μόνο για διαδοχικές.
Οριακές περιπτώσεις με ειλικρινή χειρισμό
- Μια σελίδα βγαίνει από το σύνολο σάρωσης. Τα ανοιχτά ζητήματά της δεν σαρώνονται ξανά, οπότε παραμένουν ανοιχτά και αποτυπώνονται ξανά σε κάθε εκτέλεση — εμφανίζονται ως ακόμη ανοιχτά, ποτέ ως ψευδώς «διορθωμένα». (Δεν ισχυριζόμαστε ότι μια σελίδα διορθώθηκε επειδή σταματήσαμε να την εξετάζουμε.)
- Ένας έλεγχος απενεργοποιείται μεταξύ σαρώσεων. Τα ζητήματά του παύουν να παράγονται, ο κύκλος ζωής τα σημειώνει ως διορθωμένα και φεύγουν από το ανοιχτό σύνολο — άρα εμφανίζονται ως διορθωμένα. Αυτό αποτυπώνει ειλικρινά την τρέχουσα κρίση του σαρωτή· δεν υπάρχει τρόπος σε επίπεδο ζητήματος να ξεχωρίσει το «το διορθώσατε» από το «απενεργοποιήσατε τον έλεγχο».
- Η πρώτη σάρωση μετά από αναβάθμιση. Οι εκτελέσεις πριν από αυτή τη λειτουργία δεν έχουν στιγμιότυπο, οπότε δεν επιλέγονται ποτέ ως βάση σύγκρισης — η πρώτη σάρωση με στιγμιότυπο είναι βάση σύγκρισης (τρέχουσα κατάσταση, χωρίς διαφορές), αντί να αναφέρει όλον τον ιστότοπο ως «νέο». Από τη δεύτερη σάρωση με στιγμιότυπο και μετά, οι διαφορές είναι διαθέσιμες.
Στον πίνακα ελέγχου
Το widget «Τι άλλαξε από την τελευταία σάρωση» στον πίνακα ελέγχου SEO δείχνει τα πλήθη νέων / επανεμφανισμένων / διορθωμένων ζητημάτων και τα κορυφαία ζητήματα κάθε κατηγορίας, με σειρά αντίκτυπου, συγκρίνοντας τις δύο πιο πρόσφατες ολοκληρωμένες σαρώσεις. Μέχρι να αποθηκευτούν στιγμιότυπα δύο σαρώσεων, εμφανίζει σύντομη σημείωση «βάσης σύγκρισης».
Ταξινόμηση βάσει αντίκτυπου
Κάθε κατηγορία διαφορών ταξινομείται με βαθμολογία αντίκτυπου, ώστε να προηγούνται τα μεγαλύτερα προβλήματα:
impact = severity_weight × page_importanceΤο severity_weight επαναχρησιμοποιεί τη δημοσιευμένη κλίμακα βαθμολόγησης: ένα κρίσιμο αξίζει
40, μια προειδοποίηση15, μια ειδοποίηση5. Η σοβαρότητα είναι η δηλωμένη κρίση του προϊόντος για τη σημασία ενός ελαττώματος, οπότε η ταξινόμηση τη διαβάζει αντί να επινοεί δεύτερη κλίμακα.Το page_importance καθορίζεται από την πραγματική ζήτηση αναζήτησης — πόσες εμφανίσεις έχει η σελίδα στο Search Console — επειδή αυτό είναι το σήμα που διαφοροποιεί πραγματικά τη μία σελίδα από την άλλη:
page_importance = 1 + demand_weight·demand + priority_weight·priority demand = log1p(page impressions) / log1p(busiest page's impressions) ∈ [0,1] priority = the page's configured per-class sitemap priority ∈ [0,1]Οι εμφανίσεις κλιμακώνονται λογαριθμικά (σελίδα με 10× επισκεψιμότητα δεν είναι 10× πιο σημαντική) και κανονικοποιούνται σε σχέση με τη σελίδα με τις περισσότερες εμφανίσεις, ώστε ο τύπος να συμπεριφέρεται το ίδιο σε μικρό ιστολόγιο και μεγάλο κατάλογο. Το
<priority>του χάρτη είναι μόνο ασθενές δευτερεύον σήμα — δεν ορίζεται από προεπιλογή και είναι ενιαία τιμή ακόμη κι όταν οριστεί, οπότε δεν μπορεί να καθορίζει την ταξινόμηση· την επηρεάζει λίγο όταν έχετε ρυθμίσει προτεραιότητες ανά τύπο στοseo.sitemap.models.
Χωρίς Search Console, κανένα πρόβλημα. Χωρίς συγχρονισμένο ιστορικό GSC και χωρίς ρυθμισμένες προτεραιότητες, το page_importance είναι 1 για κάθε σελίδα και ο αντίκτυπος είναι καθαρά ταξινόμηση σοβαρότητας — λογική προεπιλογή, όχι επινοημένη. Συγχρονίστε ιστορικό GSC (seo-pro:gsc-sync) για να ενεργοποιήσετε τη στάθμιση ζήτησης.
Ρυθμίστε τα βάρη και το χρονικό παράθυρο στο seo-pro.scan.delta.impact.
Προγραμματισμός σάρωσης
Το πακέτο δεν προγραμματίζει τίποτα από προεπιλογή. Ενεργοποιήστε το:
// config/seo-pro.php
'schedule' => [
'enabled' => true, // env SEO_PRO_SCHEDULE_ENABLED
'frequency' => 'weekly', // daily | weekly | monthly | hourly
'time' => '03:00', // for daily/weekly/monthly
'timezone' => null, // null = app timezone
// ...
],ή ορίστε πλήρη έκφραση cron για πλήρη έλεγχο (υπερισχύει του frequency):
'cron' => '0 3 * * 1', // env SEO_PRO_SCHEDULE_CRONΑυτό αρκεί — το πακέτο καταχωρίζει το seo-pro:scan στον scheduler του Laravel με withoutOverlapping για αποτροπή επικαλυπτόμενων εκτελέσεων της προγραμματισμένης εντολής. Αυτό το κλείδωμα scheduler δεν καλύπτει ολόκληρη τη διάρκεια ζωής των εργασιών ουράς. Η καταχώριση εκτελείται μόνο σε περιβάλλον scheduler/κονσόλας, οπότε δεν προσθέτει καμία επιβάρυνση σε web αιτήματα.
Απαιτεί scheduler σε λειτουργία
Ο προγραμματισμός του πακέτου μένει αδρανής αν δεν εκτελείται ο scheduler του Laravel — το κανονικό cron μίας γραμμής (* * * * * php artisan schedule:run) ή το php artisan schedule:work στην ανάπτυξη. Δείτε τη Ρύθμιση παραγωγής.
Προτιμάτε να το συνδέσετε μόνοι σας; Αφήστε το schedule.enabled ανενεργό και προγραμματίστε την εντολή από τον δικό σας console kernel — οι διαφορές και η περίληψη εξακολουθούν να λειτουργούν:
$schedule->command('seo-pro:scan --notify')->weekly();Το --sync εκτελεί τη σάρωση άμεσα αντί να βάζει σε ουρά μία εργασία ανά στόχο (κατάλληλο για μικρό ιστότοπο χωρίς worker ουράς· κρατήστε το ανενεργό στην παραγωγή).
Συνοπτικό email
Επιλέξτε να λαμβάνετε email «τι άλλαξε από την τελευταία σάρωση» όταν ολοκληρώνεται μια προγραμματισμένη σάρωση — περίληψη HTML με τη δική σας επωνυμία για τα νέα / επανεμφανισμένα / διορθωμένα ζητήματα, με σειρά αντίκτυπου:
'schedule' => [
// ...
'notify' => [
'enabled' => true, // env SEO_PRO_SCHEDULE_NOTIFY
'recipients' => ['seo@agency.test'], // falls back to reports.recipients
'subject' => 'SEO scan summary',
'only_on_change' => true, // skip when nothing changed
],
],Επαναχρησιμοποιεί την εταιρική ταυτότητα και τις ρυθμίσεις email της αναφοράς με δική σας επωνυμία, οπότε το όνομα, το λογότυπο και το χρώμα της εταιρείας σας μεταφέρονται, ενώ οι παραλήπτες χρησιμοποιούν εκείνους των αναφορών σας αν δεν ορίσετε ξεχωριστούς. Το only_on_change παραλείπει το email όταν μια σάρωση δεν άλλαξε τίποτα (η πρώτη σάρωση βάσης σύγκρισης αποστέλλεται πάντα).
Η περίληψη αποστέλλεται μόνο για εκτέλεση που ξεκίνησε με --notify (το οποίο προσθέτει αυτόματα ο scheduler όταν είναι ενεργό το notify.enabled) — ένα έκτακτο seo-pro:scan χωρίς --notify δεν στέλνει email σε κανέναν.
Άλλο κανάλι;
Θέλετε Slack, webhook ή προσαρμοσμένη σύνοψη αντί για email; Εγγραφείτε στο συμβάν Rankbeam\Seo\Pro\Events\SeoScanCompleted — ενεργοποιείται μία φορά ανά ολοκληρωμένη εκτέλεση και μεταφέρει την εκτέλεση, ώστε να μπορείτε να δημιουργήσετε τις διαφορές με Rankbeam\Seo\Pro\Scanning\Delta\ScanRunDelta και να τις κατευθύνετε όπου θέλετε.
Διατήρηση δεδομένων
Τα στιγμιότυπα διαγράφονται αλυσιδωτά μαζί με την εκτέλεσή τους, οπότε το seo-pro:scan-prune τα απομακρύνει αυτόματα βάσει ηλικίας — δεν υπάρχει κάτι νέο για προγραμματισμό. Μια εκτέλεση καθαρίζεται μόνο όταν δεν έχει ανοιχτά ζητήματα, οπότε το στιγμιότυπο μιας πρόσφατης εκτέλεσης είναι πάντα διαθέσιμο για σύγκριση.
Απενεργοποιήστε εντελώς τα στιγμιότυπα (χωρίς διαφορές ή περίληψη) με seo-pro.scan.delta.snapshot => false.