2026年6月27日

2026年6月27日

WP-CLIコマンドをComposerスクリプトとして登録する方法(composer.jsonのscriptsで定型作業をまとめる)

よく使う WP-CLI コマンドは、composer.json の scripts に登録しておくと composer wp:check のような短い名前で呼び出せます。チーム全員が同じ手順を同じコマンドで実行でき、CI からも同じ名前で呼べるのが利点です。この記事では WP-CLI をプロジェクトの開発用依存として入れる方法から、スクリプトの定義、引数の渡し方、wp-cli.yml との組み合わせ、自作コマンドの登録、タイムアウトや Windows での注意点までを順に説明します。

どんなプロジェクトで役に立つか

Composer スクリプトが向いているのは、WordPress のサイトやテーマ・プラグインを Git リポジトリで管理し、composer.json がすでにある(または置ける)プロジェクトです。たとえば次のような作業を名前付きでまとめられます。

  • デプロイ後の定型処理(データベースの更新、キャッシュとリライトルールのクリア)
  • コアやプラグインのファイルが改ざんされていないかの検証
  • 開発環境のデータベースの書き出しや、URLの置換(ドライラン付き)

「手順書を見ながらコマンドを1つずつ打つ」作業を減らし、打ち間違いや手順の抜けを防ぐのが目的です。

WP-CLIをプロジェクトに入れる

WP-CLI はサーバーにグローバルで入れる方法(phar ファイル)が一般的ですが、Composer で開発用依存として入れると、プロジェクトごとに版をそろえられます。

composer require --dev wp-cli/wp-cli-bundle

wp-cli-bundle は WP-CLI 本体と標準コマンド群をまとめたパッケージです。インストールすると vendor/bin/wp が作られます。Composer はスクリプトを実行するとき vendor/bin(bin-dir)を一時的に PATH の先頭に加えるため、スクリプトの中では単に wp と書くだけでこのプロジェクトの WP-CLI が使われます。

注意点として、wp-cli-bundle は多くの依存パッケージを含むため、プロジェクト側の依存と版が衝突することがあります。衝突して解決できない場合は、Composer では入れずにサーバーのグローバルな wp を使う形でも、以下のスクリプト定義はそのまま使えます(PATH 上の wp が呼ばれます)。

基本のscripts定義

composer.json に scripts を追加します。値は文字列(コマンド1つ)か配列(上から順に実行)です。

{
  "require-dev": {
    "wp-cli/wp-cli-bundle": "^2.11"
  },
  "scripts": {
    "wp:check": [
      "wp core verify-checksums",
      "wp plugin verify-checksums --all"
    ],
    "wp:updates": [
      "wp core check-update",
      "wp plugin list --update=available"
    ],
    "wp:flush": [
      "wp cache flush",
      "wp rewrite flush"
    ],
    "wp:after-deploy": [
      "wp core update-db",
      "@wp:flush"
    ],
    "wp:db-export": "wp db export"
  },
  "scripts-descriptions": {
    "wp:check": "コアとプラグインのファイルをチェックサムで検証する",
    "wp:updates": "更新が出ているコアとプラグインを一覧する",
    "wp:flush": "オブジェクトキャッシュとリライトルールをクリアする",
    "wp:after-deploy": "デプロイ後のDB更新とキャッシュクリア",
    "wp:db-export": "データベースをSQLファイルに書き出す"
  }
}

require-dev の版指定は例です。実際には composer require を実行したときに書き込まれる値をそのまま使ってください。

実行は composer wp:check または composer run-script wp:check です。配列の途中でコマンドが失敗(終了コードが0以外)すると、そこで止まって以降は実行されません。デプロイ後処理のように順序が大事な作業では、この性質が安全側に働きます。

他のスクリプトを呼び出す

"@wp:flush" のように @ + スクリプト名を書くと、別のスクリプトを呼び出せます。共通の処理を1か所にまとめておけば、変更したいときも1か所の修正で済みます。同じ仕組みで @php(Composer を動かしている PHP)や @composer も使えます。

説明文を付ける

scripts-descriptions に書いた説明は composer list の一覧に表示されます。登録したスクリプトを後から見た人が用途を理解できるよう、付けておくのがおすすめです。

名前の付け方

update や install など Composer 自体のコマンドと同じ名前は避けてください。wp: のような接頭辞を付けておくと、衝突を避けられるうえ一覧でも見つけやすくなります。

引数を渡す

スクリプト名の後に -- を置くと、その後ろの文字列がコマンドの末尾に追加されます。URL置換をスクリプトにしておき、置換する値は実行時に渡す例です。

"scripts": {
  "wp:sr-dry": "wp search-replace --dry-run --report-changed-only",
  "wp:sr": "wp search-replace --report-changed-only"
}
composer wp:sr-dry -- "http://old.example.test" "https://new.example.test"

まずドライランで変更件数を確認し、問題なければ wp:sr で実行する、という2段階にしておくと安全です。データベースを書き換えるスクリプトの前には composer wp:db-export でバックアップを取ってください。

wp-cli.ymlでパスと接続先を決める

WordPress 本体がプロジェクトのサブディレクトリ(例: web/wp)にある構成では、スクリプトのたびに --path を書く代わりに、プロジェクト直下の wp-cli.yml にまとめます。

path: web/wp

@staging:
  ssh: deploy@staging.example.com/var/www/example/web/wp

@staging のようなエイリアスを定義すると、wp @staging core version のようにリモートのサイトへ SSH 経由でコマンドを送れます(リモート側にも WP-CLI が必要です)。これを Composer スクリプトにすれば、composer wp:staging-check の一言でステージングの検証を走らせることもできます。

"wp:staging-check": "wp @staging core verify-checksums"

自作のWP-CLIコマンドを登録して呼び出す

プロジェクト固有の処理(外部APIとの同期など)は、WP-CLI のカスタムコマンドとして作り、それを Composer スクリプトから呼ぶ形にすると整理しやすくなります。mu-plugin に書く例です。

<?php
/**
 * Plugin Name: Project CLI Commands
 */

if ( defined( 'WP_CLI' ) && WP_CLI ) {
	/**
	 * 公開中の投稿数を表示する。
	 *
	 * ## EXAMPLES
	 *
	 *     wp myproject stats
	 */
	WP_CLI::add_command(
		'myproject stats',
		function () {
			$count = wp_count_posts( 'post' );
			WP_CLI::success( sprintf( '公開中の投稿: %d件', (int) $count->publish ) );
		}
	);
}
"project:stats": "wp myproject stats"

WP_CLI 定数の確認で囲んでいるのは、通常のページ表示時にこのコードを読み込まないためです。コメントの ## EXAMPLES などは wp help myproject stats のヘルプとして表示されます。

タイムアウト・Windows・CIでの注意

長い処理のタイムアウト

Composer にはスクリプトの実行時間の上限があり、既定では300秒です。大きなデータベースの書き出しや大量の置換で止まる場合は、配列の先頭に Composer\\Config::disableProcessTimeout を置くと、そのスクリプトだけ上限を外せます。

"wp:db-export": [
  "Composer\\Config::disableProcessTimeout",
  "wp db export"
]

設定 process-timeout や環境変数 COMPOSER_PROCESS_TIMEOUT で全体の上限を変える方法もあります。

Windowsで動かす場合

スクリプトはOSのシェルで実行されるため、Windows ではコマンドプロンプトの文法になります。$(date +%Y%m%d) のようなシェル展開や、シングルクォートでの引数の囲みは期待どおりに動きません。チームにWindows利用者がいる場合は、シェル固有の書き方を避け、日付付きのファイル名などは WP-CLI の既定の動作に任せるか、自作コマンドの中で処理してください。

インストール時イベントとの組み合わせ

post-install-cmd や post-update-cmd に WP-CLI コマンドを登録すると、composer install のたびに自動実行されます。ただし CI のようにデータベースが無い環境では WordPress に接続できずに失敗し、インストール自体が失敗扱いになります。データベースを使う処理はイベントに入れず、明示的に呼ぶスクリプトにしておく方が扱いやすいです。

登録できたかを確認する

composer run-script --list
composer wp:check

一覧に名前が出ていれば登録できています。実行して「Success」が表示されれば WP-CLI まで正しく動いています。wp が見つからないというエラーが出る場合は、composer install を実行して vendor/bin/wp があるか、または PATH 上に wp があるかを確認してください。WP-CLI の版や同梱コマンドの構成は更新で変わることがあるため(2026年10月現在)、wp cli version で使っている版を把握しておくと、トラブル時の切り分けが楽になります。

まとめ

  • composer require --dev wp-cli/wp-cli-bundle で入れると、スクリプト内では wp と書くだけでプロジェクトの WP-CLI が使われる。
  • scripts は文字列か配列で定義し、@名前 で他のスクリプトを呼べる。scripts-descriptions で説明を付けておく。
  • 実行時の引数は -- の後ろに渡す。DBを書き換える処理はドライランとバックアップをセットにする。
  • WordPress の場所やリモート接続先は wp-cli.yml にまとめ、固有の処理は WP_CLI::add_command() で自作コマンドにする。
  • タイムアウト(既定300秒)、Windows のシェル差、インストール時イベントでのDB接続失敗に注意する。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲