WP-CLIインストール

Blog

WP-CLIとは

WP-CLIとは、コマンドラインでwordpressに関するあれこれができるようにしてれるもの。

WP-CLI

WP-CLI は WordPress を管理するためのコマンドラインインターフェースです。
プラグインのアップデートやマルチサイトのセットアップなどの多くのことをブラウザ無しで行うことができます。

GUIでやると面倒なことがWP-CLIを使うと簡単に出来そう?
という期待から、使ってみました。

ぱっと探しただけでも、この辺りが便利そうです。

wp search-replace 'AAA' 'BBB'

サイト内データの検索・置換

wp search-replace 'http://before.jp' 'http://after.jp' --skip-columns=guid

引っ越し時のドメインの置き換え

wp post generate --count=500 --post_type=page

空の固定ページをたくさん作成する

wp user import-csv /path/to/users.csv

管理画面のユーザーをCSVから登録する

wp user update USERNAME --user_pass=NEWPASSWORD

管理画面のログインパスワード変更

あるいは、インストールから案件共通の初期設定までをコマンドで保存しておけたら、便利かも。
個人的にはここが目標です。

本記事では、まずはWP-CLIのインストールについてと、各環境でのハウツーを記録しておきます。

WP-CLIインストール

公式サイトに従いインストールします。

$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ php wp-cli.phar --info
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
$ wp --info
PHP binary: /usr/bin/php
PHP version:    5.5.38
php.ini used:
WP-CLI root dir:    phar://wp-cli.phar
WP-CLI vendor dir:  phar://wp-cli.phar/vendor
WP_CLI phar path:   /Users/user/workspace/sample/htdocs/wp
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 1.4.1

インストールが成功していれば、上のように表示されます。

では、「引っ越し時のドメインの置き換え」を試してみます。
操作したいWordPress配下まで移動してから、

$ wp search-replace 'http://before.jp' 'http://after.jp' --skip-columns=guid --dry-run

+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 2            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 0            | PHP  |
| wp_posts         | post_content          | 0            | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: 2 replacements to be made.

まずはsearch-replace--dry-runオプションで、実際には実行しないまま結果だけを確認します。

wp search-replace

[–dry-run]
Run the entire search/replace operation and show report, but don’t save changes to the database.

実行結果に問題ないことを確認したら、--dry-runオプションを外して、実行します。

$ wp search-replace 'http://before.jp' 'http://after.jp' --skip-columns=guid

+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 2            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 0            | PHP  |
| wp_posts         | post_content          | 0            | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: Made 2 replacements.

MAMP環境で使う

MAMP環境でWP-CLIを使う場合、wp-config.phpに追記が必要です。

/** MySQL のホスト名 */
// define('DB_HOST', 'localhost');
define('DB_HOST', 'localhost:/Applications/MAMP/tmp/mysql/mysql.sock');

Local by Flywheelで使う

Local by Flywheelは、こちらの記事で先輩ががちらりと紹介している「Wordpressの環境が一瞬で作れる」ツールです。

  • Virtual Boxで仮想OSを立て、rootユーザーでSSHアクセスができる。
  • OSはDebian
  • WP-CLIがデフォルトでインストールされている。
# pwd
/
# wp user list

+----+------------+--------------+--------------------------+---------------------+---------------+
| ID | user_login | display_name | user_email               | user_registered     | roles         |
+----+------------+--------------+--------------------------+---------------------+---------------+
| 1  | admin      | admin        | dev-email@flywheel.local | 2018-01-10 01:59:54 | subscriber    |
+----+------------+--------------+--------------------------+---------------------+---------------+

仮想OSにSSHでアクセスするとルートパスにいますが、その場でWP-CLIが使えるようです。
(WordPressは/app/public/配下)

ただし、手動でWordPressアドレスを変更すると、今度はどこへ移動してもパスが通らなくなりました。

# pwd
/
# wp user list
Error: This does not seem to be a WordPress install.
Pass --path=`path/to/wordpress` or run `wp core download`.

# cd /app/public/wordpress
# wp user list
Error: This does not seem to be a WordPress install.
Pass --path=`path/to/wordpress` or run `wp core download`.

根本的な解決ではありませんが、明示的にwp-confing.phpまでのパスを示して使用することができます。

# wp user list --path=/app/public/wp/

+----+------------+--------------+--------------------------+---------------------+---------------+
| ID | user_login | display_name | user_email               | user_registered     | roles         |
+----+------------+--------------+--------------------------+---------------------+---------------+
| 1  | admin      | admin        | dev-email@flywheel.local | 2018-01-10 01:59:54 | subscriber    |
+----+------------+--------------+--------------------------+---------------------+---------------+

WP-CLI Global parameters

–path= Path to the WordPress files.

2018年2月28日追記 ここから

パスが行方不明になる原因を、先輩が見つけてくれました。
ルート直下に設定ファイル「wp-cli.yml」があり、このファイルでWordPressへのパスを指定していました。

# cat wp-cli.yml
path: /app/public

これを修正すれば、きちんとパスが通りました。
OSがDebianなので、エディタコマンドはviではなくnanoです。

# nano wp-cli.yml
# cat wp-cli.yml
path: /app/public/wp

設定ファイルの優先順位は以下のようです。

  1. Command-line arguments.
  2. wp-cli.local.yml file inside the current working directory (or upwards).
  3. wp-cli.yml file inside the current working directory (or upwards).
  4. ~/.wp-cli/config.yml file (path can be changed by setting the WP_CLI_CONFIG_PATH environment variable).
  5. WP-CLI defaults.

参考:WP-CLI Config
2018年2月28日追記 おわり

なお、WP-CLIは本来rootユーザーで使うには-–allow-rootオプション(※非推奨)が必要ですが、Local by Flywheel では .bashrc にaliasが指定されているようです。

# cat ~/.bashrc
alias wp="wp --allow-root"

# alias wp
alias wp='wp --allow-root'
# unalias wp
# alias wp
bash: alias: wp: not found

# wp user list
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under.

If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS.

If you'd like to continue as root, please run this again, adding this flag:  --allow-root

If you'd like to run it as the user that this site is under, you can run the following to become the respective user:

    sudo -u USER -i -- wp <command>

CPIサーバー(シェアードプラン)で使う

弊社の開発でよく使うサーバーCPIサーバー(シェアードプラン)は、

  • 共用サーバー
  • phpコマンドはphp-5.5.27
  • OSはFreeBSD

この環境にWP-CLIをインストールします。

% mkdir bin
% cd bin/
% curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
% php-5.5.27 wp-cli.phar --info

ここまでは他の環境と同じです。

共用サーバーなのでusr/local/binへのアクセス権が無く、wpコマンドの登録ができません。
代わりにaliasを登録します。

% vi ~/.cshrc

OSがFreeBSDなので、.bashrcではなく.cshrcです。

% cat ~/.cshrc
alias wp 'php-5.5.27 ~/bin/wp-cli.phar'

以上で、他の環境と同じように使えるようになりました。

参考