wp db query コマンド情報まとめ
ターミナルの wp db query コマンドについて、オプション情報、SELECT・UPDATE・DELETE の使い分け、AIエージェントが実行した場合の危険性を紹介しています。
wp db query とは
wp db query(WP-CLI database query)は、WordPress のデータベースに対して任意の SQL 文を直接実行できる WP-CLI コマンドです。
wp-config.php の接続情報を自動で読み取るため、ホスト名・ユーザー名・パスワードを別途指定せずにそのまま使えます。
SELECT による参照は安全に使えますが、UPDATE・DELETE・DROP などの書き込み・破壊系クエリはデータベースを即時書き換えるため、実行前の十分な確認が必要です。
主なオプション
| オプション | 意味 |
|---|---|
--dbuser=<value> | データベースのユーザー名を上書き指定する。省略時は wp-config.php の値を使用する |
--dbpass=<value> | データベースのパスワードを上書き指定する。省略時は wp-config.php の値を使用する |
--skip-column-names | SELECT 結果のカラム名ヘッダーを省略して値のみを出力する。スクリプトで結果を処理する際に便利 |
基本構文は wp db query "SQL文" です。
SQL 文を引数として渡す方法のほか、ファイルから読み込む wp db query < file.sql の形式も使えます。
よく使う組み合わせ
SELECT でデータを参照する
# 公開済み投稿のIDとタイトルを確認する
wp db query "SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post' LIMIT 10;"
# ユーザー数をロール別に集計する
wp db query "SELECT meta_value, COUNT(*) as count FROM wp_usermeta WHERE meta_key = 'wp_capabilities' GROUP BY meta_value;"
# wp_options テーブルで "transient" を含むキーの件数を確認する
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';"
SELECT はデータを読み取るだけでデータベースを変更しません。
LIMIT を付けて件数を絞る習慣をつけると、大規模なテーブルで誤って全件取得してしまうリスクを防げます。
UPDATE でデータを書き換える
# 実行前に SELECT で対象を確認する(必須)
wp db query "SELECT ID, post_status FROM wp_posts WHERE post_status = 'draft' AND post_type = 'post';"
# 確認後に UPDATE を実行する(要注意:不可逆的な操作)
wp db query "UPDATE wp_posts SET post_status = 'private' WHERE post_status = 'draft' AND post_type = 'post';"
UPDATE の実行前には必ず対応する SELECT を先に走らせ、対象レコードと件数を目視で確認してください。
WHERE 句を省略すると全行が更新されるため、条件の指定ミスには特に注意が必要です。
SQL ファイルを読み込んでバッチ処理する
# SQL ファイルを作成してから実行する
cat > cleanup.sql << 'EOF'
DELETE FROM wp_options WHERE option_name LIKE '_transient_%';
DELETE FROM wp_options WHERE option_name LIKE '_site_transient_%';
EOF
# 実行前にファイルの内容を確認する
cat cleanup.sql
# ファイルを読み込んで実行する
wp db query < cleanup.sql
複数の SQL 文をまとめて実行したい場合はファイルに書き出してから渡す方法が管理しやすく、Git によるバージョン管理も可能です。
実行前に必ず cat や less でファイルの内容を確認してください。
関連コマンド
データベース操作には wp db query 以外にも用途に応じた WP-CLI コマンドが用意されています。
| コマンド | 用途 | wp db query との違い |
|---|---|---|
wp db export | データベース全体または指定テーブルを SQL ファイルにダンプする | バックアップ専用。書き込み操作は不可 |
wp db import | SQL ファイルをデータベースにインポートする | ファイル単位のインポート専用 |
wp eval | PHP コードを WordPress 環境で実行する | WordPress 関数経由でDBを操作する。生 SQL は書かない |
wp search-replace | データベース内の文字列を一括置換する | URL 変換など定型の文字列置換に特化。シリアライズ対応あり |
URL の一括変更には wp search-replace、PHP シリアライズ形式の値を扱う場合も wp search-replace が適しています。
生 SQL を書かずに WordPress 関数経由でデータを操作したい場合は wp eval を使う方法もあります。
ユースケース
期限切れトランジェントを一括削除してDBを軽量化する
# 削除前に件数を確認する
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';"
# トランジェントを削除する
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_transient_%';"
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_site_transient_%';"
# 削除後に件数が減ったか確認する
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';"
トランジェントが大量に蓄積すると wp_options テーブルが肥大化しサイトが遅くなる場合があります。
削除前後に件数を確認することで、処理が正しく完了したかを検証できます。
特定ユーザーの投稿を別ユーザーに移行する
# 移行元ユーザー(ID=5)の投稿数を確認する
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_author = 5 AND post_type = 'post';"
# 移行先ユーザー(ID=3)が存在するか確認する
wp db query "SELECT ID, user_login FROM wp_users WHERE ID = 3;"
# 移行元の投稿を移行先ユーザーに更新する(要注意:不可逆的な操作)
wp db query "UPDATE wp_posts SET post_author = 3 WHERE post_author = 5 AND post_type = 'post';"
ユーザーを削除する前に、そのユーザーの投稿を別の著者に付け替える作業などに使います。
UPDATE 実行前に SELECT で移行先ユーザーの存在確認と件数確認を必ず行ってください。
AIエージェントが実行しようとした場合
AIエージェントの目的
AIエージェントは主に次のような目的で wp db query を実行しようとすることがあります。
- サイトのデータ状況を把握するための初期調査として、SELECT 文で投稿数・ユーザー数・オプション値を確認するために実行することがあります。
- 不要データ(期限切れトランジェント・スパムコメント・孤立したメタデータなど)の削除や整理を自動化するために実行することがあります。
- サイト移行や設定変更の一環として、URL やメタ値を UPDATE 文で書き換えるために実行することがあります。
危険性
wp db query コマンドは、任意の SQL 文をデータベースに対して直接実行します。
SELECT のみを実行する場合は危険性がなく、AIエージェントが実行しても問題ありません。
一方、UPDATE・DELETE・DROP・TRUNCATE などの書き込み・破壊系クエリは不可逆的な操作を伴うため、AIエージェントが自動生成・自動実行することは推奨されません。
特に WHERE 句が欠落したまま UPDATE や DELETE が実行されると、テーブル全行が影響を受けます。実行前には必ず対応する SELECT を先に走らせ、人間が対象レコードと件数を確認した上で実行の判断をしてください。
本番環境での書き込み系クエリ実行前には wp db export でバックアップを取ることも強く推奨します。