アリババクラウドECS上のWP-CLIで複数のWordPressサイトを管理する方法

この3部構成のチュートリアルでは、WP-CLIで**WordPress**の高度な管理を設定する方法を説明します。パート3では、アリババクラウドECS上のWP-CLIで複数の**WordPress**サイトを管理することに焦点を当てています。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/advanced-wordpress-management-using-wp-cli-on-alibaba-cloud-ecs-part-3_591416)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

この記事は[Alibaba Cloud Tech Share](https://www.alibabacloud.com/ja/campaign/techshare)執筆者のJeff Cleverleyによるものです。[Tech Share](https://www.alibabacloud.com/ja/campaign/techshare)は、クラウドコミュニティ内で技術的な知識やベストプラクティスを共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

前回のチュートリアルでは、[WP-CLI をインスタンスに](https://www.alibabacloud.com/blog/advanced-wordpress-management-using-wp-cli-on-alibaba-cloud-ecs---part-1_590770?spm=a2c65.11461447.0.0.42ed6d7a9uf0kl)インストールし、適切に動作するように正しいパーミッションとユーザーロールを準備し、[WordPress コンテンツを管理](https://www.alibabacloud.com/blog/advanced-wordpress-management-using-wp-cli-on-alibaba-cloud-ecs---part-1_590770?spm=a2c65.11461447.0.0.42ed6d7a62gkMW)するために使用しました。その後、インストール、プラグイン、テーマ、ユーザーの管理、データベース操作を行うためのより高度な機能を掘り下げていきました。また、デフォルトのパラメータを設定して、各コマンドでサーバー上の多くのサイトを管理できるようにしました。

最後のチュートリアルでは、WP-CLI をさらに活用して、ローカルマシンから多くの異なるサーバーインスタンスにまたがる何百ものサイトを管理する方法を実演します。最後に、WP-CLI を拡張してカスタムコマンドでカスタム機能を提供する前に、機能プラグインやテーマの開発をスピードアップするために使用できるコマンドを探っていきます。

これまでと同様に、このチュートリアルでは、すでにアリババのインスタンスがプロビジョニングされていて、その上で 1 つ（またはいくつか）の WordPress サイトが稼働していることを前提としています。

このシリーズを通して、私は自分のスーパーユーザー「new_user」を使用し、sudoコマンドを使用して「root」コマンドを発行します。コマンドを実行する際には、私のユーザーを自分のユーザーに置き換えることを忘れないようにしてください。

私はまた、コード例で私のテストドメイン'an-example-domain.com'と'another-example-domain.com'を使用していますが、コマンドを発行するときに私のサイトドメインをあなた自身のものに置き換えることを覚えておいてください。

###1. WP-CLIで複数のWordPressサイトを管理する
CLIを使った方が、ブラウザでWordPressサイトを管理するよりもはるかに効率的で生産的であることが明らかになりました。物事はずっと速く動き、コマンドは慣れてしまえばとても簡単です。

適当に使えば使えそうなパワーを感じています。それでもダッシュボードからやるよりは、特に多くのWordPressインストールを同時に管理できるサービスがたくさんある中では、それほど効率が良いとは思えないかもしれません。

では、どうすればいいのでしょうか？よくあることですが、複数の方法があります。今日はそのうちの2つを見てみましょう。

AliasグループとBASHスクリプトについてです。

####1a.Aliasグループを使って複数のサイトを管理

先ほどの例ではAliasesを使って、以下のコマンドで2つのサイトのプラグインをチェックしてみました。

```
$ cd ~
$ wp @example plugin list
$ wp @another plugin list
```

しかし、WP-CLI はこの非効率性も解決してくれます。Aliasをグループにまとめて、複数のサイトのアクションを一度のコマンドで実行することができます。

Aliasグループを作成してみましょう。編集用の設定ファイルをもう一度開きます。

`$ nano ~/.wp-cli/config.yml`

そして今回は、以前のAliasの下にもう一行追加します。

```
# Alias Groups
@all-examples:
 - @example
 - @another
```

完全な設定ファイルは以下のようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bf89e060-5407-d228-92f8-a219ff498057.png)

<設定にAliasグループを追加する>

これで一つのコマンドを発行することができます。例えば、両方のサイトのプラグインをリストアップしてみましょう。

`$ wp @all-examples plugin list`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/916e79ab-19f0-77c0-24de-766cc054d023.png)

<多くのサイトを管理するためにAliasグループを利用>

実際には、WP-CLIには@all Aliasも組み込まれていて、定義されたすべてのAliasに対して任意のコマンドを実行します。

`$ wp @all plugin list`

しかし、それはこの一連のチュートリアルで必要とされる実証的な目的のために機能します。

###1b.WP-CLIでBASHスクリプトを使用して複数のサイトを管理

以下の方法でbashスクリプトにwp-cliコマンドを追加することで、上記と同様の結果を得ることができます。

PATHにスクリプトファイルを作成します。

```
$ sudo touch /usr/local/bin/wp-plugin-list.sh
$ sudo nano /usr/local/bin/wp-plugin-list.sh
```

そして、このコードを追加します。

```
#!/bin/bash 
declare -a sites=(
    '/var/www/an-example-domain.com/htdocs' 
    '/var/www/another-example-domain.com/htdocs'
)
for site in "${sites[@]}"; 
do 
    echo “List plugins for:  
    echo $site
    wp --path=$site plugin list
    echo “ “ 
done
```

保存して終了し、スクリプトを実行可能な状態にします。

`$ sudo chmod +x /usr/local/bin/wp-plugin-list.sh`

これでスクリプトを実行する準備ができました。まず、スクリプトを実行してプラグインをチェックします。

`$ wp-plugin-list.sh`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e520e6fe-b033-117b-8a6b-8d8295d9eef8.png)

[WP-CLIコマンドとスクリプトを使用したすべてのプラグインをリストアップ]

一般的には、BASH スクリプトを作成するよりもAliasを使用する方が最適と考えられますが、スクリプトの方が優れている場合もあります。スクリプトを使用すると、WP-CLI コマンドと WP-CLI 以外のコマンドをさまざまな組み合わせで組み合わせることができ、多くのサイトを管理するためにより効果的であることが証明されるかもしれません。例えば、データベースをバックアップして、サーバー上の別のディレクトリやサードパーティのストレージソリューションにコピーすることができます。

WP 管理者から各サイトにログインして、プラグインの更新をチェックする作業は、これらの方法よりもはるかに時間がかかります。

注意事項：
この時点から、この一連のチュートリアルで示されたコマンドは、より適切であればAliasを使用して発行することができます。独自のAliasを使用するか、Aliasを WordPress ディレクトリへのフルパスに置き換えてください。

###2. WP-CLIでSSHを使ったリモート管理
ここまでは順調です。今はWP-CLIの力を使って、複数のWordPressサイトを同じサーバーで管理しています。何十、何百ものサイトがある場合、これは信じられないほどの貴重な時間を節約することができます。

しかし、私たちはまだワークフローを改善することができます。

1.ローカルサーバーからリモートサーバーにSSH接続。

2.WordPress サイトディレクトリ内で WP-CLI コマンドを実行するか、サーバー内のスクリプトを使用して、そのサーバー上の多くの WordPress サイトディレクトリにまたがってコマンドを実行。

3.他のサーバーに対しても同様の処理を繰り返す。

これらを組み合わせて、おそらく 1 つの Alibaba インスタンスだけでなく、多くのインスタンスにまたがって WP-CLI 管理コマンドを実行することができたらどうでしょうか？

そのためには、ローカルマシンとすべてのAlibabaインスタンスの両方でWP-CLIを実行する必要があります。

[Windows PCにWP-CLIをインストールする手順](https://www.alibabacloud.com/blog/advanced-wordpress-management-using-wp-cli-on-alibaba-cloud-ecs-part-3_591416)

[MacにWP-CLIをインストールする手順](https://make.wordpress.org/cli/handbook/guides/installing/?spm=a2c65.11461447.0.0.42ed6d7aNhTH1U#installing-via-homebrew)

このセクションを完了する前に、インストールを完了する必要があります。

ローカルマシンから WP-CLI コマンドを発行し、'--ssh=' パスコマンドを使用してリモートサーバー上で WP-CLI コマンドを実行させることができます。

リモートのプラグインをリストアップします。

`$ wp --ssh=new_user@an-example-domain.com/var/www/an-example-domain.com/htdocs/ plugin list`

または、私のリモートテーマをリストアップします。

`$ wp --ssh=new_user@an-example-domain.com/var/www/an-example-domain.com/htdocs/ theme list`

ご覧の通り、これは完璧に機能します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f58e139d-06c4-d95e-eb54-de902f2a66e0.png)

[WP-CLIをローカルで使用してリモートでホストされているWPサイトを管理]

####AliasとSSHの使用

SSH コマンドをフルパスで入力しなければならないのは非常に疲れますし、非効率的です。前のセクションでは、フルパスを必要とせずにインスタンス内のどこからでも WP-CLI コマンドを発行できるようにするためにAliasを使用しました。

####グローバルなAliasの使用

ローカルマシンに.wp-cliディレクトリやグローバル設定ファイルがまだ作成されていないかもしれません。そうでない場合は、まずそれらを作成してから、設定ファイルを開いて編集してください。

(既に存在する場合は、編集用の設定ファイルを開いてください)

```
$ sudo mkdir ~/.wp-cli && sudo touch ~/.wp-cli/config.yml
$ sudo nano ~/.wp-cli/config.yml
```

インスタンスのグローバル設定ファイルに追加した方法と非常によく似た方法で、 Aliasを追加します。唯一の違いは、'path' の代わりに 'ssh' パラメータを使って設定することです。disabled_commands' も同時に設定すべきでしょう。

```
#Global Parameter Defaults
disabled_commands:
 - db drop

# Aliases
@example:
    ssh: new_user@an-example-domain.com/var/www/an-example-domain.com/htdocs/
@another:
    ssh: new_user@another-example-domain.com/var/www/another-example-domain.com/htdocs/
```

ローカルマシン上のグローバル WP-CLI 設定ファイルは以下のようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8c28d38d-19ee-a6ed-2e5c-2ad18e601acb.png)

[ローカルのグローバル設定ファイルにリモートエイリアスを追加]

これでローカルで WP-CLI を使うことができるようになり、'wp' コマンドとサブコマンドの間にAlias '@name' を追加するだけで、リモートの Alibaba インスタンスで WP-CLI の管理タスクを簡単に実行できるようになりました。

ローカルマシンからリモートインスタンスにコマンドを発行します。

`$ wp @example plugin list`

或いは

`$ wp @another core check-update`

####Aliasグループを使ってSSHで複数のサイトを管理

サーバー上と同じように、リモートで複数のサイトを管理するために、ローカルでAliasグループを使用することができます。

違いは、異なるサーバー上の WordPress サイトへのAliasを含む Alias Groups を作成できるようになったことです。つまり、Aliasグループを使って、ローカルマシンからコマンドを発行して、多くの異なるアリババインスタンス上の多くの異なる WordPress サイトを管理できるようになりました。

ローカルのグローバル設定ファイルを開きます。

`$ nano ~/.wp-cli/config.yml`

既存のAliasesの下に以下の行を追加します。

```
@all-examples:
 - @example
 - @another 
```

設定ファイルは以下のようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9e0ba07f-5886-4768-93c2-032590542378.png)

[ローカルのグローバル設定ファイルにAliasグループを追加]

####プロジェクト内でのAliasの使用

モダンなWordPress開発とデプロイのワークフローの一部としてWP-CLIを使用していることがあります。他のチュートリアルでは、ステージング環境、ローカル環境、プロダクション環境を設定し、Git のバージョン管理ワークフローを実装しています。

WP-CLI はこのような状況で非常にうまく機能し、プロジェクトのローカル WP-CLI 設定ファイル内でプロジェクトごとに特定の Aliases を設定することができます。

本番サイトのローカル開発版がある場合は、'wp-cli.yml' ファイルを追加して、このワークフローの[グローバルパラメータを設定](https://www.apple.com/?spm=a2c65.11461447.0.0.42ed6d7aTPzMn5)します。

ローカル開発サイトのルートにディレクトリを変更し、その中に 'wp-cli.yml' ファイルを作成します。

```
$ cd /local/sites/anotherexampledomain/app/public
$ sudo nano wp-cli.yml
```

このファイルの中に、リモートサイトごとに異なるAliasを追加します。

```
@test:
    ssh: new_user@another-example-domain.com/var/www/test.another-example-domain.com/htdocs
@staging: 
    ssh: new_user@another-domain.com/var/www/staging.another-domain.com/htdocs/
@production:
    ssh: new_user@another-domain.com/var/www/another-domain.com/htdocs/
```

プロジェクトの 'wp-cli.yml' 設定ファイルは以下のようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/aab10300-e4c5-6bc7-0aaa-1802435974af.png)

[ステージングサイトや制作サイトへのSSHパスの追加について]

さて、ローカルで作業しているときに、これらのエイリアスを使ってリモートサーバーにWP-CLIコマンドを発行することができるようになりました。

`$ wp @production plugin list`

そして、グローバルエイリアスと同じように、Aliasグループを作成することができます。

```
@test:
    ssh: new_user@another-example-domain.com/var/www/test.another-example-domain.com/htdocs
@staging: 
    ssh: new_user@another-domain.com/var/www/staging.another-domain.com/htdocs/
@production:
    ssh: new_user@another-domain.com/var/www/another-domain.com/htdocs/
@prerelease:
 - @test
 - @staging
```

これで、以下のようにプロジェクトのAliasグループにコマンドを発行することができました。

`$ wp @prerelease plugin list`

###3. WP-CLIスキャフォールドを使って開発スピードを上げる
WP-CLI には 'wp scaffold' というコマンドがあり、標準的な WordPress 開発タスクの多くに必要なボイラプレートコードを生成するために使用されます。

これらの基本的なコードを生成するには、以下のようなものがあります。

- Child Themes
- Feature Plugins
- Custom Post Types
- Custom Taxonomies
- PHPunit testing of plugins
- PHPunit testing of themes
PHPunitのテストコード生成のデモンストレーションは、それ自体がシリーズ化されている必要があるため、このチュートリアルの範囲を超えています。しかし、「wp scaffold」でできる他のクールなことを手短に説明しましょう。

基本的なディレクトリ構造と、テーマを有効化するために最低限必要なファイルを作成したい場合は、次のコマンドを実行します。

```
 wp @example scaffold child-theme twentyseventeen-child --parent_theme=twentyseventeen --theme_name="Twenty Seventeen Child" --author="New User" --author_uri="an-example-domain.com" --theme_uri="an-example-theme.com" —activate
```

エイリアスを使用して、ローカルマシンからAlibabaインスタンスに子テーマを作成する方法に注目してください。信じられないほど効率的です。

テーマが作成されたことがターミナルで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6af8491d-f5d5-0ecf-901d-19d98ef48337.png)

<WP-CLIの足場を使って子テーマを作成する>

そして、サイト上で活性化されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d335ae9a-8ed2-7334-e342-a64adec0db69.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/81f94737-7293-6b74-304d-787d565f5ff9.png)

[WP管理者の新しい子テーマ]

プラグインはどうでしょう？それは至ってシンプルです。

`wp @example scaffold plugin custom-plugin --plugin_name="Custom Plugin" --plugin_description="A custom plugin for custom functionality" --plugin_author="New User" --plugin_author_uri=https://an-example-domain.com --plugin_uri=https://custom-plugin.com —activate`

そして今、私たちはプラグインをインストールして有効にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ee59cafc-d888-14f8-71dd-816edd5581f5.png)

[WP管理者の新しいプラグインについて]

WordPressで最も一般的な開発者のタスクの1つは、真のカスタムWordPress開発のためのカスタムポストタイプとタクソノミーを構築することです。

カスタムポストタイプのボイラープレートコードを作成し、プラグインまたはテーマのいずれかに追加し、必要なディレクトリ構造を以下のようにして追加します。

`wp @example scaffold post-type tutorials --label="Tutorials" --plugin=custom-plugin --dashicon=welcome-learn-more`

同様に、カスタムタクソノミーを使用します。

`wp @example scaffold taxonomy wpcli --post_types=posts --label="wpcli" --plugin=custom-plugin`

WP Adminで生成されたコードやディレクトリ構造を検査することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/aeb95880-4b59-86b6-976e-cc80138f2502.png)

[カスタムポストタイプのボイラープレートのコードとプラグインで生成されたファイルについて]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9af58e1c-3d5c-b839-3314-6c60cb9e4fa8.png)

[カスタムタクソノミのボイラプレートのコードとプラグインで生成されたファイルについて]

####4 WP-CLIの拡張

これらのチュートリアルを経て、ここまでたどり着いたのであれば、WP-CLIはWordPressのツールセットに欠かせないツールだと思っていただければ幸いです。

ここで終わったとしても、これは素晴らしいことです。

WP-CLI は拡張性があるので、私たちの旅はここで終わりません。

これは2つの方法で達成することができます。ファイルからPHPをロードしてWP-CLIで実行するか、カスタムコマンドを作成するプラグインを構築することができます。

両方の方法を実演するために、似たような出力例を使ってみます。

####PHPファイルを実行

動作するかどうかテストしたい PHP スニペットがある場合、わざわざ WordPress プラグインや functions.php テーマファイルに含めてテストする必要はありません。

WP-CLI が提供する 'wp eval-file' コマンドを使えば、すぐにテストできます。これはWordPressを読み込んだ後にPHPファイルを実行します。

ホームディレクトリに 'random-post.php' ファイルを作成し、編集用に開きます。

`$ nano random-post.php`

ファイルの中に以下のコードを追加します。

```
<?php
global $wpdb;
$random_example_post = $wpdb->get_var(
    "SELECT post_title
    FROM $wpdb->posts
    WHERE post_type = 'post'
        AND post_status = 'publish'
    ORDER BY rand()
    LIMIT 1"
);
echo "A random example post: $random_example_post \n";
```

エディタでPHPスクリプトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/08ef8824-ddf6-0831-28d6-d906aa79ae0b.png)

<実行するPHPスクリプトファイル>

これは、ランダムな投稿をデータベースに照会して表示するだけの基本的な機能です。

ここで、エイリアスを使用するか、WordPressディレクトリ内から以下のコマンドを実行してください。

`$ wp @example eval-file random-post.php`

あなたの端末には、ランダムな投稿タイトルが表示されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8b905cd4-f979-c9d8-a895-a985aabb92b5.png)


[WP-CLI eval-fileを使ってWordPressでPHPファイルを実行してみましょう]

####プラグインでカスタムコマンドを作成する

また、独自の WordPress プラグインを作成することで、WP-CLI の内蔵機能を拡張することもできます。このようにして、WP-CLI の機能を拡張するには、WP-CLI コマンドを使って独自の機能を追加します。

まず、「wp scaffold」関数を使って、プラグインのボイラプレートを作成してみましょう。

`wp @example scaffold plugin wp-cli-custom-commands —plugin_name=“WP-CLI Custom Commands" --plugin_description="A custom plugin for creating a WP-CLI custom command“ --plugin_author="New User" —activate`

ここで、ディレクトリをプラグインのルートディレクトリに変更し、プラグインファイルを開きます。

`$ sudo nano wp-cli-custom-commands.php`

`$ cd /var/www/an-example-domain.com/htdocs/wp-content/plugins/wp-cli-custom-commands`



プラグインファイルには、各コマンドに対応するクラスと、各サブコマンドに対応するパブリックメソッドが必要です。

これを実演するために、先ほどのスクリプトと同じ機能を再現し、'random-post'コマンドで実行させます。

「Custom_Commands」という名前のクラスを作成します。このクラスには、サブコマンド用の単一のパブリックメソッド「random_post」が含まれており、上記のスクリプトと同じ単純なデータベースクエリを実行してランダムな投稿を返します。

次に、'add-command' を使って WP-CLI コマンドとしてクラスを登録します。この関数はコマンド名とクラス名を引数にとります。

wp-cli-custom-commands.php' に以下のコードを追加します。

```
if( defined( 'WP_CLI' ) && WP_CLI ) {

        class Custom_Commands {

                function random_post ( $args, $assoc_args ) {

                        global $wpdb;

                        $random_post = $wpdb->get_var(
                        "SELECT post_title FROM $wpdb->posts 
                        WHERE post_type = 'post' 
                        AND post_status = 'publish' 
                        ORDER BY rand() 
                        LIMIT 1");

                        WP_CLI::success( "Random post: $random_post" );
                }
        }

        WP_CLI::add_command( 'custom_commands', 'Custom_Commands' );
}
```

プラグインのメインファイルはエディタではこのようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/061e98e4-a1b8-c189-a65f-2006da3dcb4f.png)

[カスタムコマンドプラグインファイル]

「wp scaffold」コマンドで定義していなかったので、プラグインのURIと著者のURIが抜けています。

あとは実行することで、コマンドが登録されていることを確認できます。

`$ wp @example custom_commands`

これは利用可能なサブコマンドの一覧を表示します。これで、そのコマンドを実行することができます。

`$ wp @example custom_commands random_post`


端末のWP-CLIでは、WordPressサイトからランダムに選択された投稿タイトルの後に「Success」というメッセージが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/385e63bf-8a3b-9424-46f8-5ea2bd8d3830.png)

おめでとうございます - WP-CLIの拡張に成功しました。

これで、初めての WP-CLI カスタムコマンドを作成し、実行することができました。

これで、プラグインを使ってWordPressサイト上で様々な機能を実行するコマンドを作成し、思いつく限りのWordPress管理タスクを実行するための簡単な方法を作成することができるようになったはずです。

このシリーズのチュートリアルの最後に到達しました。WP-CLI の可能性を深く掘り下げてきましたが、これは可能性の表面を掻きむしっているに過ぎません。

もっと知りたい方は、公式リソースをチェックしてみてください。

- [WPCLI サイト](https://wp-cli.org/?spm=a2c65.11461447.0.0.42ed6d7aZSIIqO)
- [developer.wordpress.org の WPCLI コマンド](https://developer.wordpress.org/cli/commands/?spm=a2c65.11461447.0.0.42ed6d7a0DvBic)
- [WPCLIハンドブック](https://make.wordpress.org/cli/handbook/?spm=a2c65.11461447.0.0.42ed6d7aTWwQES)

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*