⌨️ 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

✏️ 演習

📝 課題

  1. 投稿のタイトル・URL・ビュー数をCSVでエクスポートするコマンドを作成する
  2. --post-type オプションで投稿タイプを指定できるようにする
  3. --dry-run オプションで件数だけ確認できるようにする
  4. make_progress_bar() でプログレスバーを表示する
  5. (発展)CSVファイルをインポートして投稿を一括作成するコマンドも実装する

✅ この章のチェックリスト

  • WP-CLIをローカル環境にインストールできた
  • WP_CLI::add_command()でカスタムコマンドを登録できた
  • PHPDocコメントで--helpを実装できた
  • $assoc_argsでオプション(--days等)を受け取れた
  • make_progress_bar()でプログレスバーを表示できた
  • WP_CLI::success/error/warning/lineを使い分けられた

🔗 関連ページ・次のステップ

🚀 あわせて学ぶ