【WordPress】自動下書き投稿の一括削除・自動削除処理を実装する方法

【WordPress】自動下書き投稿の一括削除・自動削除処理を実装する方法 WordPress

WordPressでは、投稿を作成したまま放置している「自動下書き(auto-draft)」が管理画面に溜まっていくことがあります。これらは定期的に削除することで、データベースの不要な肥大化を防ぎ、運用を快適に保つことができます。

この記事では、管理画面から一括削除する方法と、保持期間を独自にカスタマイズして定期削除する処理をfunctions.phpに実装する方法の両方を紹介します。

スポンサーリンク

自動下書きとは

WordPressでは、新規投稿画面を開いただけで「auto-draft」ステータスの投稿が自動的に生成されます。これらは未使用であれば削除しても問題ありません。

WordPressは既に7日後に自動削除している
WordPressコアにはwp_delete_auto_drafts()という関数が標準で組み込まれており、7日以上経過した自動下書きを毎日自動的に削除する仕組みが既定で動いています(developer.wordpress.orgで確認)。そのため、この記事のカスタムコードが本当に必要になるのは、7日より短い(あるいは長い)保持期間にしたい場合や、任意のタイミングで手動実行したい場合です。

一括削除処理をfunctions.phpに追加する方法

以下のコードをテーマのfunctions.phpに追加することで、指定した日数より前の自動下書きを一括削除できます。

functions.php:日付フィルタ付きの一括削除関数
function delete_all_auto_drafts($days_old = 1) {
  global $wpdb;
  $auto_drafts = $wpdb->get_col($wpdb->prepare(
    "SELECT ID FROM {$wpdb->posts}
     WHERE post_status = 'auto-draft'
       AND DATE_SUB(NOW(), INTERVAL %d DAY) > post_date",
    $days_old
  ));

  foreach ($auto_drafts as $post_id) {
    wp_delete_post($post_id, true);
  }

  return count($auto_drafts);
}
投稿日時によるフィルタを必ず入れる
自動下書きは「新規投稿」画面を開いた瞬間に生成されるため、日付で絞り込まずに全件削除すると、今まさに別の執筆者が書き始めた直後の自動下書きまで削除されてしまう危険があります。WordPressコア自身が7日という閾値を設けているのと同様に、DATE_SUB(NOW(), INTERVAL N DAY) > post_dateで一定期間より古いものだけを対象にしましょう。

この関数を実際に呼び出すには、管理画面に実行ボタンを設置するのが簡単です。

functions.php:管理画面に実行ボタンを設置
// 設定 > 一般 に実行ボタンを追加
function add_auto_draft_cleanup_button($settings) {
  if (isset($_GET['auto_draft_cleanup']) && check_admin_referer('auto_draft_cleanup')) {
    if (current_user_can('manage_options')) {
      $deleted = delete_all_auto_drafts(1);
      add_action('admin_notices', function () use ($deleted) {
        echo '<div class="notice notice-success"><p>自動下書きを' . intval($deleted) . '件削除しました。</p></div>';
      });
    }
  }
}
add_action('admin_init', 'add_auto_draft_cleanup_button');

function render_auto_draft_cleanup_link() {
  if (current_user_can('manage_options')) {
    $url = wp_nonce_url(admin_url('options-general.php?auto_draft_cleanup=1'), 'auto_draft_cleanup');
    echo '<p><a href="' . esc_url($url) . '" class="button">自動下書きを今すぐ削除(1日以上前のもの)</a></p>';
  }
}
add_action('admin_notices', 'render_auto_draft_cleanup_link');

「設定」>「一般」画面に表示されるボタンをクリックすると、nonceと権限チェックを経て、1日以上前の自動下書きが削除されます。

定期的に自動削除する処理の実装(Cron対応)

WordPressの疑似Cron(WP-Cron)を使えば、指定した保持期間で自動下書きを定期的に自動削除できます。以下のコードをfunctions.phpに追加してください。

functions.php:Cronによる定期削除
// イベントの登録(例:1日以上前の自動下書きを毎日削除)
function schedule_auto_draft_cleanup() {
  if (!wp_next_scheduled('auto_draft_cleanup_event')) {
    wp_schedule_event(time(), 'daily', 'auto_draft_cleanup_event');
  }
}
add_action('wp', 'schedule_auto_draft_cleanup');

// イベントのフック処理
function run_auto_draft_cleanup() {
  delete_all_auto_drafts(1); // 1日以上前の自動下書きのみ対象
}
add_action('auto_draft_cleanup_event', 'run_auto_draft_cleanup');

この処理により、1日に1回、1日以上前の自動下書きが自動で削除されます。日数はサイトの運用スタイルに合わせて調整してください。

登録されたCronイベントの確認方法

実行予定のWP-Cronイベントを確認するには、「WP Crontrol」などのプラグインを使用すると便利です。管理画面から現在のスケジュールと実行履歴を一覧表示できます。

注意点

  • この処理は「auto-draft」投稿のみを対象にしています。他の下書き(draft)は削除されません。
  • データを完全に削除するため、削除後に復元はできません。念のためバックアップを取ってから実行してください。
  • 投稿日時によるフィルタを外して全件削除しないよう注意してください。
  • 運用中のサイトでは、頻度やタイミングを考慮して実装してください。

関連記事

よくある質問(FAQ)

Q特定カテゴリーの全記事を一括削除するPHPスクリプトは?
AWP_Queryでカテゴリー指定の全記事IDを取得し、foreach内でwp_delete_post($id, true)(trueでゴミ箱を経由せず完全削除)を実行します。大量削除の場合はタイムアウトを考慮してバッチ処理します。
Q削除前にバックアップを取る方法は?
Awp_delete_post()前にget_post()でオブジェクトを保存し、独自テーブルや一時オプションに記録します。またはphpMyAdminで削除前にDBエクスポートしておく方が確実です。
Q誤って削除した場合の復元方法はありますか?
Awp_trash_post()でゴミ箱に移動した場合はwp_untrash_post()で復元できます。wp_delete_post($id, true)(完全削除)した場合はDBバックアップからの復元が必要です。定期的なバックアップが重要です。

まとめ

WordPressで自動生成される「auto-draft」投稿は、コア標準で7日後に自動削除されますが、保持期間をカスタマイズしたい場合は本記事のコードが役立ちます。一括削除と自動削除を組み合わせて導入すれば、手間なく運用効率を上げることができます。投稿日時によるフィルタを外さないことが、執筆中のドラフトを守る最大のポイントです。

運用状況に応じて、削除頻度や処理対象をカスタマイズしてみてください。