[WordPress] 投稿記事内の文字列をSQL文で一括置換

[WordPress] 投稿記事内の文字列をSQL文で一括置換

WordPressで投稿された記事などをSQL文で一括置換するためのメモです。
この方法では、SQL文を使用するときにphpMyAdminの管理画面を使っています。

投稿記事内のURLを一括置換する

WordPressでブログを運営しているときに “投稿記事内に記述していたサイトのURLのリンクが切れていた” もしくは “ドメインが変更されていた” などという時があるかと思います。
以下に、そのURLをphpMyAdmin上からSQL文で一括置換する方法をご紹介します。

1. phpMyAdminからデータベースを表示してwp_postsを選択

まず、phpMyAdminの管理画面を開いて、サイドメニューからブログで使われているデータベースを選択して下さい。投稿記事内のURLが記述されているのは wp_posts というテーブル名なので、wp_posts を選択します。

phpMyAdmin上でwp_postsが選択された状態

2. テーブルのバックアップを取っておく

もしもの時のためにバックアップを取ってください。
上部にあるタブメニューからエクスポートを選択して、以下の図のような設定で [実行する] をクリックします。

wp_postsのエクスポートタブが選択された状態

エクスポートを実行すると “wp_posts.sql” というファイルがダウンロードされるので、それがデータを復元するときに必要なファイルとなります。

もし、ファイルを復元するときはタブメニューからインポートを選択して、インポートするファイルから先ほどダウンロードしたファイルを選択して [実行する] をクリックしてください。

wp_postsのインポートタブが選択された状態

3. SQL文を実行して投稿記事内のURLを一括置換する

上部にあるタブメニューからSQLを選択します。
“データベース blog 上でクエリを実行する” と書かれたテキストフィールドにSQL文を入力して [実行する] をクリック。

wp_postsのSQLタブが選択された状態

テキストフィールド入力するSQL文は、UPDATE文を使ってデータの更新を行います。
UPDATE文は以下のように使われます。

UPDATE テーブル名 SET <code>カラム名</code> = replace(<code>カラム名</code>, ‘検索する文字列’, ‘置換する文字列’)” /></p>
<p>WordPressで投稿された記事が保存されている場所は<em>post_content</em>というカラムなので、例えば「“http://syake-web.com/” → “http://syake-labo.com/”」へ一括置換する場合は以下のようになります。</p>
<pre class=UPDATE wp_posts SET `post_content` = replace(`post_content`, 'http://syake-web.com/', 'http://syake-labo.com/')

また、MarkDownで記事を書かれている方はこちらの処理も必要になりますので、続けて実行して下さい。

UPDATE wp_posts SET `post_content_filtered` = replace(`post_content_filtered`, 'http://syake-web.com/', 'http://syake-labo.com/')

プラグインを使う方法

もっと簡単な方法でSerch Regexというプラグインを使えば、WordPressの管理画面で “Source” から “Post content” を選ぶことによって投稿記事の中身を一括置換できるようになります。

Serch Regex の設定画面

Serch Regex

ただし、MarkDownで記事を書いている場合は元の記事は反映されないので、かなりのハマりポイントです。ご注意下さい。

データベースをローカル環境へ引き継ぎする

WordPressで本番サーバーからローカル環境へデータベースを反映する場合、phpMyAdmin から WordPressで使っているテーブルをエクスポート&インポートした場合に、ドメインの設定も書き換える必要があります。たとえば、“管理画面のリダイレクトURLの設定” や “アイキャッチ画像のドメイン” など。

まずは、テーブルのエクスポート&インポートが完了させます。
こちらの方法は割愛しますが、バックアップを取るのを忘れないようにして下さい。

管理画面のリダイレクトURLの変更

WordPressの設定関連は、ほとんどwp_optionsに記述されているのでwp_optionsの中身を一括置換します。

UPDATE wp_options SET <code>option_value</code> = replace(<code>option_value</code>, ‘検索文字’, ‘置換文字’)” /></p>
<p>リダイレクトURLの変更の場合、置換する内容はドメインを指定すれば十分だと思います。例えば「“http://syake-labo.com/blog” → “http://localhost/blog”」へ一括置換する場合は以下のようになります。</p>
<pre class=UPDATE wp_options SET `option_value` = replace(`option_value`, 'http://syake-labo.com/blog', 'http://localhost/blog')

これで、WordPressの管理画面を開いたときに、別のドメインへリダイレクトしなくなったと思います。

また、wp_optionsにサーバーの絶対パスも記述されているので、それも差し替えておきます。
例えば、移行する元のサーバーパスが “/home/hoge/www/blog/” で移行先のサーバーパス(つまり、ローカルPCに保存されている場所)が “/Users/hoge/Sites/blog/” の場合は以下のようになります。

UPDATE wp_options SET `option_value` = replace(`option_value`, '/home/hoge/www/blog/', '/Users/hoge/Sites/blog/')

アイキャッチ画像のドメインの変更

記事に紐づいてるアイキャッチ画像は絶対パスに指定されているので、それを移行先のドメインへと一括置換します。アイキャッチ画像のURLはテーブル名wp_postsのカラム名guidに記述されています。例えば「“http://syake-labo.com/blog” → “http://localhost/blog”」へ一括置換する場合は以下のようになります。

UPDATE wp_posts SET `guid` = replace(`guid`, 'http://syake-labo.com/blog', 'http://localhost/blog')