Εξήγηση της επίλυσης (seo:explain)
Το Rankbeam επιλύει το SEO μιας σελίδας μέσω μιας αλυσίδας επιπέδων προτεραιότητας — ρυθμίσεις, προεπιλογές βάσης δεδομένων (καθολικές / ανά τύπο μοντέλου / ανά διαδρομή), υπολογιζόμενες τιμές μοντέλου και τέλος ρητό seo_meta — και έπειτα εφαρμόζει μετεπεξεργασία (επίθημα τίτλου, canonical, μετατροπή εικόνων σε απόλυτες URL) και την προστασία ευρετηρίασης. Όταν η αποδιδόμενη ετικέτα <title> ή robots δεν είναι αυτή που περιμένατε, το seo:explain δείχνει ακριβώς ποιο επίπεδο όρισε κάθε πεδίο και τι αντικατέστησε.
Εκτελεί μόνο ανάγνωση, δεν χρειάζεται δίκτυο ή άδεια και δεν υλοποιεί ξανά τη συγχώνευση: η απόδοση προέλευσης βασίζεται στις συνεισφορές επιπέδων του ίδιου του resolver και οι τελικές τιμές προέρχονται από τον πραγματικό resolver — επομένως η εξήγηση δεν μπορεί να αποκλίνει από αυτό που αποδίδεται.
Χρήση
# Explain a specific record
php artisan seo:explain "App\Models\Post" 42
# Explain the first record of a model
php artisan seo:explain "App\Models\Post"
# With a route-defaults layer and a locale
php artisan seo:explain "App\Models\Post" 42 --route=posts.show --locale=de
# Machine-readable
php artisan seo:explain "App\Models\Post" 42 --jsonΤο μοντέλο πρέπει να χρησιμοποιεί το trait HasSEO.
Ανάγνωση της εξόδου
SEO resolution — Post #42 (locale: en, route: posts.show)
Layers, low → high: config · global · model-type · route · computed · explicit
Field Final value Set by Overrode
title My Post | Acme computed —
↳ title suffix ' | Acme' appended
description A hand-written summary… explicit computed: "An auto excerpt…"
canonical https://acme.com/blog/my-post post-processing —
↳ derived from model getUrlForSEO() (query string stripped)
robots noindex,nofollow explicit config: index,follow
↳ indexing guard forced 'noindex,nofollow' (environment 'staging' …)
og_image https://acme.com/share.jpg explicit config: /default-og.jpg
↳ absolutized from '/share.jpg'- Set by — το επίπεδο που υπερίσχυσε (το επίπεδο με την υψηλότερη προτεραιότητα που όρισε μη null τιμή), ή
post-processingόταν κανένα επίπεδο δεν όρισε το πεδίο αλλά μια τιμή παρήχθη (canonical από την URL αιτήματος/μοντέλου, og:url από το canonical, εικόνα που μετατράπηκε σε απόλυτη URL). - Overrode — κάθε επίπεδο χαμηλότερης προτεραιότητας που πρόσφερε τιμή και έχασε, με τη σειρά, ώστε να βλέπετε τι παρακάμφθηκε.
- ↳ notes — η μετεπεξεργασία που άλλαξε την τιμή μετά τη συγχώνευση των επιπέδων: το επίθημα τίτλου, η αφαίρεση query string από την κανονική URL, η παραγωγή og:url, η μετατροπή εικόνων σε απόλυτες URL και η προστασία ευρετηρίασης που επιβάλλει
noindexπάνω από κάθε επίπεδο.
og:type και twitter:card
Αυτά τα δύο έχουν μη null προεπιλογές του framework (website / summary_large_image), οπότε το υψηλότερο επίπεδο που τα ορίζει — συνήθως το computed — υπερισχύει του config. Μια σελίδα χωρίς αποθηκευμένη εγγραφή seo_meta δεν συνεισφέρει τίποτα γι' αυτά, επομένως ένα υπολογιζόμενο og:type όπως το article δεν παρακάμπτεται ποτέ από ένα σκέτο website. Αυτό αποτυπώνει πιστά τον τρόπο που τα επιλύει η συγχώνευση.
Επίλυση σε επίπεδο ιστοτόπου
Σύμφωνα με την προσθήκη για την καταγραφή ρυθμίσεων ιστοτόπου, το seo:explain αναφέρει και τις τιμές που ισχύουν για όλο τον ιστότοπο και των οποίων η προέλευση προκαλεί συχνά σύγχυση — ποια πηγή όρισε τον κανονικό host, το όνομα του ιστοτόπου και το προεπιλεγμένο locale:
Site-level resolution
Value Resolved Source
Site name Acme env (APP_NAME)
Default locale en config (app.locale)
Canonical host acme.com programmatic (model getUrlForSEO())Ο κανονικός host είναι η τιμή που αξίζει περισσότερο να ελέγξετε — ένας λάθος host (ένα localhost που διέφυγε στην παραγωγή, ένα http:// σε ιστότοπο https, η URL της εφαρμογής που δεν ταιριάζει με την URL του μοντέλου) είναι κλασική αιτία σφαλμάτων στις αυτοαναφορικές κανονικές URL.
Έξοδος JSON
Το --json παράγει το πλήρες ίχνος — target, τα winner / losers / final / notes ανά πεδίο και την καταγραφή site_level — για εργαλεία ή CI:
{
"target": { "model": "App\\Models\\Post", "id": 42, "route": "posts.show", "locale": "en" },
"fields": {
"title": {
"final": "My Post | Acme",
"winner": { "layer": "computed", "value": "My Post" },
"losers": [],
"notes": ["title suffix ' | Acme' appended"]
}
},
"site_level": {
"canonical_host": { "value": "acme.com", "source": "programmatic (model getUrlForSEO())" }
}
}Δείτε επίσης
- Προτεραιότητα του resolver — η πλήρης αλυσίδα που ιχνηλατεί το
seo:explain. - Δωρεάν έλεγχος SEO — το
seo:auditβρίσκει τι είναι λάθος· τοseo:explainδείχνει γιατί μια τιμή είναι αυτή που είναι.