WP-CLIアドベントカレンダーの2日目担当の @gatespace_k です。
今日は個人的に一番便利な機能 wp search-replace
を取り上げます。
目次
WordPressの引っ越し
私はお仕事でWordPressを使っていますので、WordPressサイトの引っ越しというよりも本番環境(あるいは開発環境)からローカル環境への移行が結構あります。
Web上のサイトからデータベースや必要なファイルをダウンロードしてきて、ローカル環境を構築します。
この時、URLの置換を行わないとログインしたダッシュボードが本番環境になってしまったり、画像が表示されなくなったり、ということが起こりえます。
この辺りは 日本語Codex「Moving WordPress」 に必要な手順が書いてありますが、要約すると「WordPress アドレス(URL)欄」「アドレス(URL)欄」だけでなく、本文中に入れている画像のURLの置換なども必要になってきます。
その昔は「ダウンロードしたsqlをエディタで開いて(あるいはphpMyAdmin上で)URLを検索置換」という方法が推奨されていましたが、Codexから記載が削除されたとおり、現在ではおすすめされる方法ではありません。
その理由が 「データベース内で保存されている内容がシリアライズされている可能性」 があるからです。
シリアライズされて保存されているデータ
WordPress本体のみではシリアライズされて保存されるデータにURLは含まれません(ただし執筆時4.0.1の場合)。
しかし、テーマオプションやプラグインなどでデータベースにシリアライズして保存する物もあり、そちらではURLを含んでいるものがあります。
例としてウィジェットに画像の設置を簡単にできる 「Image Widget」 を取り上げます(例はサイドバーエリアの画像)。
この情報がデータベースのどこに保存されているかというと、wp_options テーブルに option_name 「widget_widget_sp_image」として内容が保存されています。
その中身がこちらでシリアライズされています。
a:2:{i:2;a:12:{s:5:"title";s:23:"Image Alignment 150x150";s:11:"description";s:0:"";s:4:"link";s:0:"";s:10:"linktarget";s:5:"_self";s:5:"width";i:150;s:6:"height";i:150;s:4:"size";s:4:"full";s:5:"align";s:4:"none";s:3:"alt";s:23:"Image Alignment 150x150";s:8:"imageurl";s:78:"http://wordpress.local/wp-content/uploads/2013/03/image-alignment-150x1505.jpg";s:12:"aspect_ratio";i:1;s:13:"attachment_id";i:969;}s:12:"_multiwidget";i:1;}
見づらいので画像のURLの部分だけ抜き出すと
s:78:"http://wordpress.local/wp-content/uploads/2013/03/image-alignment-150x1505.jpg";
となっています。
中身の意味は PHP: serialize – Manual あたりに詳しく書いてあるので省略しますが、上記の場合
「String型78バイトで値は http://wordpress.local/wp-content/uploads/2013/03/image-alignment-150×1505.jpg 」
となります。
このように「型」「サイズ」「値(value)」がセットで保存されているので、URLの一括置換などで「値(value)」のみを変えてしまいサイズ(この場合文字数)が変わってしまうと、アンシリアライズできなくなり、ImageWidgetであれば中身がなくなってしまいます。
こういった状況を考え、データベース内のテキストを置換する場合は一度データをアンシリアライズし、置換、再度シリアライズして保存、という手順が必要となります。
ここまで書くと「よく分からん」と思われる方もいるでしょうが、極論すると 「テキストエディタでそのまま置換するとマズイよ」 と覚えてもらえればOKです。
wp search-replace
前置きが長くなりましたが、ここでWP-CLIの登場です。
URLの置換だけに限りませんが、wp search-replace [old] [new]
で置換と検索が行えます。
URLの場合であれば
wp search-replace 'http://wordpress.local' 'http://example.local'
のようにします。最後に /
を入れないのがポイントです。
先の例でURLを置換しデータを見ると
s:76:"http://example.local/wp-content/uploads/2013/03/image-alignment-150x1505.jpg"
となり、シリアライズされた部分も正常に置き換わります(バイト数が変わっています)。
もちろん、URLの置換以外に特定の文言の検索・置換もできますし、オプションをつければ投稿に関するテーブルのみを対象とすることもできます。
便利でしょ?
余談ですが、WP-CLI使えないわーという場合は、PHPスクリプトをサーバーにアップし、GUIで変換することも可能です。
明日は @tecking さんです。