Contact Form 7を使っていると、自動的にFlamingo(問い合わせ履歴管理プラグイン)も入れている人が多いと思う。
ただ、このFlamingoはスパムも全部保存してしまう仕様になっている。
スパムが少ないうちはいいけど、放置するとあっという間に数万件、ひどい時には10万件を超えたことがある。
管理画面から削除しようとしても、1件ずつか、せいぜい100件単位。
さらに件数が多すぎるとサーバーがタイムアウトして削除が完了しない。
とはいえ、データベースを直接いじるのもリスクが高い。
というわけで、テーマ側で動かせる削除コードを用意しておいた。
(functions.phpに記述)
コード全体
<?php
// スパムの問い合わせ履歴を削除するコード
add_action('template_redirect', function () {
if (!is_user_logged_in() || !current_user_can('manage_options')) {
return;
}
if (isset($_GET['delete_inbound']) && $_GET['delete_inbound'] === 'true') {
$limit = 2000;
$args = [
'post_type' => 'flamingo_inbound',
'post_status' => 'spam',
'posts_per_page' => $limit,
'fields' => 'ids',
];
$posts = get_posts($args);
if ($posts) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true);
}
// ランダムな背景色を生成
$bg_color = sprintf('#%06X', mt_rand(0, 0xFFFFFF));
// 自動で1秒後にリロードして続行
echo '<!DOCTYPE html><html><head><meta charset="UTF-8">';
echo '<title>削除中...</title>';
echo '<meta http-equiv="refresh" content="1">';
echo '<style>body { background-color: ' . esc_attr($bg_color) . '; color: #fff; font-size: 1.5em; text-align: center; padding-top: 20vh; }</style>';
echo '</head><body>';
echo '<p>' . count($posts) . ' 件削除しました。続行します...</p>';
echo '<p>背景色でリロードを視覚確認中:' . $bg_color . '</p>';
echo '</body></html>';
exit;
} else {
wp_die('スパム削除完了しました!');
}
}
});
動作の仕組み
トリガー
- URLに
?delete_inbound=trueを付けてアクセスすると実行される。
例)https://example.com/?delete_inbound=true
実行条件
- WordPressにログイン中であること
manage_options権限を持つ(=管理者)こと- 上記URLパラメータ付きでアクセスしたとき
それ以外の状況では一切動かない。
つまり、一般ユーザーやBotがアクセスしてもスルーされる。
処理内容
- 一度に削除する件数を
$limit = 2000;に設定 post_typeがflamingo_inbound、かつpost_statusがspamの投稿(スパムデータ)を取得- 取得したIDをループして
wp_delete_post()で削除 - 削除が終わったら、ランダムな背景色を出して、1秒後に自動リロード
- まだスパムが残っていれば繰り返し削除
- 最後まで削除が完了したら「スパム削除完了しました!」と表示して終了
背景色がランダムに変わることで、「ちゃんとリロードされてるか」を視覚的に確認できる。
注意点
- 一度に大量削除する処理なので、サーバーの負荷には注意。
初めは100件くらいから動作確認し、タイムアウトしない範囲の数値にすると良い。
逆にもしタイムアウトが出る場合は、$limitの数を1000や500に減らすと安定しやすい。 wp_delete_post()は完全削除モード(第2引数をtrueにしている)なので、ゴミ箱を経由しない。- 削除したデータは復元できない。実行前にバックアップを取っておくのが安全。
実行手順(備忘)
- functions.php に上記コードを貼る
- 管理者アカウントでログイン
- ブラウザで
https://example.com/?delete_inbound=trueにアクセス - 背景がカラフルに切り替わりながら削除が進む
- 「スパム削除完了しました!」と出たらOK
削除がすぐ終わるようなら、不要になったらfunctions.phpから削除しておく。
そもそも:Flamingoがスパムを保存する理由
Flamingoは、Contact Form 7の送信内容をWordPressの投稿データとして保存している。
「スパム」も post_status が spam の投稿として扱われる。
つまり、WordPressの投稿テーブル(wp_posts)が実際の保存先になっている。
この仕組み自体は便利なんだけど、スパムが多い環境ではDBの肥大化を招きやすい。
別の選択肢(Flamingo以外)
もしスパムを保存したくない場合や、より軽量な履歴管理をしたい場合は、
Flamingo以外の問い合わせ保存プラグインを使う手もある。
私のおすすめは以下プラグイン。
Contact Form 7 Database Addon – CFDB7
Flamingoと比べて、スパムをそもそも保存しない仕様になっている。
フォーム管理を整理したいタイミングで、別のプラグインへの切り替えも検討しておくといい。
まとめ
Flamingoは便利だけど、スパムも保存される設計。
スパム対策プラグインを入れても100%は防げないので、定期的にスパム削除をしておくのが安心。
このコードを入れておけば、管理者だけが安全に、数万件単位のスパムを削除できる。
とりあえず「サイトが重い」「管理画面が開かない」となった時に思い出す用メモ。
コメントを残す