WordPressからの移行
コンテンツサイトをWordPressから移行する場合、Rankbeamは、チームがYoastやRank Mathで手作業で設定したSEOメタデータをLaravelモデルへ引き継げます。タイトル、ディスクリプション、正規URL、robots指示、フォーカスキーワード、ソーシャル用の上書き値を移し、長年の最適化を切り替えで失わずに済みます。
実際に稼働環境を切り替える場合
このページは、インポーターのフィールド対応、トークン、移行元キーを説明するリファレンスです。併存、インポート、検証、廃止の順で進める、リスクを抑えた具体的な手順には、WordPress移行手順書を使ってください。
方法は2つあり、どちらも同じseo:import-fromコマンドを使います。
| 方法 | ソース | 適した用途 |
|---|---|---|
CSV wordpress-csv | WordPressからエクスポートした表 | 多くの制作会社の移行案件。対象URLを正確に指定できます。 |
データベース yoast / rank-math | 稼働中のWordPressデータベース | OpenGraph/Twitterの上書き値やRank Mathのリダイレクトも含む、詳細な移行。 |
どちらも冪等で、再実行しても同じ行を更新し、重複を作りません。**--dry-runに対応し、デフォルトでは空のフィールドを埋めるだけです。Rankbeamに設定済みのSEOデータは上書きしません。既存値をインポート値で置き換える場合は、--overwrite**を指定します。
WordPressの行をseo_meta行に変換する方法
WordPressのデータはLaravelのポリモーフィックデータではありません。WordPressの行はURLまたは投稿IDをキーとしますが、Rankbeamのseo_metaはポリモーフィックで、各行は実在するEloquentモデルに紐づきます。そのため、インポーターは各WordPress行をアプリのモデルと照合し、モデルに紐づいた行とURLだけの行をレポートで明確に分けます。
- モデルに紐づく行。
--model="App\Models\Post"で対象モデルを指定します。各行のスラッグ(URLの最後のパス要素、またはWordPressのpost_name)を、モデルのルートキーと照合します。--match-by=で別のカラムも指定できます。一致した行はseo_metaに書き込みます。 - URLだけの行。 モデルに一致しない行、または
--modelを指定しない実行では、紐づけるモデルがないためseo_meta行を作れません。url-onlyの理由でスキップしたと報告します。その正規URLからリダイレクト候補を作れる場合はあります。
WordPressの投稿と固定ページは、通常、異なるLaravelモデルに対応します。コンテンツ種別ごとに行を絞り、インポーターを1回ずつ実行してください。
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カスタム投稿タイプはデフォルトでは対象外です
データベースリーダーが走査する投稿タイプは、**postとpage**だけです。テーマのproduct、event、pathologyなど、カスタム投稿タイプを使うサイトでは、それぞれを明示してください。--post-type=を繰り返し指定できます。
php artisan seo:import-from rank-math \
--connection=wordpress --model="App\Models\Pathology" \
--post-type=pathology --post-type=clinic1. CSVインポート
CSV方式は、多くの制作会社の移行案件に対応できます。次のヘッダーを使い、URLごとに1行をエクスポートします。列の順番は自由です。認識できない列は無視し、報告します。
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"実行します。
# 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"| カラム | seo_metaの対応先 | 補足 |
|---|---|---|
url | 照合キー | スラッグ(最後のパス要素)をモデルと照合します。必須です。 |
title | title | 70文字に切り詰め、超過した値を報告します。 |
description | description | 160文字に切り詰めます。 |
canonical | canonical | リダイレクト候補にも使います。 |
robots | robots | そのまま保存します(例:noindex, nofollow)。50文字に切り詰めます。 |
focus_keyword | focus_keywords | カンマ区切りで、先頭が主キーワードです。 |
urlがない行や、列数がヘッダーと合わない行は、不正な行としてスキップし、集計します。
2. データベースからのインポート(Yoast / Rank Math)
WordPressデータベースが残っていれば、SEOメタデータを直接読み取れます。通常のCSVエクスポートでは落ちるOpenGraph/Twitterの上書き値や、Rank Mathのリダイレクトも対象にできます。
WordPressへの接続を設定
config/database.phpに、WordPressデータベースへの接続を追加します。
'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
],
],続いてインポートします。テーブル接頭辞のデフォルトはwp_で、--table=で変更できます。
# 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_リーダーは{prefix}postsの公開済み投稿・固定ページを走査し、各投稿のプラグインメタデータを{prefix}postmetaから読み取ります。投稿のpost_nameスラッグを、アプリのモデルと照合します。
デフォルト以外のテーブル接頭辞
マネージドWordPressホストでは、ランダム化した接頭辞(wp_ではなくwppg_など)を使うことがあります。ダンプ内のCREATE TABLEの名前を確認し、実際の接頭辞--table=wppg_を渡してください。これにより{prefix}postsと{prefix}postmetaを見つけられます。
MySQL 8に復元したダンプから読み取る場合
ローカルで読み取るためWordPressダンプをMySQL 8以降へ取り込む場合は、.sqlを読み込む前に厳格なSQLモードを緩めます。WordPressの日時デフォルト'0000-00-00'は、MySQL 8のデフォルトのSTRICT/NO_ZERO_DATEモードでは拒否されます。そのためSEOインポートより前に、ダンプの取り込み自体がInvalid default value for 'post_date'で失敗します。
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';フィールドの対応
両インポーターはフィールドを明示的に対応付けます。Core 3に対応カラムがないキーは、未対応として報告し、存在しない保存先を作ることはありません。
| Yoastのメタキー | Rank Mathのメタキー | seo_meta |
|---|---|---|
_yoast_wpseo_title | rank_math_title | title |
_yoast_wpseo_metadesc | rank_math_description | description |
_yoast_wpseo_canonical | rank_math_canonical_url | canonical |
_yoast_wpseo_meta-robots-* | rank_math_robots | robots |
_yoast_wpseo_focuskw | rank_math_focus_keyword | focus_keywords |
_yoast_wpseo_opengraph-title | rank_math_facebook_title | og_title |
_yoast_wpseo_opengraph-description | rank_math_facebook_description | og_description |
_yoast_wpseo_opengraph-image | rank_math_facebook_image | og_image |
_yoast_wpseo_twitter-title | rank_math_twitter_title | twitter_title |
_yoast_wpseo_twitter-description | rank_math_twitter_description | twitter_description |
_yoast_wpseo_twitter-image | rank_math_twitter_image | twitter_image |
| — | rank_math_twitter_card_type | twitter_card |
Robots。 WordPressのデフォルトと異なる指示だけを保存します。通常のインデックス登録可能なページではrobotsをnullのままにし、サイトのデフォルトを引き継ぎます。Yoastの個別のnoindex / nofollow / 詳細フラグ(noarchive、nosnippet、noimageindex)を1つの文字列にまとめます。Rank Mathのシリアライズされたrobots配列も同様に読み取り、デフォルトのindex / followを除きます。
未対応のキーは報告し、コピーしません。添付画像のID(*-image-id)、キーワード・SEOスコア(linkdex、content_score、rank_math_seo_score)、主カテゴリーの選択、Rank Mathのリッチスニペット用スキーママーカーが対象です。スキーママーカーには、より表現力のある型付きのスキーマグラフを代わりに使えます。
正規URLは保存値のままインポートされます
明示的な正規URL(rank_math_canonical_url / _yoast_wpseo_canonical)は、保存されているとおりにコピーします。マネージド環境やステージング環境でよくあるように、ページが旧ドメインの絶対URL(例:https://oldsite-staging.example.com/page/)を正規URLに固定していた場合、移行後もそこを指します。インポーターはホストを書き換えません。--site-urlは、リダイレクト候補とCSV行の照合用に絶対URLからリクエストのパスを導出しますが、保存する正規URLは書き換えません。ドメインをまたぐ移行後は、インポートした正規URLを確認してホストを更新するか、値を消してリゾルバーの自己参照の正規URLにフォールバックさせてください。多くのページには明示的な正規URLがなく、影響しません。YoastとRank Mathは出力時に正規URLを自動生成します。
テンプレートトークン
YoastとRank Mathは、タイトルとディスクリプションをトークン付きのテンプレートとして保存します。Yoastは%%title%%、Rank Mathは%title%を使います。インポーターは導出できるトークンを解決し、それ以外を除去するため、保存値に未処理の%%token%%文字列が残ることはありません。
| トークン | 解決後の値 |
|---|---|
%%title%% / %title% | WordPressの投稿タイトル |
%%sitename%% / %sitename% | wp_optionsのブログ名(データベースからのインポート) |
%%sep%% / %sep% | - |
%%page%%、%%primary_category%%など | 除去します。空にし、周囲の区切り文字を整理します。 |
トークンを解決した実行では、そのことをレポートで知らせます。インポートしたタイトルを確認し、意図した文章になっているか確かめてください。導出できなかったトークンに依存するものは調整します。
リダイレクト
seo_redirectsはRankbeam Proの機能なので、Coreのインポーターが直接そのテーブルに書き込むことはありません。代わりに--redirects-csv=を指定すると、Proのリダイレクトテーブルと同じカラムsource_path,target_url,status_code,noteを持つCSVを出力します。これをProにインポートします。
php artisan seo:import-from rank-math \
--connection=wordpress --model="App\Models\Post" \
--redirects-csv=storage/migrations/redirects.csvリダイレクト候補は次のソースから作ります。
- CSVインポート —
canonicalが自身のurlと異なるパスを指す行から、旧パスから正規URLへの301を作ります。パスが同じ自己参照の正規URLは、ループになるため出力しません。 - Rank Mathのデータベース —
{prefix}rank_math_redirectionsテーブルの有効なルールです。完全一致のルールだけを出力します。正規表現・部分一致・前方一致・後方一致は、単一パスに対応しないためスキップして報告します。 - 無料版Yoastにはリダイレクトテーブルがありません。Yoast Premiumにだけあり、そのスキーマは無料パッケージの対象外です。YoastのリダイレクトにはCSV方式を使ってください。
候補は確認用の提案です。CSVを確認した後、seo-pro:redirects-importでProにインポートします。このコマンドはすべての行を検証し、ループ、安全でない宛先、重複を拒否します。CSVの形は固定の仕様で、リダイレクトCSV形式v1はsource_path,target_url,status_code,noteです。
レポートの内容
--jsonを使わない実行では、結果の表(created / updated / unchanged / skipped / scanned)、Verification report(検証レポート)、確認用の各セクションを表示します。
- Verification report(検証レポート) — 判断に使う内訳を一目で確認できます。matched(モデルに紐づいた行)、url-only(モデルに一致しなかった行)、切り詰め・未対応の集計です。
- Truncated(切り詰め) —
seo_metaカラムに収めるため短くした値です。 - Not imported(未インポート) — 値があったもののCore 3に保存先がないキーで、異なる
authorの値をすべて含みます。著者は保存カラムではなくgetSEOAuthor()で扱うため、黙って失うのではなく、移し先を決める値として一覧にします。 - Redirect candidates(リダイレクト候補) — 出力した件数とファイルです。
- Skipped rows by reason(理由別のスキップ行) — URLだけの行、SEOメタデータのない投稿、完全一致でないリダイレクトルールです。
- Warnings(警告) — テンプレートトークンを解決した場合などに表示します。
--jsonを加えると、上記すべてを機械可読形式で取得できます。verificationブロックにはmatched/url-onlyの件数と、著者のすべての値を含みます。
検証
php artisan seo:audit --model="App\Models\Post" --strict # CI/cutover gateいずれかのページに課題があると、--strictは0以外の終了コードを返します。無料SEO監査を参照してください。併存 → インポート → 検証 → 廃止という切り替え全体の順序は、WordPress移行手順書に従ってください。
ralphjsmit、artesaos、SpatieなどのLaravel SEOパッケージから移行する場合は、他のLaravelパッケージからの移行を参照してください。