Přejít na obsah

Migrace z WordPressu

Převádíte obsahový web z WordPressu? Rankbeam dokáže přenést metadata SEO, která váš tým ručně napsal v Yoastu nebo Rank Math, do modelů Laravelu: titulky, popisy, kanonické URL, direktivy robots, hlavní klíčová slova i vlastní hodnoty pro sociální sítě. Při přechodu tak nepřijdete o roky optimalizace.

Provádíte skutečný přechod?

Tato stránka je referencí importéru: mapování polí, tokeny a zdrojové klíče. Podrobný postup s omezením rizik — souběžný provoz, import, ověření a následné vyřazení původního systému — najdete v postupu migrace z WordPressu.

Existují dvě cesty. Obě používají stejný příkaz seo:import-from:

CestaZdrojNejvhodnější použití
CSV wordpress-csvtabulka exportovaná z WordPressuvětšina agenturních migrací; máte kontrolu nad přesnými URL
Databáze yoast / rank-mathexistující databáze WordPressuúplný přenos včetně vlastních hodnot OpenGraph/Twitter a přesměrování Rank Math

Obě cesty jsou idempotentní: opakované spuštění aktualizuje stejné řádky a nevytváří duplikáty. Podporují --dry-run a ve výchozím nastavení pouze doplňují prázdná pole, takže nepřepisují data SEO už nastavená v Rankbeamu. Pro nahrazení existujících hodnot importovanými předejte --overwrite.

Jak se z řádků WordPressu stávají řádky seo_meta

Data WordPressu nejsou polymorfní data Laravelu. Řádek WordPressu identifikuje URL nebo ID příspěvku, zatímco seo_meta Rankbeamu je polymorfní: každý řádek patří skutečnému modelu Eloquent. Importér proto páruje řádky WordPressu s vašimi modely a v reportu rozlišuje připojené řádky od řádků obsahujících pouze URL:

  • Připojené k modelu. Cílový model určíte pomocí --model="App\Models\Post". Slug každého řádku, tedy poslední segment cesty URL nebo post_name WordPressu, se páruje s modelem. Standardně podle klíče trasy, případně podle sloupce zvoleného přes --match-by=. Spárované řádky se zapíší do seo_meta.
  • Pouze URL. Řádek, pro který se nenajde model, nebo běh bez --model nemůže vytvořit řádek seo_meta: chybí model, ke kterému by se připojil. V reportu bude přeskočen s důvodem url-only. Jeho kanonická URL může přesto vytvořit návrh přesměrování.

Příspěvky a stránky WordPressu obvykle odpovídají různým modelům Laravelu. Spusťte proto importér zvlášť pro každý typ obsahu a omezte výběr řádků:

bash
php artisan seo:import-from yoast --model="App\Models\Post" --post-type=post
php artisan seo:import-from yoast --model="App\Models\Page" --post-type=page

Vlastní typy příspěvků se standardně neprocházejí

Databázové čtečky procházejí pouze typy post a page. Weby s vlastními typy příspěvků, například product, event či pathology ze šablony, musí každý typ uvést výslovně opakováním --post-type=:

bash
php artisan seo:import-from rank-math \
  --connection=wordpress --model="App\Models\Pathology" \
  --post-type=pathology --post-type=clinic

1. Import CSV

CSV pokrývá většinu agenturních migrací. Exportujte jeden řádek na URL s touto hlavičkou. Sloupce mohou být v libovolném pořadí; nerozpoznané se ignorují a uvedou v reportu:

csv
url,title,description,canonical,robots,focus_keyword
https://oldsite.com/blog/my-post/,"My SEO Title","My meta description.",https://newsite.com/blog/my-post,"index, follow","laravel seo"

Spusťte import:

bash
# Preview first — writes nothing
php artisan seo:import-from wordpress-csv \
  --file=storage/migrations/seo-export.csv \
  --model="App\Models\Post" \
  --dry-run

# Then import for real
php artisan seo:import-from wordpress-csv \
  --file=storage/migrations/seo-export.csv \
  --model="App\Models\Post"
SloupecMapování do seo_metaPoznámky
url(párovací klíč)Slug, poslední segment cesty, se páruje s modelem. Povinný.
titletitleZkráceno na 70 znaků; příliš dlouhé hodnoty jsou v reportu.
descriptiondescriptionZkráceno na 160 znaků.
canonicalcanonicalPoužívá se také pro návrhy přesměrování.
robotsrobotsUloží se doslova, například noindex, nofollow; zkráceno na 50 znaků.
focus_keywordfocus_keywordsOddělená čárkami; první klíčové slovo je hlavní.

Chybné řádky se přeskočí a započítají: řádky bez url nebo s počtem sloupců neodpovídajícím hlavičce.


2. Import z databáze (Yoast / Rank Math)

Pokud stále máte databázi WordPressu, importér může číst metadata SEO přímo, včetně vlastních hodnot OpenGraph/Twitter a u Rank Math také přesměrování. Ty se při exportu do CSV obvykle ztratí.

Nastavte připojení k WordPressu

Přidejte databázi WordPressu jako připojení do config/database.php:

php
'connections' => [
    // ...
    'wordpress' => [
        'driver' => 'mysql',
        'host' => env('WP_DB_HOST', '127.0.0.1'),
        'database' => env('WP_DB_DATABASE', 'wordpress'),
        'username' => env('WP_DB_USERNAME'),
        'password' => env('WP_DB_PASSWORD'),
        'prefix' => '', // the table prefix is passed with --table=, see below
    ],
],

Potom importujte. Výchozí prefix tabulek je wp_; přepíšete jej pomocí --table=:

bash
# Yoast SEO
php artisan seo:import-from yoast \
  --connection=wordpress --model="App\Models\Post" --dry-run

# Rank Math
php artisan seo:import-from rank-math \
  --connection=wordpress --model="App\Models\Post" --table=wp_

Čtečka prochází {prefix}posts, tedy publikované příspěvky a stránky, a metadata pluginu získává pro každý příspěvek z {prefix}postmeta. Slug post_name každého příspěvku páruje s vaším modelem.

Nestandardní prefix tabulek

Spravované hostingy WordPressu často používají náhodný prefix, například wppg_ místo wp_. Zkontrolujte názvy CREATE TABLE v databázovém exportu a předejte skutečný prefix, například --table=wppg_, aby čtečka našla {prefix}posts a {prefix}postmeta.

Čtení obnoveného exportu v MySQL 8

Pokud načítáte export WordPressu do MySQL 8+ pro místní čtení, před spuštěním .sql zmírněte přísný režim SQL. Výchozí hodnoty datetime '0000-00-00' z WordPressu odmítají výchozí režimy MySQL 8 STRICT/NO_ZERO_DATE. Import databázového exportu by tak selhal s Invalid default value for 'post_date' ještě před spuštěním importu SEO:

sql
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

Mapování polí

Oba importéry mapují pole výslovně. Klíč bez odpovídajícího sloupce v Core 3 se označí jako unmapped, nikdy se pro něj nevymýšlí nové pole.

Klíč metadat YoastKlíč metadat Rank Mathseo_meta
_yoast_wpseo_titlerank_math_titletitle
_yoast_wpseo_metadescrank_math_descriptiondescription
_yoast_wpseo_canonicalrank_math_canonical_urlcanonical
_yoast_wpseo_meta-robots-*rank_math_robotsrobots
_yoast_wpseo_focuskwrank_math_focus_keywordfocus_keywords
_yoast_wpseo_opengraph-titlerank_math_facebook_titleog_title
_yoast_wpseo_opengraph-descriptionrank_math_facebook_descriptionog_description
_yoast_wpseo_opengraph-imagerank_math_facebook_imageog_image
_yoast_wpseo_twitter-titlerank_math_twitter_titletwitter_title
_yoast_wpseo_twitter-descriptionrank_math_twitter_descriptiontwitter_description
_yoast_wpseo_twitter-imagerank_math_twitter_imagetwitter_image
rank_math_twitter_card_typetwitter_card

Robots. Ukládají se jen odchylky od výchozích hodnot WordPressu. Běžná indexovatelná stránka proto ponechá robots jako null a zdědí výchozí nastavení webu. Samostatné příznaky Yoastu noindex / nofollow a pokročilé příznaky noarchive, nosnippet, noimageindex se složí do jednoho řetězce. Serializované pole robots Rank Math se čte stejně, s vynecháním výchozích index / follow.

Nenamapované klíče, které se uvedou v reportu a nikdy se nekopírují: ID přiložených obrázků (*-image-id), skóre klíčových slov či SEO (linkdex, content_score, rank_math_seo_score), volby hlavní kategorie a značky schématu pro rozšířené výsledky Rank Math. Bohatší typovanou náhradou poslední skupiny je graf schématu.

Kanonické URL se importují doslova

Výslovná kanonická URL (rank_math_canonical_url / _yoast_wpseo_canonical) se kopíruje přesně tak, jak je uložená. Pokud stránka pevně nastavila absolutní kanonickou URL na staré doméně, což je běžné na spravovaných či stagingových hostinzích, například https://oldsite-staging.example.com/page/, bude tam odkazovat i po importu. Importér hostitele nikdy nepřepisuje. Volba --site-url odvozuje z absolutních URL cesty pro návrhy přesměrování a párování řádků CSV, ale uložené kanonické hodnoty nepřepisuje. Po změně domény zkontrolujte importované kanonické adresy a upravte hostitele nebo je vymažte, aby resolver odvodil kanonickou URL vlastní stránky. Většina stránek nemá výslovnou kanonickou URL a tento problém se jich netýká: Yoast i Rank Math ji automaticky vytvářejí při vykreslování.

Tokeny šablon

Yoast a Rank Math ukládají titulky a popisy jako šablony s tokeny. Yoast používá %%title%%, Rank Math %title%. Importér vyhodnotí tokeny, jejichž hodnotu dokáže odvodit, a ostatní odstraní, takže se nikdy neuloží doslovný řetězec %%token%%:

TokenVýsledná hodnota
%%title%% / %title%titulek příspěvku WordPressu
%%sitename%% / %sitename%název blogu z wp_options při databázovém importu
%%sep%% / %sep%-
%%page%%, %%primary_category%%, …odstraněno; ponechá se prázdné místo a okolní oddělovače se uklidí

Pokud běh vyhodnotil některý token, uvede to v reportu. Zkontrolujte importované titulky, zda odpovídají zamýšlenému znění, a upravte ty, které závisely na tokenech, jejichž hodnotu se nepodařilo odvodit.


Přesměrování

seo_redirects je funkcí Rankbeamu Pro, takže importér Core do této tabulky nikdy přímo nezapisuje. Místo toho předejte --redirects-csv= a importér vytvoří CSV se stejnými sloupci jako tabulka přesměrování Pro — source_path,target_url,status_code,note — které následně importujete do Pro.

bash
php artisan seo:import-from rank-math \
  --connection=wordpress --model="App\Models\Post" \
  --redirects-csv=storage/migrations/redirects.csv

Odkud pocházejí návrhy přesměrování:

  • Import CSV — řádek, jehož canonical směřuje na jinou cestu než jeho vlastní url, vytvoří 301 ze staré cesty na kanonickou URL. Při kanonické URL se stejnou cestou se přesměrování nevytvoří, protože by vznikla smyčka.
  • Databáze Rank Math — aktivní pravidla v tabulce {prefix}rank_math_redirections. Vytvářejí se pouze pravidla přesné shody. Regex, obsahuje, začíná a končí se označí jako přeskočené, protože neodpovídají jediné cestě.
  • Bezplatný Yoast nemá tabulku přesměrování. Má ji pouze Yoast Premium a její schéma není součástí bezplatného balíčku. Pro přesměrování Yoastu použijte CSV.

Jde o návrhy ke kontrole. Projděte CSV a potom je importujte do Pro pomocí seo-pro:redirects-import, který validuje každý řádek a odmítá smyčky, nebezpečné cíle i duplikáty. Struktura CSV je stabilní kontrakt: formát CSV přesměrování v1: source_path,target_url,status_code,note.


Co vám řekne report

Běh bez --json vypíše tabulku výsledků (created / updated / unchanged / skipped / scanned), Verification report a části ke kontrole:

  • Verification report — přehled, který před pokračováním schválíte: matched jsou řádky připojené k modelu, url-only řádky bez modelu; doplňují je počty zkrácených a nenamapovaných hodnot.
  • Truncated — hodnoty zkrácené na délku sloupce v seo_meta.
  • Not imported — zdrojové klíče obsahující data bez odpovídajícího místa v Core 3, včetně každé odlišné hodnoty author. Autor není uložený sloupec, řeší jej getSEOAuthor(). Report proto uvádí, co je třeba přesunout jinam, aby údaj nepozorovaně nezmizel.
  • Redirect candidates — počet zapsaných návrhů přesměrování a cílový soubor.
  • Skipped rows by reason — řádky pouze s URL, příspěvky bez metadat SEO a přesměrování bez přesné shody.
  • Warnings — například upozornění na vyhodnocení tokenů šablon.

Přidejte --json pro strojově čitelnou podobu všech těchto údajů. Blok verification obsahuje počty matched/url-only a každou hodnotu autora.

Ověření

bash
php artisan seo:audit --model="App\Models\Post" --strict   # CI/cutover gate

--strict skončí s nenulovým stavem, pokud má kterákoli stránka problém. Viz Bezplatný SEO audit. Úplný postup přechodu v pořadí souběžný provoz → import → ověření → vyřazení původního systému najdete v postupu migrace z WordPressu.


Přecházíte místo toho z balíčku SEO pro Laravel, například ralphjsmit, artesaos nebo Spatie? Viz Migrace z jiných balíčků pro Laravel.

rankbeam/laravel-seo je distribuován pod licencí MIT.