Flamingoのデータを一括削除するコードメモ

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がアクセスしてもスルーされる。

処理内容

  1. 一度に削除する件数を $limit = 2000; に設定
  2. post_typeflamingo_inbound、かつ post_statusspam の投稿(スパムデータ)を取得
  3. 取得したIDをループして wp_delete_post() で削除
  4. 削除が終わったら、ランダムな背景色を出して、1秒後に自動リロード
  5. まだスパムが残っていれば繰り返し削除
  6. 最後まで削除が完了したら「スパム削除完了しました!」と表示して終了

背景色がランダムに変わることで、「ちゃんとリロードされてるか」を視覚的に確認できる。

注意点

  • 一度に大量削除する処理なので、サーバーの負荷には注意。
    初めは100件くらいから動作確認し、タイムアウトしない範囲の数値にすると良い。
    逆にもしタイムアウトが出る場合は、 $limit の数を1000や500に減らすと安定しやすい。
  • wp_delete_post() は完全削除モード(第2引数を true にしている)なので、ゴミ箱を経由しない。
  • 削除したデータは復元できない。実行前にバックアップを取っておくのが安全。

実行手順(備忘)

  1. functions.php に上記コードを貼る
  2. 管理者アカウントでログイン
  3. ブラウザで https://example.com/?delete_inbound=true にアクセス
  4. 背景がカラフルに切り替わりながら削除が進む
  5. 「スパム削除完了しました!」と出たらOK

削除がすぐ終わるようなら、不要になったらfunctions.phpから削除しておく。

そもそも:Flamingoがスパムを保存する理由

Flamingoは、Contact Form 7の送信内容をWordPressの投稿データとして保存している。
「スパム」も post_statusspam の投稿として扱われる。
つまり、WordPressの投稿テーブル(wp_posts)が実際の保存先になっている。

この仕組み自体は便利なんだけど、スパムが多い環境ではDBの肥大化を招きやすい。

別の選択肢(Flamingo以外)

もしスパムを保存したくない場合や、より軽量な履歴管理をしたい場合は、
Flamingo以外の問い合わせ保存プラグインを使う手もある。

私のおすすめは以下プラグイン。

Contact Form 7 Database Addon – CFDB7

Flamingoと比べて、スパムをそもそも保存しない仕様になっている。
フォーム管理を整理したいタイミングで、別のプラグインへの切り替えも検討しておくといい。

まとめ

Flamingoは便利だけど、スパムも保存される設計
スパム対策プラグインを入れても100%は防げないので、定期的にスパム削除をしておくのが安心。

このコードを入れておけば、管理者だけが安全に、数万件単位のスパムを削除できる。
とりあえず「サイトが重い」「管理画面が開かない」となった時に思い出す用メモ。


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA