WP-CLIのパッケージコマンドを自作

この記事はWP-CLIアドベントカレンダー8日目の記事かつWordBench串本ぼっちアドベントカレンダーの8日目の記事です。

今回は、WP-CLIのパッケージコマンドというやつを作る方法について解説します。

WP-CLIの自作コマンドを開発する方法

WP-CLIの自作コマンドを開発するには2種類の方法があります。

WordPressのプラグインとして開発

1つ目の方法はWordPressのプラグインとして開発する方法です。

この方法では、WordPressのプラグイン内で、WP_CLI_Commandの拡張クラスを定義し、そのなかでコマンドを開発していきます。

公式ディレクトリ上にも、WP-CLI用のコマンドを内蔵したプラグインはすでにいくつかあり、Nginx Cache Controllerwp nginx flushなどのコマンドを内蔵しています。

パッケージコマンドとして、コマンド単体で開発

もう一つの方法はパッケージコマンドとしてコマンド単体で開発する方法です。

この方法のメリットは、たとえば1つのサーバー内に複数のWordPressがある場合に、それぞれにプラグインをインストールする必要がありません。

昨日のたいさんの記事、PHP 5.4以上に備わっている開発用のビルトインサーバでWordPressの開発環境を構築するコマンドの紹介で紹介されているwp serverもそうですね。

あと、昨日の僕の記事、指定した開発者のプラグインの一覧を見るWP-CLIコマンドを作った。も同じくパッケージコマンドです。

パッケージコマンドは他にもたくさんあるので、ぜひいろいろ試してみるといいでしょう。

WP-CLI Package Index

ちなみに本日現在(2014/12/08)の時点で、このWP-CLI Package Indexはいろいろとうまく動作してないのでちょっと残念です。

パッケージコマンドの作り方

前置きが少し長くなりましたがパッケージコマンドの作り方を紹介します。

事前準備

パッケージコマンドは、WP-CLIがインストールされている環境ならどこに設置してもオッケーです。

任意のディレクトリに作業用のディレクトリを作ってください。

$ mkdir ~/my-cli

次にこのディレクトリの中にWP-CLI用のPHPファイルを作成します。

$ cd ~/my-cli
$ touch cli.php

コマンド用のPHPファイルを準備出来たら、これをWP-CLIに読み込ませます。

WP-CLIに読み込ませるには、WP-CLIの設定ファイルに記述する必要があります。

設定ファイルがない場合は、以下のように作ってください。

$ mkdir ~/.wp-cli
$ touch ~/.wp-cli/config.yml

config.ymlが設定ファイルなので、以下のように記述してください。

require:
  - /path/to/cli.php

/path/to/cli.phpは先ほど作成したPHPファイルまでのパスを指定してください。

WP_CLI_Commandを継承したクラスをつくる

WP-CLIのコマンドは、WP_CLI_Commandの拡張クラスを作って、その中にゴリゴリ書いていきます。

今回は超カンタンな例として、指定した定数の値を取得するコマンドを作ってみます。

想定しているコマンドは以下のような感じ。

$ wp constant ABSPATH  # ABSPATHの値を取得する

このためのソースは以下のとおりです。

<?php

if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
    return;
}

/**
* Getting a specific constant value.
*/
class WP_CLI_Constant extends WP_CLI_Command {


    /**
    * Getting a specific constant value.
    *
    * ## EXAMPLES
    *
    *    wp constant ABSPATH
    *
    * @synopsis <constant-name>
    */
    public function __invoke( $args, $assoc_args )
    {
        if ( defined( $args[0] ) ) {
            WP_CLI::success( constant( $args[0] ) );
        } else {
            WP_CLI::warning( $args[0] . ' is not defined.' );
        }
    }

}

WP_CLI::add_command( 'constant', 'WP_CLI_Constant' );

ポイントは以下のとおりです。

  • WP_CLI_Commandを継承したクラスを作成する。
  • WP_CLI::add_command()で、WP-CLIにコマンドを登録する。
  • コメントは、wp helpで表示されるヘルプに使用されます。
  • __invoke()は、コマンドを実行された時にコールされるメソッドです。

今回は、wp constant <constant-name>という感じで、サブコマンドなしのコマンドを作りましたが、wp constant get <constant-name>のようにサブコマンドを定義することもできます。

詳しくは、Commands Cookbookのページを見てください。

パッケージ化

WP-CLIにはパッケージコマンド用のリポジトリが用意されています。

あいにく本日現在はトラブっていて動作しないのですが、いちおうパッケージ化の方法を紹介します。

composer.jsonを設置

以下の例をもとにcomposer.jsonを作成してください。

{
    "name": "miya0001/wp-cli-plugins-api",
    "description": "WP-CLI command for Plugins API",
    "homepage": "http://github.com/miya0001/wp-cli-plugins-api",
    "license": "GPL-2.0",
    "authors": [
        {
            "name": "Takayuki Miyauchi",
            "homepage": "https://github.com/miya0001"
        }
    ],
    "autoload": {
        "files": [ "cli.php" ]
    }
}

package-indexに対して登録申請を行う。

composer.jsonを設置したらGitHubで公開してください。

公開したら、repositories.txtにGitHubのURLを追記してプルリクエストを送信してください。

あとは、WP-CLIの@danielbachhuberさんが登録してくれます。

(ちなみにこの人は、かなり精力的な人で、WordPress関連のプロジェクトのプルリクエストをほとんど見てるんじゃないかっていうぐらいいろんなところに出没します。)