Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

WP-CLIをインストールしてWordPressの未添付画像を完全削除する手順

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

WordPressサーバーにWP-CLIが入っていない場合でも、公式のPharファイルを導入すれば、コマンドラインからメディアを整理できます。本記事では、WP-CLIのインストール、動作確認、未添付画像の抽出、ドライラン、完全削除、ディスク容量の比較までを順 番に説明します。

重要: WordPressで「未添付」と判定される画像は、データベース上の post_parent が0の添付ファイルです。本文、アイキャッチ、ウィジェット、CSS、テーマ設定、カスタムフィールドなどから参照されていても未添付と表示される場合があります。削除前に必ずバックアップと対象確認を行ってください。

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

前提条件

  • LinuxサーバーへSSH接続できること
  • WordPressの設置パスを把握していること
  • PHPのCLI版とcurlが利用できること
  • /usr/local/bin へファイルを配置できるsudo権限があること
  • WordPressファイルとデータベースをバックアップできること

この記事では、次の値をダミーとして使用します。実際の環境に合わせて置き換えてください。

WordPress設置パス: /var/www/example.com/public_html
Webサーバー実行ユーザー: www-data
WP-CLI設置先: /usr/local/bin/wp
作業ディレクトリ: /var/tmp/wp-cli-install
PHP-FPMサービス名: php8.3-fpm

PHP CLIとcurlを確認する

php -v
curl --version

コマンドが見つからない場合は、OSのパッケージ管理機能でPHP CLIとcurlをインストールします。パッケージ名はOSやPHPのバージョンによって異なります。

Debian・Ubuntu系の例

sudo apt update
sudo apt install php-cli curl

RHEL・Rocky Linux・AlmaLinux系の例

sudo dnf install php-cli curl

WP-CLIの公式Pharを取得する

作業用ディレクトリを作成し、WP-CLI公式のPharファイルとSHA-512チェックサムを取得します。

sudo install -d -m 0700 /var/tmp/wp-cli-install
cd /var/tmp/wp-cli-install

curl -fL -o wp-cli.phar \
  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

curl -fL -o wp-cli.phar.sha512 \
  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar.sha512

リダイレクトを許可するため -L、HTTPエラー時に失敗させるため -f を付けています。

チェックサムを検証する

expected="$(awk '{print $1}' wp-cli.phar.sha512)"
actual="$(sha512sum wp-cli.phar | awk '{print $1}')"

printf 'expected=%s\nactual=%s\n' "$expected" "$actual"
test "$expected" = "$actual"

test がエラーなく終了し、2つの値が一致していることを確認します。一致しない場合はインストールを中止し、取得元URL、ネットワーク、プロキシ、ダウンロード内容を確認してください。

Pharファイル単体で動作確認する

php wp-cli.phar --info

PHPのバージョン、WP-CLIのバージョン、Pharパスなどが表示されれば、Pharファイルは起動できます。

WP-CLIをサーバーへインストールする

chmod 0755 wp-cli.phar
sudo install -o root -g root -m 0755 \
  wp-cli.phar /usr/local/bin/wp

インストール後、PATHから実行できることを確認します。

command -v wp
wp --info
wp cli version

/usr/local/bin/wp が表示され、バージョン情報を取得できればインストール完了です。

WordPressへの接続を確認する

WordPressファイルの所有者やWebサーバー実行ユーザーに合わせて実行します。rootのまま実行せず、WordPressを操作する適切なユーザーを指定してください。

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  core is-installed

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  option get siteurl

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  core version

core is-installed が成功し、サイトURLとWordPressバージョンが表示されることを確認します。

作業前の容量を記録する

df -B1 /var/www/example.com/public_html
du -sb /var/www/example.com/public_html/wp-content/uploads

df -h /var/www/example.com/public_html
du -sh /var/www/example.com/public_html/wp-content/uploads

削除後に同じコマンドを実行し、ファイルシステムの空き容量と uploads の使用量を比較します。

WordPressとデータベースをバックアップする

完全削除は元に戻せません。データベースと wp-content/uploads をバックアップしてください。

アップロードファイルをバックアップする例

sudo tar -C /var/www/example.com/public_html/wp-content \
  -czf /var/backups/example-uploads-YYYYMMDD-HHMMSS.tar.gz uploads

データベースをWP-CLIでバックアップする例

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  db export /var/tmp/example-wordpress-YYYYMMDD-HHMMSS.sql

出力先へWebサーバー実行ユーザーが書き込めない場合は、事前に権限を調整するか、管理者用の安全なバックアップ方法を使用してください。バックアップファイルをWeb公開ディレクトリへ置かないでください。

未添付画像の件数を確認する

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  post list \
  --post_type=attachment \
  --post_status=inherit \
  --post_parent=0 \
  --post_mime_type=image \
  --format=count

この段階では件数を表示するだけで、削除は行いません。

削除対象をCSVへ保存する

ID、タイトル、MIMEタイプ、登録日時をCSVへ保存し、削除前に内容を確認します。

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  post list \
  --post_type=attachment \
  --post_status=inherit \
  --post_parent=0 \
  --post_mime_type=image \
  --fields=ID,post_title,post_mime_type,post_date \
  --format=csv \
  > /var/tmp/unattached-images-before-delete.csv

CSVの行数と内容を確認します。

wc -l /var/tmp/unattached-images-before-delete.csv
sed -n '1,30p' /var/tmp/unattached-images-before-delete.csv

CSVには見出し行が含まれるため、画像件数は通常「行数から1を引いた値」です。アイキャッチ、固定ページ、ウィジェット、テーマ設定、CSSなどで使われている画像が疑われる場合は削除を中止してください。

対象IDを固定して検証する

削除中に対象が変化しないよう、ID一覧をファイルへ保存します。作業中はメディアのアップロードや記事編集を停止してください。

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  post list \
  --post_type=attachment \
  --post_status=inherit \
  --post_parent=0 \
  --post_mime_type=image \
  --format=ids \
  | tr ' ' '\n' \
  | sed '/^$/d' \
  > /var/tmp/unattached-image-ids.txt

ID以外の文字が混ざっていないことを確認します。

test -s /var/tmp/unattached-image-ids.txt
if grep -Evq '^[0-9]+$' /var/tmp/unattached-image-ids.txt; then
  echo 'ID validation failed' >&2
  exit 1
fi

wc -l /var/tmp/unattached-image-ids.txt
sed -n '1,30p' /var/tmp/unattached-image-ids.txt

未添付画像を完全削除する

バックアップ、CSV、ID一覧を確認したら、50件ずつ完全削除します。--force を指定するため、ゴミ箱を経由せず、関連サムネイルと投稿メタを含めて削除されます。

xargs -r -n 50 sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  post delete --force \
  < /var/tmp/unattached-image-ids.txt \
  | tee /var/tmp/unattached-images-delete.log

大量削除では時間がかかることがあります。SSH接続が切れても処理状態を確認できるよう、必要に応じてtmuxやscreen内で実行してください。

削除後の残件数を確認する

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  post list \
  --post_type=attachment \
  --post_status=inherit \
  --post_parent=0 \
  --post_mime_type=image \
  --format=count

結果が 0 なら、WordPressデータベース上の未添付画像は残っていません。0でない場合は、削除ログのエラーを確認し、残ったIDを再取得して原因を調べます。

削除後の容量を確認する

df -B1 /var/www/example.com/public_html
du -sb /var/www/example.com/public_html/wp-content/uploads

df -h /var/www/example.com/public_html
du -sh /var/www/example.com/public_html/wp-content/uploads

削除前後の値から、空き容量の増加量と uploads の減少量を計算します。データベース更新やファイルシステムの割り当て単位により、両者は完全には一致しない場合があります。

管理画面に削除済み画像が表示される場合

削除後も管理画面の「メディア」に古い情報が表示される場合は、ブラウザの再読み込み、WordPressキャッシュ、オブジェクトキャッシュ、APCu、PHP-FPMのキャッシュを確認します。

WordPressオブジェクトキャッシュを削除する

sudo -u www-data wp \
  --path=/var/www/example.com/public_html \
  --skip-themes --skip-plugins \
  cache flush

キャッシュプラグイン、Redis、Memcachedを使用している場合は、各システムの管理手順に従います。共有キャッシュを一括削除すると、他サイトへ影響する可能性があります。

APCuを使用している場合

PHP CLIのAPCuとPHP-FPMのAPCuは別プロセスの場合があります。CLIからキャッシュを消しても管理画面側へ反映されないときは、影響範囲を確認して対象PHP-FPMサービスを再読み込みします。

sudo systemctl reload php8.3-fpm

サービス名は環境によって異なります。共有サーバーでは他サイトへの影響を確認してから実行してください。

作業ファイルを片付ける

バックアップを別の安全な場所へ保管したあと、不要な作業ファイルを削除します。

sudo rm -f /var/tmp/unattached-images-before-delete.csv
sudo rm -f /var/tmp/unattached-image-ids.txt
sudo rm -f /var/tmp/unattached-images-delete.log
sudo rm -rf /var/tmp/wp-cli-install

rm を実行する前に、対象パスが正しいことを必ず確認してください。

WP-CLIを更新する方法

WP-CLIは定期的に更新されます。更新前に現在のバージョンと更新内容を確認し、管理者権限で実行します。

wp cli version
sudo wp cli update
wp cli version

運用ポリシー上、自己更新を許可しないサーバーでは、初回と同様に公式Pharとチェックサムを取得して入れ替えます。

安全に作業するための注意点

  • WP-CLIのPharは公式配布元から取得し、チェックサムを検証する
  • WordPress操作をrootで実行しない
  • 削除前にデータベースとuploadsをバックアップする
  • 件数確認、CSV保存、ID検証を済ませてから削除する
  • 最初から全メディアを対象にせず、画像・未添付に条件を限定する
  • 削除中はメディアのアップロードや記事編集を停止する
  • キャッシュ削除やPHP-FPM再読み込みの影響範囲を確認する

WP-CLIを導入すると、未添付画像の件数確認、対象IDの保存、完全削除、残件確認を再現可能なコマンドで実行できます。大量のメディアを整理するときは、インストール元の検証、バックアップ、ドライラン相当の一覧保存、対象IDの固定、削除後の容量確認までを一連の手順として実施してください。

タイトルとURLをコピーしました