応用編
⌨️ WP-CLI コマンド開発
コマンドラインからWordPressを操作できるWP-CLIにカスタムコマンドを追加します。バッチ処理・定期メンテナンス・デプロイ作業の自動化など、開発・運用の効率を大幅に向上させましょう。
⌨️ WP-CLI とは
WP-CLI(WordPress Command Line Interface)はコマンドラインからWordPressを操作できるツールです。管理画面では手間がかかる作業を一行のコマンドで実行できます。
WP-CLIでできること(標準コマンド)
- wp post create/delete/list — 投稿の管理
- wp plugin activate/deactivate — プラグイン管理
- wp theme activate — テーマ切り替え
- wp user create — ユーザー作成
- wp db export/import — DBのバックアップ
- wp search-replace — DB内の文字列置換
カスタムコマンドの活用例
- 古い下書き・期限切れデータの一括削除
- 外部CSVからのコンテンツ一括インポート
- サイト移行後のURL一括修正
- カスタムテーブルの整合性チェック
- CI/CDパイプラインへの組み込み
💡 WP-CLIのインストール
# macOS / Linux
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
# バージョン確認
wp --version
# WordPressルートディレクトリで基本コマンドを試す
wp post list
wp user list
🔧 カスタムコマンドの作成
WP_CLI::add_command() でコマンドを登録します。コマンドのドキュメント(コメント)を正しく書くと --help で表示されます。
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* MFP プラグインのWP-CLIコマンド群
*/
class MFP_CLI_Command {
/**
* 古い下書き投稿を一括削除します。
*
* ## OPTIONS
*
* [--days=<days>]
* : 何日前の下書きを削除するか(デフォルト: 30)
*
* [--dry-run]
* : 実際には削除せず、対象件数だけ表示します
*
* ## EXAMPLES
*
* wp mfp cleanup-drafts
* wp mfp cleanup-drafts --days=60
* wp mfp cleanup-drafts --days=90 --dry-run
*/
public function cleanup_drafts( $args, $assoc_args ) {
$days = isset( $assoc_args['days'] ) ? absint( $assoc_args['days'] ) : 30;
$dry_run = isset( $assoc_args['dry-run'] ) ? true : false;
$posts = get_posts( array(
'post_status' => 'draft',
'numberposts' => -1,
'date_query' => array( array( 'before' => $days . ' days ago' ) ),
'fields' => 'ids',
) );
$count = count( $posts );
if ( 0 === $count ) {
WP_CLI::success( '削除対象の下書きはありません。' );
return;
}
if ( $dry_run ) {
WP_CLI::line( "[dry-run] 削除対象: {$count} 件" );
return;
}
$progress = WP_CLI\Utils\make_progress_bar( '削除中', $count );
foreach ( $posts as $post_id ) {
wp_delete_post( $post_id, true );
$progress->tick();
}
$progress->finish();
WP_CLI::success( "{$count} 件の下書きを削除しました。" );
}
/**
* 投稿を CSV ファイルにエクスポートします。
*
* ## OPTIONS
*
* <file>
* : 出力するCSVファイルのパス
*
* [--post-type=<post-type>]
* : 投稿タイプ(デフォルト: post)
*
* ## EXAMPLES
*
* wp mfp export-csv /tmp/posts.csv
* wp mfp export-csv /tmp/products.csv --post-type=product
*/
public function export_csv( $args, $assoc_args ) {
$file = $args[0];
$post_type = isset( $assoc_args['post-type'] ) ? sanitize_key( $assoc_args['post-type'] ) : 'post';
$posts = get_posts( array(
'post_type' => $post_type,
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
) );
$fp = fopen( $file, 'w' );
if ( ! $fp ) {
WP_CLI::error( "ファイルを作成できません: {$file}" );
}
fputcsv( $fp, array( 'ID', 'タイトル', 'URL', '投稿日' ) );
$progress = WP_CLI\Utils\make_progress_bar( 'エクスポート中', count( $posts ) );
foreach ( $posts as $post_id ) {
fputcsv( $fp, array(
$post_id,
get_the_title( $post_id ),
get_permalink( $post_id ),
get_post_field( 'post_date', $post_id ),
) );
$progress->tick();
}
$progress->finish();
fclose( $fp );
WP_CLI::success( count( $posts ) . " 件のデータを {$file} にエクスポートしました。" );
}
}
// WP_CLI が存在する環境でのみ登録
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'mfp', 'MFP_CLI_Command' );
}
WP_CLI の出力メソッド
| メソッド | 色 | 用途 |
|---|---|---|
WP_CLI::success() | 緑 | 処理成功 |
WP_CLI::error() | 赤 | エラー(処理を停止) |
WP_CLI::warning() | 黄 | 警告(処理は続行) |
WP_CLI::line() | 白 | 通常の情報出力 |
WP_CLI::log() | 白 | ログ(--quietで非表示) |
🔄 実行例とオプション
# 基本的な使い方
wp mfp cleanup-drafts
# --days オプションで日数を指定
wp mfp cleanup-drafts --days=60
# --dry-run で実際には削除せず件数確認
wp mfp cleanup-drafts --days=90 --dry-run
# CSV エクスポート
wp mfp export-csv /var/www/html/exports/posts.csv
# カスタム投稿タイプをエクスポート
wp mfp export-csv /tmp/products.csv --post-type=product
# ヘルプを表示
wp mfp --help
wp mfp cleanup-drafts --help
# サーバー上のWordPressを操作(--path を指定)
wp mfp cleanup-drafts --path=/var/www/html --days=30
✏️ 演習
📝 課題
- 投稿のタイトル・URL・ビュー数をCSVでエクスポートするコマンドを作成する
- --post-type オプションで投稿タイプを指定できるようにする
- --dry-run オプションで件数だけ確認できるようにする
- make_progress_bar() でプログレスバーを表示する
- (発展)CSVファイルをインポートして投稿を一括作成するコマンドも実装する
✅ この章のチェックリスト
- WP-CLIをローカル環境にインストールできた
- WP_CLI::add_command()でカスタムコマンドを登録できた
- PHPDocコメントで--helpを実装できた
- $assoc_argsでオプション(--days等)を受け取れた
- make_progress_bar()でプログレスバーを表示できた
- WP_CLI::success/error/warning/lineを使い分けられた