Как создать собственный плагин для автоматического удаления старых постов в WordPress

В процессе эксплуатации сайта на WordPress часто возникает необходимость автоматически удалять устаревший контент, например, посты, которым больше определённого времени. Это помогает поддерживать актуальность сайта и экономить ресурсы сервера. В этой статье мы подробно разберём, как создать собственный плагин для автоматического удаления старых постов, используя WordPress API и WP-Cron.

Почему стоит использовать собственный плагин для удаления старых постов?

Многие решают подобную задачу с помощью готовых плагинов, но в ряде случаев – особенно при уникальных требованиях – лучше написать собственное решение. Это даёт следующие преимущества:

  • Полный контроль над логикой удаления.
  • Возможность кастомизации под типы записей и условия.
  • Отсутствие лишнего функционала и нагрузок от сторонних плагинов.

Примером может служить ситуация, когда нужно удалять только опубликованные записи старше 365 дней, но не трогать страницы или черновики.

Создание базового плагина: структура и подключение WP-Cron

Начнём с создания базового плагина. Создайте папку wpboard-auto-delete-posts в каталоге wp-content/plugins, а в ней файл wpboard-auto-delete-posts.php с таким содержимым:

<?php
/*
Plugin Name: WPBoard Auto Delete Old Posts
Description: Автоматическое удаление устаревших постов старше заданного срока.
Version: 1.0
Author: WPBoard
*/

// Защита от прямого запуска
if (!defined('ABSPATH')) {
    exit;
}

// Активируем CRON задачу при активации плагина
register_activation_hook(__FILE__, 'wpboard_activate_auto_delete_cron');
function wpboard_activate_auto_delete_cron() {
    if (!wp_next_scheduled('wpboard_cron_delete_old_posts')) {
        wp_schedule_event(time(), 'daily', 'wpboard_cron_delete_old_posts');
    }
}

// Отключаем CRON задачу при деактивации плагина
register_deactivation_hook(__FILE__, 'wpboard_deactivate_auto_delete_cron');
function wpboard_deactivate_auto_delete_cron() {
    wp_clear_scheduled_hook('wpboard_cron_delete_old_posts');
}

// Подписываем функцию на событие
add_action('wpboard_cron_delete_old_posts', 'wpboard_delete_old_posts');

// Основная функция удаления
function wpboard_delete_old_posts() {
    $days = 365; // Удалять посты старше 365 дней
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
    );

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => array($date_query),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true); // true — принудительное удаление без корзины
        }
    }
}

Этот код создаёт ежедневное задание, которое удаляет все опубликованные посты старше 365 дней.

Настройка и расширение плагина: выбор типов записей и условий

В реальном проекте нужно часто более гибко настраивать условия удаления. Например, удалять записи только из определённой категории или исключать определённые посты. Для этого можно добавить настройки в админке.

Пример расширения для удаления постов только из категории с ID 10 и 15:

function wpboard_delete_old_posts() {
    $days = 365;
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
    );

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => array($date_query),
        'category__in' => array(10, 15),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
        }
    }
}

Для добавления страницы настроек плагина используйте add_options_page и сохранение параметров через update_option. Это позволит администратору менять количество дней и категории через интерфейс.

Оптимизация и безопасность удалений

Удаление большого количества постов может вызвать нагрузку на сервер и проблемы с производительностью. Рекомендуется:

  • Разбивать удаление на партии, например, по 20 постов за один запуск.
  • Логировать удалённые посты для восстановления при ошибках.
  • Использовать nonce и права доступа, если реализуется интерфейс управления.

Пример удаления партиями:

function wpboard_delete_old_posts() {
    $days = 365;
    $batch_size = 20;

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
    );

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => array($date_query),
        'fields' => 'ids',
        'posts_per_page' => $batch_size,
    );

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
            error_log("WPBoard: Deleted post ID {$post_id}");
        }
    }
}

Советы по отладке и мониторингу работы плагина

Для проверки работы плагина полезно:

  • Временно запускать функцию удаления вручную через админку или WP-CLI.
  • Использовать плагины для мониторинга запланированных задач, например, WP Crontrol, который позволит видеть и запускать cron задачи вручную.
  • Проверять журналы ошибок сервера и логи плагина.

Альтернативные решения и полезные плагины

Если не хотите писать плагин с нуля, можно использовать готовые решения с похожим функционалом:

  • Auto Delete Posts – простой плагин для удаления постов по возрасту.
  • Clearfy Pro – в составе набора оптимизаций есть возможности по очистке и удалению устаревших данных. Подробнее на wpshop.ru.

Но собственный плагин всегда можно дополнить или интегрировать с ними для расширения функционала.

Как создать динамическую форму обработки данных в WordPress с примером кода
13.02.2026
Как сделать автоматическое сохранение изменений в WordPress для кастомных типов записей
18.01.2026
Как избежать проблем с перенаправлениями в WordPress
04.01.2026
Использование хука woocommerce_checkout_create_order_line_items для изменения товаров в заказе WooCommerce
09.06.2026
Как добавить CSS класс к постам в WordPress по условию
10.04.2026