Vai al contenuto

Migrazione da altri pacchetti SEO Laravel

Questa guida collega le API e i dati dei pacchetti più comuni al trait HasSEO e a saveSEO(). Per i metadati salvati per modello da ralphjsmit è disponibile un importatore da riga di comando.

Arrivi da WordPress?

Per siti con Yoast o Rank Math, consulta la migrazione da WordPress (EN): include l'importatore CSV e i lettori del database.

Pacchetto di partenzaDove salva i datiPercorso
ralphjsmit/laravel-seoTabella polimorfica seophp artisan seo:import-from ralphjsmit e sostituzione del trait
artesaos/seotoolsNessuna tabella: runtime e configurazioneSostituzione delle chiamate con saveSEO() o getter calcolati
spatie/*Nessuna tabella SEO: builder schema-org e sitemapMantieni i componenti complementari e migra gli altri

Tra questi, solo ralphjsmit salva i metadati in una tabella da importare. Gli altri costruiscono tag durante la richiesta: trasferisci le relative chiamate in valori salvati o calcolati.

Da ralphjsmit/laravel-seo

Il pacchetto salva una riga polimorfica per modello nella tabella seo, con una struttura vicina a seo_meta. L'importazione può quindi essere eseguita in modo idempotente.

1. Installa Rankbeam accanto al pacchetto esistente

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

I due pacchetti possono coesistere durante la migrazione: usano tabelle e namespace dei trait diversi.

La chiave di configurazione è condivisa

Un config/seo.php pubblicato da ralphjsmit può nascondere la configurazione Rankbeam. Fanne una copia, rimuovilo e pubblica quello Rankbeam con php artisan vendor:publish --tag=seo-config.

2. Esegui l'importatore

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

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

L'importatore legge la tabella seo, risolve ogni riga nel relativo modello Eloquent e scrive in seo_meta.

OpzioneEffetto
--dry-runMostra cosa verrebbe importato senza scrivere
--model="App\Models\Post"Limita l'importazione a una o più classi, ripetibile
--locale=frLingua delle righe importate; default: lingua dell'app
--table=legacy_seoNome alternativo della tabella sorgente
--connection=legacyConnessione da cui leggere la sorgente
--limit=100Massimo di righe, utile per procedere per lotti
--overwriteSostituisce anche i valori non vuoti; senza questa opzione riempie solo quelli vuoti
--jsonReport in formato elaborabile
--forceSalta la conferma interattiva, per script e CI

Ripetere l'importazione aggiorna le stesse righe senza crearne di duplicate. Per impostazione predefinita vengono riempiti solo i campi vuoti: i valori già impostati in Rankbeam restano invariati. Usa --overwrite solo se vuoi sostituirli.

3. Sostituisci il trait sui modelli

I nomi dei metodi differiscono in parte. Il trait Rankbeam legge seo_meta:

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

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

Se usavi getDynamicSEOData(), trasferisci la logica nei getter per campo di Rankbeam: getSEOTitle(), getSEODescription(), getSEOImage(), getUrlForSEO() e getSEOAlternates(). Consulta la guida rapida. I valori espliciti si salvano con:

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',
]);

Mappatura dei campi

L'importatore mappa i campi esplicitamente: non copia colonne assenti nello schema del core 3.

seo di ralphjsmitseo_meta di RankbeamNote
model_type / model_idseoable_type / seoable_idRicalcolati dal modello corrente, non copiati direttamente
titletitleTroncato a 70 caratteri, limite della colonna; il report segnala le riduzioni
descriptiondescriptionTroncata a 160 caratteri, con segnalazione
canonical_urlcanonical
robotsrobotsTroncato a 50 caratteri
imageog_imageIl resolver lo usa anche come fallback di twitter:image
authorNon importatoIl core 3 non ha questa colonna in seo_meta. L'autore dell'articolo si gestisce nella risoluzione; il report conta le righe con autore per consentirti di decidere dove trasferirlo
id, created_at, updated_atNon importatiCampi strutturali

Perché il tipo polimorfico viene ricalcolato: l'importatore risolve il modello reale e usa il suo getMorphClass(). La relazione segue così la morph map corrente dell'app, anche se la sorgente usava un'altra convenzione. Le righe di modelli eliminati vengono saltate e segnalate, senza creare record orfani.

Come leggere il report

Senza --json, il comando mostra gli esiti e tre sezioni da controllare:

  • Truncated: valori accorciati per rispettare la colonna di destinazione.
  • Not imported: colonne con dati, come author, senza una destinazione nel core 3.
  • Skipped rows by reason: righe vuote, modelli eliminati o tipi non risolvibili.

Verifica

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

Dopo aver verificato il risultato, puoi rimuovere ralphjsmit/laravel-seo e la sua tabella seo.

Da artesaos/seotools

Questo pacchetto costruisce i tag a runtime tramite SEOMeta, OpenGraph, TwitterCard e JsonLd, spesso nel controller, con default in config/seotools.php. Non salva dati per modello: non c'è una tabella da importare.

Chiamata artesaos/seotoolsEquivalente Rankbeam
SEOMeta::setTitle($t)saveSEO(['title' => $t]) oppure getSEOTitle()
SEOMeta::setDescription($d)saveSEO(['description' => $d]) oppure getSEODescription()
SEOMeta::setCanonical($u)saveSEO(['canonical' => $u]) oppure getUrlForSEO()
SEOMeta::addKeyword(...)saveSEO(['focus_keywords' => [...]]); vedi audit
OpenGraph::setTitle / setDescription / addImagesaveSEO(['og_title' => …, 'og_description' => …, 'og_image' => …])
TwitterCard::setType / setTitle / setImagesaveSEO(['twitter_card' => …, 'twitter_title' => …, 'twitter_image' => …])
JsonLd::setType(...) / JsonLdMultiGrafo JSON-LD (EN)
Default di config/seotools.phpDefault di config/seo.php e priorità del resolver
{!! SEO::generate() !!} nel layout@seo($model); vedi Blade (EN)

Invece di impostare i tag in ogni controller, salva i dati una volta per modello e lascia che il resolver li emetta. I fallback del sito passano alla configurazione Rankbeam (EN); per pagine statiche associate a rotte usa @seoForRoute().

Da pacchetti Spatie

I builder Spatie comunemente usati per SEO non costituiscono una tabella di metadati da importare. Puoi mantenere o sostituire i singoli componenti:

  • spatie/schema-org: builder JSON-LD fluente. Rankbeam offre un grafo schema (EN) con builder Article, FAQPage, Product, BreadcrumbList, LocalBusiness e Organization, salvati in seo_meta.schema_jsonld e deduplicati nel rendering. Puoi passare il risultato ->toArray() degli oggetti Spatie a saveSEO(['schema_jsonld' => $array]), oppure ricostruirli con i builder Rankbeam.
  • spatie/laravel-sitemap: il registro Rankbeam lo usa già. Registra i modelli come sorgenti oppure mantieni la tua sitemap Spatie e disabilita la rotta Rankbeam.

Per romanzipp/laravel-seo, che costruisce metatag a runtime, segui lo stesso criterio di artesaos: sposta le chiamate setTitle e addMeta in saveSEO() o nei getter calcolati.

Estendi l'importatore

seo:import-from usa un registro di implementazioni Rankbeam\Seo\Importing\Contracts\Importer. Le sorgenti incluse sono ralphjsmit e quelle WordPress: wordpress-csv, yoast, rank-math, descritte nella guida WordPress (EN). Aggiungi una sorgente nel 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 è distribuito con licenza MIT.