Przejdź do treści

Migracja z WordPressa

Przenosisz witrynę z treściami z WordPressa? Rankbeam może przenieść metadane SEO ręcznie przygotowane przez Twój zespół w Yoast lub Rank Math — tytuły, opisy, kanoniczne URL-e, dyrektywy robots, główne słowa kluczowe i nadpisania społecznościowe — do modeli Laravel, aby zmiana nie oznaczała utraty lat optymalizacji.

Przeprowadzasz rzeczywiste przełączenie?

Ta strona jest dokumentacją referencyjną importera (mapowanie pól, tokeny, klucze źródłowe). Procedurę krok po kroku o ograniczonym ryzyku — współistnienie, import, weryfikacja, wycofanie starego systemu — opisuje Instrukcja migracji z WordPressa.

Są dwie ścieżki, obie obsługiwane przez to samo polecenie seo:import-from:

ŚcieżkaŹródłoNajlepsza do
CSV wordpress-csvarkusz wyeksportowany z WordPressawiększości migracji agencyjnych; kontrolujesz dokładne URL-e
Baza danych yoast / rank-mathdziałająca baza danych WordPressapełnej wierności, w tym nadpisań OpenGraph/Twitter i przekierowań Rank Math

Obie są idempotentne (ponowne uruchomienie aktualizuje te same rekordy, nigdy nie tworzy duplikatów), obsługują --dry-run i domyślnie wyłącznie uzupełniają puste pola — nigdy nie nadpisują danych SEO ustawionych już w Rankbeam. Przekaż --overwrite, aby zamiast tego zastąpić istniejące wartości importowanymi.

Jak rekordy WordPressa stają się rekordami seo_meta

Dane WordPressa nie są polimorficznymi danymi Laravel: rekord WordPressa jest identyfikowany przez URL lub ID wpisu, podczas gdy seo_meta Rankbeam jest polimorficzne — każdy rekord należy do rzeczywistego modelu Eloquent. Importer dopasowuje więc każdy rekord WordPressa do jednego z Twoich modeli i uczciwie raportuje, które rekordy zostały powiązane, a które pozostały wyłącznie URL-ami:

  • Powiązane z modelem. Wskazujesz model docelowy przez --model="App\Models\Post". Slug każdego rekordu (ostatni segment ścieżki URL-a lub post_name WordPressa) jest dopasowywany do tego modelu — domyślnie według klucza trasy lub kolumny wybranej przez --match-by=. Dopasowane rekordy są zapisywane w seo_meta.
  • Tylko URL. Rekord niepasujący do żadnego modelu (lub uruchomienie bez --model) nie może stać się rekordem seo_meta — nie ma modelu, z którym można go powiązać. Jest raportowany jako pominięty z przyczyną url-only. Jego kanoniczny URL nadal może stać się kandydatem na przekierowanie.

Wpisy i strony WordPressa zwykle odpowiadają różnym modelom Laravel, dlatego uruchamiaj importer osobno dla każdego typu treści i ograniczaj zakres rekordów:

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

Własne typy wpisów nie są domyślnie skanowane

Czytniki bazy danych przeglądają tylko typy wpisów post i page. Witryny oparte na własnych typach wpisów (product, event, pathology motywu, …) muszą jawnie wskazać każdy typ — powtarzaj --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

Ścieżka CSV obejmuje większość migracji agencyjnych. Wyeksportuj jeden rekord na URL z tym nagłówkiem (kolumny mogą być w dowolnej kolejności; nierozpoznane kolumny są ignorowane i raportowane):

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"

Uruchom:

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"
KolumnaMapowanie na seo_metaUwagi
url(klucz dopasowania)Slug (ostatni segment ścieżki) jest dopasowywany do modelu. Wymagany.
titletitleSkracane do 70 znaków; zbyt długie wartości są raportowane.
descriptiondescriptionSkracane do 160 znaków.
canonicalcanonicalSłuży również do ustalania kandydatów na przekierowania.
robotsrobotsZapisywane dosłownie (np. noindex, nofollow); skracane do 50 znaków.
focus_keywordfocus_keywordsRozdzielone przecinkami; pierwsze słowo kluczowe jest główne.

Nieprawidłowe rekordy są pomijane (i zliczane): rekord bez url lub z liczbą kolumn niezgodną z nagłówkiem.


2. Import z bazy danych (Yoast / Rank Math)

Jeśli nadal masz bazę danych WordPressa, importer może bezpośrednio odczytać metadane SEO — w tym nadpisania OpenGraph/Twitter i (dla Rank Math) przekierowania, które eksport CSV zwykle pomija.

Skieruj połączenie na WordPressa

Dodaj bazę danych WordPressa jako połączenie w 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
    ],
],

Następnie zaimportuj dane (domyślny prefiks tabel to wp_; nadpisz go przez --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_

Czytnik przegląda {prefix}posts (opublikowane wpisy/strony) i pobiera metadane wtyczki dla każdego wpisu z {prefix}postmeta, dopasowując jego slug post_name do Twojego modelu.

Niestandardowy prefiks tabel

Zarządzane hostingi WordPressa często używają losowego prefiksu (np. wppg_ zamiast wp_). Sprawdź nazwy CREATE TABLE w zrzucie i przekaż rzeczywisty prefiks — --table=wppg_ — aby czytnik znalazł {prefix}posts i {prefix}postmeta.

Odczyt z odtworzonego zrzutu w MySQL 8

Jeśli wczytałeś zrzut WordPressa do MySQL 8+, aby odczytać go lokalnie, złagodź ścisły tryb SQL przed wykonaniem .sql — domyślne wartości datetime '0000-00-00' WordPressa są odrzucane przez domyślne tryby STRICT/NO_ZERO_DATE MySQL 8, więc sam import zrzutu kończy się błędem (Invalid default value for 'post_date'), zanim rozpocznie się import SEO:

sql
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

Mapowanie pól

Oba importery mapują pola jawnie — klucz bez kolumny w Core 3 jest raportowany jako niezmapowany, nigdy nie jest wymyślany.

Klucz meta YoastKlucz meta 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. Zapisywane są tylko odstępstwa od domyślnych ustawień WordPressa, więc zwykła strona możliwa do indeksowania pozostawia robots jako null i dziedziczy domyślną wartość witryny. Osobne flagi noindex / nofollow / zaawansowane (noarchive, nosnippet, noimageindex) Yoast są składane w jeden ciąg; serializowana tablica robots Rank Math jest odczytywana tak samo, z pominięciem wartości domyślnych index / follow.

Niezmapowane klucze (raportowane, nigdy kopiowane): identyfikatory załączonych obrazów (*-image-id), oceny słów kluczowych/SEO (linkdex, content_score, rank_math_seo_score), wybór kategorii głównej i znaczniki danych strukturalnych wyników rozszerzonych Rank Math — graf danych strukturalnych jest ich bogatszym, typowanym zamiennikiem.

Kanoniczne URL-e są importowane dosłownie

Jawny kanoniczny URL (rank_math_canonical_url / _yoast_wpseo_canonical) jest kopiowany dokładnie tak, jak go zapisano. Jeśli strona przypisała kanoniczny URL do bezwzględnego adresu w starej domenie — co często zdarza się na hostingach zarządzanych/stagingowych, np. https://oldsite-staging.example.com/page/ — po imporcie nadal tam wskazuje; importer nigdy nie przepisuje hosta. --site-url wyprowadza ścieżki żądań z bezwzględnych URL-i dla kandydatów na przekierowania i dopasowania rekordów CSV, ale nie przepisuje zapisanych wartości kanonicznych. Po zmianie domeny przejrzyj zaimportowane kanoniczne URL-e i zaktualizuj hosta — lub wyczyść je, aby resolver użył adresu kanonicznego wskazującego na samą stronę. (Większość stron nie ma jawnego kanonicznego URL-a i nie podlega temu problemowi; Yoast i Rank Math automatycznie ustalają go podczas renderowania).

Tokeny szablonów

Yoast i Rank Math zapisują tytuły i opisy jako szablony z tokenami — Yoast używa %%title%%, Rank Math — %title%. Importer rozstrzyga tokeny, które może wyprowadzić, i usuwa pozostałe, więc zapisana wartość nigdy nie jest surowym ciągiem %%token%%:

TokenRozstrzygany do
%%title%% / %title%tytułu wpisu WordPressa
%%sitename%% / %sitename%nazwy bloga z wp_options (import z bazy danych)
%%sep%% / %sep%-
%%page%%, %%primary_category%%, …usuwany (pozostaje pusty, otaczające separatory są porządkowane)

Jeśli uruchomienie rozstrzygnęło jakikolwiek token, raport o tym informuje — przejrzyj zaimportowane tytuły, aby potwierdzić, że brzmią tak, jak chcesz, i popraw te nieliczne, które zależały od tokenów niemożliwych do wyprowadzenia.


Przekierowania

seo_redirects jest funkcją Rankbeam Pro, więc importer rdzenia nigdy nie zapisuje bezpośrednio do tej tabeli. Zamiast tego przekaż --redirects-csv=, a importer wygeneruje CSV z tymi samymi kolumnami co tabela przekierowań Pro — source_path,target_url,status_code,note — który zaimportujesz do Pro.

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

Skąd pochodzą kandydaci na przekierowania:

  • Import CSV — rekord, którego canonical wskazuje inną ścieżkę niż jego własny url, staje się 301 ze starej ścieżki do adresu kanonicznego. Adres kanoniczny wskazujący tę samą ścieżkę nie jest generowany (powstałaby pętla).
  • Baza danych Rank Math — aktywne reguły w tabeli {prefix}rank_math_redirections. Generowane są tylko reguły dokładnego dopasowania; reguły regex/contains/start/end są raportowane jako pominięte, ponieważ nie odpowiadają jednej ścieżce.
  • Yoast (bezpłatny) nie ma tabeli przekierowań — ma ją tylko Yoast Premium, a jej schemat nie należy do bezpłatnego pakietu. Do przekierowań Yoast użyj ścieżki CSV.

Kandydaci są propozycjami — przejrzyj CSV, a następnie zaimportuj go do Pro przez seo-pro:redirects-import, które waliduje każdy rekord (odrzucając pętle, niebezpieczne cele i duplikaty). Struktura CSV jest stabilnym kontraktem — format CSV przekierowań v1: source_path,target_url,status_code,note.


Co mówi raport

Uruchomienie bez --json wyświetla tabelę wyników (utworzone / zaktualizowane / bez zmian / pominięte / przeskanowane), raport weryfikacji i sekcje do przeglądu:

  • Raport weryfikacji — zwięzły podział do zatwierdzenia: dopasowane (rekordy powiązane z modelem), tylko URL (bez dopasowania do modelu) oraz liczby skróconych i niezmapowanych wartości.
  • Skrócone — wartości skrócone, aby zmieściły się w kolumnie seo_meta.
  • Niezaimportowane — klucze źródłowe, które zawierały dane, ale nie mają odpowiednika w Core 3, w tym każda odrębna wartość author (autor nie jest zapisywaną kolumną — należy do getSEOAuthor() — dlatego raport wymienia dane do przeniesienia w inne miejsce, zamiast pozwalać im zniknąć po cichu).
  • Kandydaci na przekierowania — ile zapisano i do którego pliku.
  • Pominięte rekordy według przyczyny — rekordy tylko z URL-em, wpisy bez metadanych SEO, reguły przekierowań inne niż dokładne dopasowanie.
  • Ostrzeżenia — np. o rozstrzygnięciu tokenów szablonów.

Dodaj --json, aby otrzymać wszystkie powyższe informacje w wersji do odczytu maszynowego (blok verification zawiera liczby dopasowanych rekordów i rekordów tylko z URL-em oraz każdą wartość autora).

Weryfikacja

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

--strict kończy się kodem różnym od zera, jeśli dowolna strona ma problem. Zobacz Bezpłatny audyt SEO. Pełną, uporządkowaną procedurę przełączenia — współistnienie → import → weryfikacja → wycofanie starego systemu — opisuje Instrukcja migracji z WordPressa.


Przechodzisz z pakietu SEO dla Laravel (ralphjsmit, artesaos, Spatie)? Zobacz Migracja z innych pakietów Laravel.

rankbeam/laravel-seo jest udostępniany na licencji MIT.