WP-CLIで投稿内のドメイン名(ホスト名)を一括変更する【WordPress】

WP-CLIで投稿内のドメイン名(ホスト名)を一括変更する【WordPress】 WordPress

WordPressでブログ等を公開しているドメイン名(ホスト名)を変更したい時がある。

そんな時はWordPressメニューの「設定」⇒「一般」から「WordPress アドレス (URL)」と「サイトアドレス (URL)」を変更するだけでOKだと思われがちだが、実はこの作業だけでは過去に投稿した記事内に埋め込まれているドメイン名(ホスト名)等は変更されない。

その弊害で、表示されるはずの画像が表示されなかったりする不具合が起ことがある。

というわけで、今回はWordPress内のドメイン名(ホスト名)などのデータを一括変更することが出来る「WP-CLI」を紹介します。

■動作確認環境
CentOS 7.7
Nginx 1.16.1
PHP 7.2.18

WP-CLIとは

WP-CLIとは、SSH等のコマンドラインでWordPressのさまざまな管理をブラウザ無しで実行することができる便利なツールです。

主に、WordPress自体のインストールや、ドメイン名(ホスト名)を一括変更したり、テキストの一括置換等で利用されます。

WP-CLI公式サイト(日本語)

■WP-CLI公式サイト(日本語)
https://wp-cli.org/ja/

WP-CLIのインストール

今回の説明の環境

今回の説明での環境は以下の通りです。

  • ドメイン名:example.com
  • Linuxのユーザー名:example.com
  • ホームディレクトリ:/home/example.com
  • ドキュメントルート:/home/example.com/public_html
  • WordPressインストールディレクトリ:/home/example.com/public_html
    (※WordPressインストールディレクトリとは「wp-admin」「wp-content」「wp-includes」などが存在するディレクトリです。)

まず、SSHでrootになっている場合は、su - example.com でユーザ変更しておきます。

PHPのパスの確認

WP-CLIのインストール時に、PHPのパスを知っておく必要があるので、whereis php コマンドであらかじめ調べておきます。

$ whereis php
php: /usr/bin/php /usr/lib64/php /etc/php.d /etc/php.ini /usr/share/php /usr/share/man/man1/php.1.gz

今回は「/usr/bin/php」をPHPのパスとして利用します。

WP-CLIインストール

ユーザ(example.com)のホームディレクトリ以下に「bin」ディレクトリを作成し、WP-CLIをインストールしていきます。

※6行目の「wp=’/usr/bin/php ~/bin/wp-cli.phar’」の赤文字のPHPのパスの部分は環境によって変わりますので、先ほど調べたPHPのパスに書き換えてください。

$ cd
$ mkdir bin
$ cd bin
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ echo "alias wp='/usr/bin/php ~/bin/wp-cli.phar'" >> ~/.bashrc
$ source ~/.bashrc

【上記インストールの説明】
1行目:ホームディレクトリ(/home/example.com)に移動
2行目:ホームディレクトリ以下にbinディレクトリを作成
3行目:binディレクトリに移動
4行目:curlでWP-CLIをダウンロード
5行目:実行権限を付与
6行目:ホームディレクトリにある .bashrc の末尾にパスを追記
7行目:シェルの設定を反映させる

バージョン確認

wp --version でWP-CLIのバージョンが表示されれば正常にインストールが完了です。

$ wp --version
WP-CLI 2.4.0

OKです。

動作確認

WP-CLIの動作確認として、wp plugin statusコマンドでインストールされているWordPressプラグインの一覧表示を行ってみます。

まず、WordPressのインストールディレクトリに移動します。

$ cd ~/public_html

wp plugin status コマンドを実行します。

$ wp plugin status
14 installed plugins:
  A addquicktag           2.5.3
  A classic-editor        1.5
  A contact-form-7        5.1.6
  A contact-form-7-extras 0.7.2
  A disable-comments      1.10.2
  A edit-author-slug      1.6.1
  A ewww-image-optimizer  5.1.3
  A foobox-image-lightbox 2.7.8
  A foogallery            1.8.18
  A ps-auto-sitemap       1.1.9
  I custom-css-js         3.28
  A tinymce-advanced      5.3.0
  A whats-new-genarator   2.0.2
  A xo-security           2.2.0

Legend: A = Active, I = Inactive

OKです。

WP-CLIの正常動作を確認しました。

WP-CLIでデータベースの書き換え

まずデータベースのバックアップ

WP-CLIでデータベースを変更することになるので、WP-CLIでの一括変更を行う前に、念のためにphpMyAdminやバックアッププラグイン等を利用してデータベースのバックアップを取っておきましょう。

WP-CLIでWordPressアドレスとサイトアドレスを変更

「WordPressアドレス(URL)」と「サイトアドレス(URL)」は、WordPressメニューの「設定」⇒「一般」から手動で変更できますが、WP-CLIを利用すれば簡単なコマンドだけで変更できます。

まず、以下のコマンドを実行して現在のWordPressアドレス(URL)とサイトアドレス(URL)をチェックします。

wp option get home && wp option get siteurl

上記コマンドで現在の「WordPressアドレス(URL)」と「サイトアドレス(URL)」が表示されますので、変更したい場合は以下の書式で変更します。(※URLの末尾に/(スラッシュ)は不要です。)

wp option update home '変更後のWordPressアドレス(URL)'

wp option update siteurl '変更後のサイトアドレス(URL)'

■WordPressアドレス(URL)を「https://www.example.co.jp」に変更する場合
wp option update home 'https://www.example.co.jp'

■サイトアドレス(URL)を「https://www.example.co.jp」に変更する場合
wp option update siteurl 'https://www.example.co.jp'

もう一度以下のコマンドを実行して正常に変更できたかを確認しましょう。

wp option get home && wp option get siteurl

WP-CLIで記事内のドメイン名(ホスト名)の一括変更を実行

ドメイン名(ホスト名)の一括変更を実行するには、WP-CLIの search-replace というコマンドを利用します。

書式は以下の通りです。(※URLの末尾に/(スラッシュ)は不要です。)

wp search-replace '変更前のドメイン又はホスト名' '変更後のドメイン又はホスト名'

■ドメイン名を一括変更したい場合(例:ドメイン自体の変更)
wp search-replace 'https://www.example.com' 'https://www.example.co.jp'

■ホスト名を一括変更したい場合(例:wwwからwww2へ変更)
wp search-replace 'https://www.example.com' 'https://www2.example.com'

■ディレクトリ構造を一括変更したい場合(例:blogディレクトリからドメインのみに変更)
wp search-replace 'https://www.example.com/blog' 'https://www.example.com'

■http://からhttps://に一括変更したい場合(例:SSL化する場合等)
wp search-replace 'http://www.example.com' 'https://www.example.com'

実行すると以下のように表示されます。
※あらかじめテーブル接頭辞(テーブルプレフィックス)は「wp_」から「ag2_」に変更してあります。(未変更の場合はTable名がwp_commentmeta等になります。)

$ wp search-replace 'https://www.example.com' 'https://www2.example.com'
+-------------------+-----------------------+--------------+------+
| Table             | Column                | Replacements | Type |
+-------------------+-----------------------+--------------+------+
| ag2_commentmeta   | meta_key              | 0            | SQL  |
| ag2_commentmeta   | meta_value            | 0            | SQL  |
| ag2_comments      | comment_author        | 0            | SQL  |
| ag2_comments      | comment_author_email  | 0            | SQL  |
| ag2_comments      | comment_author_url    | 0            | SQL  |
| ag2_comments      | comment_author_IP     | 0            | SQL  |
| ag2_comments      | comment_content       | 0            | SQL  |
| ag2_comments      | comment_approved      | 0            | SQL  |
| ag2_comments      | comment_agent         | 0            | SQL  |
| ag2_comments      | comment_type          | 0            | SQL  |
| ag2_links         | link_url              | 0            | SQL  |
| ag2_links         | link_name             | 0            | SQL  |
| ag2_links         | link_image            | 0            | SQL  |
| ag2_links         | link_target           | 0            | SQL  |
| ag2_links         | link_description      | 0            | SQL  |
| ag2_links         | link_visible          | 0            | SQL  |
| ag2_links         | link_rel              | 0            | SQL  |
| ag2_links         | link_notes            | 0            | SQL  |
| ag2_links         | link_rss              | 0            | SQL  |
| ag2_options       | option_name           | 0            | SQL  |
| ag2_options       | option_value          | 7            | PHP  |
| ag2_options       | autoload              | 0            | SQL  |
| ag2_postmeta      | meta_key              | 0            | SQL  |
| ag2_postmeta      | meta_value            | 14           | PHP  |
| ag2_posts         | post_content          | 644          | SQL  |
| ag2_posts         | post_title            | 0            | SQL  |
| ag2_posts         | post_excerpt          | 0            | SQL  |
| ag2_posts         | post_status           | 0            | SQL  |
| ag2_posts         | comment_status        | 0            | SQL  |
| ag2_posts         | ping_status           | 0            | SQL  |
| ag2_posts         | post_password         | 0            | SQL  |
| ag2_posts         | post_name             | 0            | SQL  |
| ag2_posts         | to_ping               | 0            | SQL  |
| ag2_posts         | pinged                | 0            | SQL  |
| ag2_posts         | post_content_filtered | 0            | SQL  |
| ag2_posts         | guid                  | 1470         | SQL  |
| ag2_posts         | post_type             | 0            | SQL  |
| ag2_posts         | post_mime_type        | 0            | SQL  |
| ag2_term_taxonomy | taxonomy              | 0            | SQL  |
| ag2_term_taxonomy | description           | 0            | SQL  |
| ag2_termmeta      | meta_key              | 0            | SQL  |
| ag2_termmeta      | meta_value            | 0            | SQL  |
| ag2_terms         | name                  | 0            | SQL  |
| ag2_terms         | slug                  | 0            | SQL  |
| ag2_usermeta      | meta_key              | 0            | SQL  |
| ag2_usermeta      | meta_value            | 0            | PHP  |
| ag2_users         | user_login            | 0            | SQL  |
| ag2_users         | user_nicename         | 0            | SQL  |
| ag2_users         | user_email            | 0            | SQL  |
| ag2_users         | user_url              | 0            | SQL  |
| ag2_users         | user_activation_key   | 0            | SQL  |
| ag2_users         | display_name          | 0            | SQL  |
+-------------------+-----------------------+--------------+------+
Success: Made 2135 replacements.

「Success: Made (変更した件数) replacements.」と表示されれば一括変更は終了です。

WordPressメニューの「投稿」から過去の投稿記事を表示し、「テキスト」タブにてHTMLソースを確認してみましょう。正常にHTMLソース内のドメイン名(ホスト名)が変更されていれば全ての作業が終了です。

備考(-sh: wp: コマンドが見つかりません)というエラーが出る場合

WP-CLIのコマンドを実行しようとした際に「-sh: wp: コマンドが見つかりません」というエラーが出る場合は、以下のコマンドを実行してシェルの設定を反映させるとWP-CLIコマンドが利用できるようになります。

$ source ~/.bashrc

SSHで再接続した際などは、まず、source ~/.bashrc を実行してからWP-CLIコマンドを実行するようにしましょう。

まとめ

WordPressの投稿内のドメイン名(ホスト名)などを一括変更したいときは、WP-CLIがとても便利。

短いコマンドを実行するだけで、安心・安全に一瞬でデータベース内の一括変更が出来るので覚えておきましょう。

以上で解決です。

タイトルとURLをコピーしました