Zum Inhalt springen

Migration von anderen Laravel-SEO-Paketen

Diese Anleitung ordnet die APIs und Speicherformen gängiger SEO-Pakete den beiden Rankbeam-Bausteinen zu: dem Trait HasSEO und saveSEO(). Für SEO-Daten, die pro Modell gespeichert sind, gibt es einen Importbefehl. Der konkrete Aufwand hängt von deinen Anpassungen ab.

Migration von WordPress

Für Inhaltsseiten mit Yoast oder Rank Math beschreibt Migration von WordPress (EN) den CSV-Import und die Leser für bestehende Datenbanken.

AusgangspaketSpeicherungMigrationsweg
ralphjsmit/laravel-seoPolymorphe Tabelle seophp artisan seo:import-from ralphjsmit und Trait austauschen
artesaos/seotoolsKeine Datenbank; Laufzeit und KonfigurationAufrufe durch saveSEO() oder berechnete Getter ersetzen
spatie/*Keine Metadatentabelle; Schema- und Sitemap-BuilderErgänzende Teile behalten, andere zu Rankbeam übertragen

Nur ralphjsmit speichert hier SEO-Daten in einer eigenen Datenbanktabelle und bietet damit Daten für einen Massenimport. Bei Laufzeit-Tag-Buildern gibt es keine solche Tabelle. Deren Aufrufe ersetzt du durch gespeicherte seo_meta-Werte oder berechnete Felder.

Von ralphjsmit/laravel-seo

Das Paket speichert pro Modell eine polymorphe Zeile in seo. Die Struktur ähnelt Rankbeams seo_meta, sodass ein wiederholbarer Import möglich ist.

1. Rankbeam zusätzlich installieren

bash
composer require rankbeam/laravel-seo
php artisan vendor:publish --tag=seo-config
php artisan vendor:publish --tag=seo-migrations
php artisan migrate

Beide Pakete können während der Migration nebeneinander bestehen: Sie nutzen unterschiedliche Tabellen (seo und seo_meta) sowie unterschiedliche Trait-Namespaces.

Gemeinsamer Konfigurationsschlüssel

Eine vorhandene config/seo.php von ralphjsmit überschattet Rankbeams Konfiguration, weil beide den Schlüssel seo verwenden. Sichere die alte Datei, entferne sie und veröffentliche Rankbeams Konfiguration erneut mit php artisan vendor:publish --tag=seo-config.

2. Import ausführen

bash
# Preview first — writes nothing
php artisan seo:import-from ralphjsmit --dry-run

# Then import for real
php artisan seo:import-from ralphjsmit

Der Importer liest seo, löst jede Zeile zum tatsächlichen Eloquent-Modell auf und schreibt die Daten in seo_meta.

OptionWirkung
--dry-runGeplanten Import anzeigen, nichts schreiben.
--model="App\Models\Post"Auf eine oder mehrere Modellklassen beschränken; mehrfach möglich.
--locale=frZielsprachversion; standardmäßig die Anwendungssprache.
--table=legacy_seoAnders benannte Quelltabelle lesen.
--connection=legacyQuelltabelle über eine andere Datenbankverbindung lesen.
--limit=100Höchstens N Zeilen importieren, etwa für eine schrittweise Migration.
--overwriteVorhandene nichtleere Werte ersetzen; standardmäßig werden nur leere Felder ergänzt.
--jsonMaschinenlesbaren Bericht ausgeben.
--forceBestätigungsfrage für Skripte oder CI überspringen.

Der Import ist idempotent: Ein erneuter Lauf bearbeitet dieselben Zeilen und erzeugt keine Duplikate. Standardmäßig füllt er nur leere Felder und bewahrt bereits gesetzte Rankbeam-Daten. Verwende --overwrite nur, wenn importierte Werte sie ersetzen sollen.

3. Trait auf den Modellen austauschen

Ersetze den Trait von ralphjsmit durch den von Rankbeam. Einige Methodennamen unterscheiden sich; die gelesene Tabelle ist anschließend seo_meta.

php
// Before
use RalphJSmit\Laravel\SEO\Support\HasSEO;

// After
use Rankbeam\Seo\Traits\HasSEO;

Übertrage Anpassungen aus getDynamicSEOData() in die feldbezogenen Getter getSEOTitle(), getSEODescription(), getSEOImage(), getUrlForSEO() und getSEOAlternates(). Der Schnellstart zeigt sie. Explizite Überschreibungen speicherst du mit saveSEO():

php
$post->saveSEO([
    'title' => 'A hand-written SEO title',
    'description' => 'A hand-written meta description.',
    'canonical' => 'https://example.com/posts/my-post',
    'robots' => 'noindex, nofollow',
    'og_image' => 'https://example.com/og/my-post.jpg',
]);

Feldzuordnung

Der Importer ordnet Felder ausdrücklich zu. Er kopiert keine Spalten, die das Schema von Core 3 nicht besitzt.

ralphjsmit seoRankbeam seo_metaHinweise
model_type / model_idseoable_type / seoable_idAus dem aktuellen Modell neu ermittelt, nicht unverändert kopiert.
titletitleAuf die Spaltenlänge von 70 Zeichen begrenzt; Kürzungen werden gemeldet.
descriptiondescriptionAuf 160 Zeichen begrenzt; Kürzungen werden gemeldet.
canonical_urlcanonical
robotsrobotsAuf 50 Zeichen begrenzt.
imageog_imageDer Resolver vererbt es automatisch an twitter:image.
authorNicht importiertCore 3 hat hier keine Autorenspalte. Autorenschaft gehört zur Auflösung der Artikeldaten. Betroffene Zeilen werden gezählt und gemeldet, damit du einen geeigneten Speicherort oder berechneten Wert festlegen kannst.
id, created_at, updated_atNicht importiertStrukturelle Quellfelder.

Warum der Morph-Typ neu ermittelt wird: Jede Zeile wird zum tatsächlichen Modell aufgelöst. Die seoable-Schlüssel stammen aus dessen getMorphClass(). Das berücksichtigt die aktuelle Morph Map der Anwendung, selbst wenn das alte Paket eine andere Konvention gespeichert hat. Zeilen gelöschter Modelle werden als übersprungen gemeldet und nicht als verwaiste Beziehungen geschrieben.

Bericht verstehen

Ohne --json zeigt der Befehl eine Ergebnistabelle und drei Prüfbereiche:

  • Truncated: Werte, die auf die Länge einer seo_meta-Spalte gekürzt wurden. Prüfe diese Texte.
  • Not imported: Befüllte Quellspalten ohne Entsprechung in Core 3, etwa author.
  • Skipped rows by reason: Leere Quellzeilen, gelöschte Modelle und nicht auflösbare Modelltypen.

Ergebnis prüfen

bash
php artisan seo:audit            # confirm the imported metadata looks right

Wenn die importierten Daten geprüft sind, kannst du ralphjsmit/laravel-seo entfernen und seine Tabelle seo löschen.

Von artesaos/seotools

artesaos/seotools erzeugt Tags zur Laufzeit. Meist setzt ein Controller Werte über SEOMeta, OpenGraph, TwitterCard und JsonLd; Standardwerte kommen aus config/seotools.php. Da nichts pro Modell gespeichert wird, gibt es keine Tabelle zu importieren. Übertrage die Aufrufe in gespeicherte oder berechnete Werte.

Aufruf in artesaos/seotoolsEntsprechung in Rankbeam
SEOMeta::setTitle($t)saveSEO(['title' => $t]) oder getSEOTitle()
SEOMeta::setDescription($d)saveSEO(['description' => $d]) oder getSEODescription()
SEOMeta::setCanonical($u)saveSEO(['canonical' => $u]) oder getUrlForSEO()
SEOMeta::addKeyword(...)saveSEO(['focus_keywords' => [...]]), siehe Audit
OpenGraph::setTitle / setDescription / addImagesaveSEO(['og_title' => …, 'og_description' => …, 'og_image' => …])
TwitterCard::setType / setTitle / setImagesaveSEO(['twitter_card' => …, 'twitter_title' => …, 'twitter_image' => …])
JsonLd::setType(...) / JsonLdMultiJSON-LD-Schema-Graph (EN)
Standardwerte aus config/seotools.phpconfig/seo.php und Resolver-Priorität
{!! SEO::generate() !!} im Layout@seo($model), siehe Blade (EN)

Statt in jedem Controller Tags zu setzen, speicherst du SEO-Daten pro Modell in seo_meta und lässt den Resolver sie ausgeben. Websiteweite Fallbacks werden zu Konfigurationswerten (EN). Statische Seiten pro Route verwenden @seoForRoute().

Von Spatie-Paketen

Es gibt kein Metadatenspeicherpaket spatie/laravel-seo. Die häufig mit SEO kombinierten Spatie-Pakete sind ergänzende Builder, die du einzeln behalten oder ersetzen kannst:

  • spatie/schema-org: Ein Fluent-Builder für JSON-LD. Rankbeam bietet einen eigenen Schema-Graphen (EN) mit typisierten Buildern für Article, FAQPage, Product, BreadcrumbList, LocalBusiness und Organization. Sie speichern in seo_meta.schema_jsonld und vermeiden doppelte Ausgabe. Bestehende Objekte kannst du mit ->toArray() an saveSEO(['schema_jsonld' => $array]) übergeben oder mit Rankbeams Buildern neu ausdrücken.
  • spatie/laravel-sitemap: Rankbeams Sitemap-Registry baut darauf auf. Registriere Modelle als Quellen einer gemeinsamen Sitemap oder behalte deine vorhandene Spatie-Sitemap und deaktiviere Rankbeams Route.

Für romanzipp/laravel-seo, einen weiteren Laufzeit-Builder, gilt dasselbe Muster wie bei artesaos: setTitle-/addMeta-Aufrufe werden zu saveSEO() oder berechneten Gettern.

Importer erweitern

Hinter seo:import-from steht eine kleine Registry für Implementierungen von Rankbeam\Seo\Importing\Contracts\Importer. Neue Quellen benötigen keine Änderung am Befehl. Enthalten sind ralphjsmit und die WordPress-Importer (EN) wordpress-csv, yoast und rank-math. Eigene Quellen registrierst du in einem Service Provider:

php
use Rankbeam\Seo\Importing\ImporterRegistry;

$this->app->afterResolving(ImporterRegistry::class, function (ImporterRegistry $registry) {
    $registry->register('my-source', \App\Seo\MyImporter::class);
});

rankbeam/laravel-seo steht unter der MIT-Lizenz.