rui live note

WordPress、PHP、子育て、ブログ、将棋、コワーキング、子育て、群馬等に関する日々感じたことを書いているブログです

*

WordPress移行時にwp search-replaceコマンドでマルチサイトのドメイン文字列も置換する

      2016/10/04   WordPress, 開発 ,

  • このエントリーをはてなブックマークに追加
  • Pocket

WP-CLI

WP-CLI の「wp search-replace」コマンドについて、自己解決した件をメモ代わりにまとめておきます。

wp search-replace でマルチサイトのテーブルも置換する

wp search-replace で URL 文字列を置換するときの基本コマンドはこちらです。

ところが、WordPress のネットワーク機能で作ったあるマルチサイトについて、サイト移行時に URL 文字列の置換をしようとしたのですが、どうにも置き換わらないデータが残ってしまいます。。

で、そのデータを調べると、マルチサイトのテーブル(マルチサイトのテーブル名は「wp_2_posts」のように間に wp_blogs.blog_id が含まれます)ばかりだったので、wp search-replace は未対応なのかな・・・と一時は思い込んでしまいました。

でも安心してください、さすが WP-CLI!ちゃんとネットワーク機能に対応するためのオプション「–network」が用意されていました。

オプションを付けたコマンドはこのようになります。

コマンド実行結果を見ると、ちゃんとマルチサイトのテーブルも対象にして置換が行われていることが分かります。

$ wp search-replace --network 'http://example.com' 'http://example.jp'
+---------------------+-----------------------+--------------+------+
| Table               | Column                | Replacements | Type |
+---------------------+-----------------------+--------------+------+
| wp_2_commentmeta    | meta_key              | 0            | SQL  |
| wp_2_commentmeta    | meta_value            | 0            | SQL  |
| wp_2_comments       | comment_author        | 0            | SQL  |
| wp_2_comments       | comment_author_email  | 0            | SQL  |
| wp_2_comments       | comment_author_url    | 0            | SQL  |
| wp_2_comments       | comment_author_IP     | 0            | SQL  |
| wp_2_comments       | comment_content       | 0            | SQL  |
| wp_2_comments       | comment_approved      | 0            | SQL  |
| wp_2_comments       | comment_agent         | 0            | SQL  |
| wp_2_comments       | comment_type          | 0            | SQL  |
| wp_2_links          | link_url              | 0            | SQL  |
| wp_2_links          | link_name             | 0            | SQL  |
| wp_2_links          | link_image            | 0            | SQL  |
| wp_2_links          | link_target           | 0            | SQL  |
| wp_2_links          | link_description      | 0            | SQL  |
| wp_2_links          | link_visible          | 0            | SQL  |
| wp_2_links          | link_rel              | 0            | SQL  |
| wp_2_links          | link_notes            | 0            | SQL  |
| wp_2_links          | link_rss              | 0            | SQL  |
| wp_2_options        | option_name           | 0            | SQL  |
| wp_2_options        | option_value          | 2            | PHP  |
| wp_2_options        | autoload              | 0            | SQL  |
| wp_2_postmeta       | meta_key              | 0            | SQL  |
| wp_2_postmeta       | meta_value            | 0            | PHP  |
| wp_2_posts          | post_content          | 0            | SQL  |
| wp_2_posts          | post_title            | 0            | SQL  |
| wp_2_posts          | post_excerpt          | 0            | SQL  |
| wp_2_posts          | post_status           | 0            | SQL  |
| wp_2_posts          | comment_status        | 0            | SQL  |
| wp_2_posts          | ping_status           | 0            | SQL  |
| wp_2_posts          | post_password         | 0            | SQL  |
| wp_2_posts          | post_name             | 0            | SQL  |
| wp_2_posts          | to_ping               | 0            | SQL  |
| wp_2_posts          | pinged                | 0            | SQL  |
| wp_2_posts          | post_content_filtered | 0            | SQL  |
| wp_2_posts          | guid                  | 23           | SQL  |
| wp_2_posts          | post_type             | 0            | SQL  |
| wp_2_posts          | post_mime_type        | 0            | SQL  |
| wp_2_term_taxonomy  | taxonomy              | 0            | SQL  |
| wp_2_term_taxonomy  | description           | 0            | SQL  |
| wp_2_terms          | name                  | 0            | SQL  |
| wp_2_terms          | slug                  | 0            | SQL  |
| wp_3_commentmeta    | meta_key              | 0            | SQL  |
| wp_3_commentmeta    | meta_value            | 0            | SQL  |
| wp_3_comments       | comment_author        | 0            | SQL  |
| wp_3_comments       | comment_author_email  | 0            | SQL  |
| wp_3_comments       | comment_author_url    | 1            | SQL  |
| wp_3_comments       | comment_author_IP     | 0            | SQL  |
| wp_3_comments       | comment_content       | 0            | SQL  |
| wp_3_comments       | comment_approved      | 0            | SQL  |
| wp_3_comments       | comment_agent         | 0            | SQL  |
| wp_3_comments       | comment_type          | 0            | SQL  |
| wp_3_links          | link_url              | 0            | SQL  |
| wp_3_links          | link_name             | 0            | SQL  |
| wp_3_links          | link_image            | 0            | SQL  |
| wp_3_links          | link_target           | 0            | SQL  |
| wp_3_links          | link_description      | 0            | SQL  |
| wp_3_links          | link_visible          | 0            | SQL  |
| wp_3_links          | link_rel              | 0            | SQL  |
| wp_3_links          | link_notes            | 0            | SQL  |
| wp_3_links          | link_rss              | 0            | SQL  |
| wp_3_options        | option_name           | 0            | SQL  |
| wp_3_options        | option_value          | 2            | PHP  |
| wp_3_options        | autoload              | 0            | SQL  |
| wp_3_postmeta       | meta_key              | 0            | SQL  |
| wp_3_postmeta       | meta_value            | 0            | SQL  |
| wp_3_posts          | post_content          | 2            | SQL  |
| wp_3_posts          | post_title            | 0            | SQL  |
| wp_3_posts          | post_excerpt          | 0            | SQL  |
| wp_3_posts          | post_status           | 0            | SQL  |
| wp_3_posts          | comment_status        | 0            | SQL  |
| wp_3_posts          | ping_status           | 0            | SQL  |
| wp_3_posts          | post_password         | 0            | SQL  |
| wp_3_posts          | post_name             | 0            | SQL  |
| wp_3_posts          | to_ping               | 0            | SQL  |
| wp_3_posts          | pinged                | 0            | SQL  |
| wp_3_posts          | post_content_filtered | 0            | SQL  |
| wp_3_posts          | guid                  | 10           | SQL  |
| wp_3_posts          | post_type             | 0            | SQL  |
| wp_3_posts          | post_mime_type        | 0            | SQL  |
| wp_3_term_taxonomy  | taxonomy              | 0            | SQL  |
| wp_3_term_taxonomy  | description           | 0            | SQL  |
| wp_3_terms          | name                  | 0            | SQL  |
| wp_3_terms          | slug                  | 0            | SQL  |
| wp_blog_versions    | db_version            | 0            | SQL  |
| wp_blogs            | domain                | 0            | SQL  |
| wp_blogs            | path                  | 0            | SQL  |
| 
〜省略〜 
| 
| wp_users            | user_url              | 0            | SQL  |
| wp_users            | user_activation_key   | 0            | SQL  |
| wp_users            | display_name          | 0            | SQL  |
+---------------------+-----------------------+--------------+------+
Success: Made 41 replacements.

wp search-replace で独自のテーブルも置換する

さて、WordPress をカスタマイズしていると、新規に独自テーブルを使って機能を開発することもあるかと思います。

wp search-replace の「–all-table」オプションを付けると全てのテーブルが対象になるので、そんな独自テーブルも含めたいときにも便利です。

例えば、URL 文字列を含んだ company テーブルをこのように作ったとします。

そして「–all-table」オプションを付けた形でコマンドを実行。

campany テーブルの URL もちゃんと置換が行われました。

$ wp search-replace --all-tables 'http://example.com' 'http://example.jp'
+---------------------+-----------------------+--------------+------+
| Table               | Column                | Replacements | Type |
+---------------------+-----------------------+--------------+------+
| company             | name                  | 0            | SQL  |
| company             | url                   | 1            | SQL  |
| 
〜省略〜
| 
+---------------------+-----------------------+--------------+------+
Success: Made 1 replacements.

※ちなみに、search-replace のソースを見たところ、「–all-table」の対象テーブルは Primary Key を持ったカラムが存在することが条件のようです。Primary Key を持たないテーブルの方が珍しいかとは思いますが、この点はご注意ください。

まとめ

ドキュメントはちゃんと読むこと!今回のオプション説明も WP-CLI の公式サイトにちゃんと書いてあります(笑)

他にも至れり尽くせり便利なオプションが揃っているので、何か困ったらオプション調べてみるときっと幸せになれるかと思います。

ad

この記事が気に入ったらシェアしてもらえると嬉しいです!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • follow us in feedly
  • RSS

  関連記事

ビジネスマン
chrome標準のPDF Viewerを無効にする方法

Adobe Readerとか他のプラグインでPDFを見たい場合に、chrome標 …

配達
EC-CUBEで商品を大量注文するとお届け先情報が空っぽになる件

EC-CUBE で商品を大量に注文した時に、お届け先情報が空っぽになるという問題 …

CakePHP
CakePHPを初めて使ってみたことのまとめ

先日CakePHPを使ったシステムを作りました。 サーバ環境の都合でバージョンは …

アドベントカレンダーTreeMap
Adventarの登録状況をD3.jsのツリーマップで可視化してみました

Adventar にはすでに昨年を上回る勢いの310以上(11月17日時点)のア …

着火
CodeIgniterのCLIでバッチ処理を実行してみる

※この記事は CodeIgniter Advent Calendar 2015 …

stinger0003
Stingerで関連記事に表示される対象カテゴリーを暫定カスタマイズする

以前 WordPress テーマを Stinger に切り替えてから、あまり詳細 …

EC-CUBE
EC-CUBEで携帯・スマートフォンテンプレートを無効化する方法

EC-CUBEには標準でスマートフォンや携帯用のテンプレートが用意されていて、そ …

404 not found
古いUbuntuサーバでapt-getしたら404 Not Foundエラーが発生した件

開発用のVMで使っていた Ubuntu 10.10 server でFTPサーバ …

gopher
高崎で開かれたGo言語の勉強会「Takasaki.go#1」に参加してきました

群馬県内ではおそらく初めてと思われる Go 言語の勉強会「Takasaki.go …

Gravatar
Gravatar Widgetプラグインでサイドバーにプロフィール画像を表示してみた。

Gravatar Widget Gravatar WidgetというWordPr …