タグアーカイブ URL置換

URLに特定の単語を含むリンクを一括でホームページに置換する方法

URLに特定の単語を含むリンクを一括でホームページに置換する方法

URL に特定の単語(例 sandwich)を含む全リンクを一括でホームページに置換するには、Search Regex プラグインか phpMyAdmin の正規表現置換を使う。単純な完全一致検索しかできないツールでは対処できないため、部分一致の条件を指定できる方法が必須になる。

なぜ通常の「Better Search Replace」では置換できないのか

なぜ通常の「Better Search Replace」では置換できないのか

「Better Search Replace」のような一般的なプラグインは、検索文字列とまったく同じ URL しか見つけられない。旧サイトから移管した際に「sandwich-f07abf」や「sandwich/xyz」のように末尾にランダムな文字列が付与されたリンクが数百件ある場合、完全一致で一つひとつ指定するのは現実的ではない。今回のように「URL の一部が特定のキーワードで、あとは異なる」パターンには、正規表現によるパターンマッチが必要になる。

Search Regex プラグインで部分一致 URL を一括置換する

Search Regex プラグインで部分一致 URL を一括置換する

Search Regex は、正規表現を使ってデータベース内の投稿やカスタムフィールド、オプションなどを検索・置換できるプラグインだ。ドライラン(事前確認)機能がなく直接置換が走るため、必ず事前にデータベース全体のバックアップを取る必要がある。

設定手順

STEP 1 Search Regex をインストールして有効化する
STEP 2 検索パターンに http[^\s]*sandwich[^\s]* を入力
STEP 3 置換後文字列に / を入力
STEP 4 「Replace」を実行(事前に必ずバックアップを取る)

Search Regex では、検索対象のカラム(post_content、post_excerpt、guid など)やテーブルを選択できる。すべてにチェックを入れると想定外のレコードまで置換されることがあるため、最初は post_content だけに絞って実行し、結果を確認するのが安全だ。置換に成功した場合、変更の取り消しは手動で行う必要がある点を覚えておく。

検索パターンの正規表現解説

http[^\s]*sandwich[^\s]* は「http で始まり sandwich を含み空白文字が出るまでの連続した URL」を意味する。[^\s]* の部分で、sandwich の前後にどんな文字が並んでいても対象に含めることができる。これにより sandwich-f07abf も sandwich/xyz もすべて拾える。もしホームページではなく完全に削除したい場合は、置換後文字列を空欄にすればよいが、リンク切れを起こすよりもホームページへ誘導するほうが SEO 上も望ましい。

Before(エラー状態)
https://example.com/sandwich/xyz → 404
https://example.com/sandwich-f07abf → 404
After(修正後)
https://example.com/ → ホームページ
https://example.com/ → ホームページ
エラー状態  修正後

phpMyAdmin でデータベースから直接置換する方法

phpMyAdmin でデータベースから直接置換する方法

より高度な操作として、phpMyAdmin を使う方法もある。phpMyAdmin はレンタルサーバーの管理画面からアクセスできる MySQL データベース操作ツールだ。検索機能で該当するレコードを洗い出したあと、SQL の UPDATE 文で一括置換する。

特定のキーワードを含むレコードを検索する

phpMyAdmin にログインし、WordPress のデータベースを選択する。「検索」タブでキーワード「sandwich」を入力し、全テーブルを対象に検索をかける。該当行が表示されるので、どのテーブルのどのカラムに URL が含まれているかを特定できる。

SQL で一括置換をかける

影響範囲を特定したら、次のような UPDATE 文を実行する。ここでも誤操作を防ぐため、必ず事前にバックアップを取る。

UPDATE wp_posts SET post_content = 
REPLACE(post_content, 
'https://example.com/sandwich-f07abf', 
'/')
WHERE post_content LIKE '%sandwich%';

ただし、この方法は完全一致の REPLACE 関数を使うため、ランダム文字列が多様な場合は検索文字列を動的に扱えない。代わりに REGEXP_REPLACE が使える MySQL 8.0 以降の環境、または MariaDB 10.0.5 以降なら、正規表現による置換が行える。

UPDATE wp_posts SET post_content = 
REGEXP_REPLACE(post_content, 
'https?://[^\s]*sandwich[^\s]*', 
'/')
WHERE post_content REGEXP 'https?://[^\s]*sandwich[^\s]*';

この SQL は、http または https で始まり sandwich を含み空白が出るまでの URL をすべて抜き出し、ホームページ(/)に置換する。データベース全体にわたって同様の処理が必要なら、postmeta や options テーブルなどにも同じ UPDATE 文を適用する。

置換前に必ず取るべき安全策

置換前に必ず取るべき安全策

Search Regex も phpMyAdmin も、一度実行すると元に戻せない操作になる。必ず次の 3 つを行う。

  • データベース全体のエクスポート(バックアップ)を取る
  • 可能ならステージング環境で先にテストする
  • 置換後はサイト全体を巡回し、表示崩れやリンク切れがないか確認する

ステージング環境が用意できない場合は、本番で実行する前に影響範囲を最小に絞る。Search Regex であれば、最初は post_content だけを対象にし、問題なければ他のカラムを追加していくと安全だ。

よくある質問

Search Regex と「Better Search Replace」はどう使い分ける?

完全に同じ文字列しか置換できないのが Better Search Replace で、部分一致や正規表現を使いたい場合は Search Regex になる。ただし Search Regex はドライランができないので、安全を重視するなら、まず Better Search Replace で置換できる部分を先に処理し、残った複雑なパターンだけを Search Regex で片付ける手順が堅実だ。

phpMyAdmin で誤って必要なデータまで置換してしまったら?

バックアップファイルをインポートして復元する。phpMyAdmin の「インポート」タブからエクスポートしておいた SQL ファイルを選択し実行すれば、置換前の状態に戻せる。バックアップを取らずに操作してしまった場合は、復元は極めて困難になるため、作業前のバックアップは必須だ。

置換後に画像や内部リンクが壊れていないか心配だ

リンクチェッカー系のプラグイン(Broken Link Checker など)を一時的に導入し、サイト全体のリンク切れをスキャンするとよい。置換してから数時間後に確認すれば、見落としがあっても早期に気づける。スキャン後は負荷を避けるため、プラグインを無効化しておく。

URL の一部に「sandwich」を含むが、それ以外の部分は維持したい場合は?

キャプチャグループ(丸括弧)を使う。たとえば sandwich より前のパスだけを残したいなら (https?://[^\s]*)sandwich[^\s]* とし、置換後文字列に $1 を指定する。置換の条件は柔軟に調整できるため、削除する範囲や残す範囲を細かく制御できる。

Search Regex の代わりに WP-CLI で置換できる?

WP-CLI が使える環境なら wp search-replace コマンドで正規表現を扱える。ただし部分一致のためには --regex オプションを使う必要があり、さらに複雑なパターンになる。コマンドラインに慣れている開発者向けの手段といえる。

この記事のポイント

  • URL に特定の単語を含むリンクを一括置換するには正規表現が必須
  • Search Regex プラグインで部分一致をパターン指定して置換できる
  • phpMyAdmin の REGEXP_REPLACE でも同様の処理が可能
  • いずれの方法でも事前のデータベースバックアップが最優先
  • 置換後はリンク切れチェックでサイトの健全性を確認する