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

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

Почему важно автоматизировать удаление старого контента

Удаление старых постов вручную — утомительный процесс, особенно если контента много. Автоматизация экономит время и ресурсы, поддерживает базу данных в чистоте, снижая нагрузку на сервер и ускоряя работу сайта.

Также автоматическое удаление помогает избежать накопления неактуальной информации, что важно для сайтов с временным контентом (акции, события, тестовые публикации).

Создание плагина для удаления постов старше 30 дней

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

Шаг 1. Создаём структуру плагина

Создайте папку wpmeta-auto-delete-posts в директории wp-content/plugins и файл wpmeta-auto-delete-posts.php внутри неё с таким содержанием:

<?php
/**
 * Plugin Name: WPMeta Auto Delete Posts
 * Description: Автоматическое удаление постов старше 30 дней
 * Version: 1.0
 * Author: WPMeta
 */

// Основной код плагина будет здесь

Шаг 2. Регистрируем задачу в WP-Cron

Для запуска функции удаления раз в сутки используем WP-Cron. Добавим активацию и деактивацию задачи, а также обработчик:

register_activation_hook(__FILE__, 'wpmeta_activate_delete_old_posts_schedule');
register_deactivation_hook(__FILE__, 'wpmeta_deactivate_delete_old_posts_schedule');

// Запланировать событие при активации
function wpmeta_activate_delete_old_posts_schedule() {
    if (!wp_next_scheduled('wpmeta_delete_old_posts_daily')) {
        wp_schedule_event(time(), 'daily', 'wpmeta_delete_old_posts_daily');
    }
}

// Удалить событие при деактивации
function wpmeta_deactivate_delete_old_posts_schedule() {
    $timestamp = wp_next_scheduled('wpmeta_delete_old_posts_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpmeta_delete_old_posts_daily');
    }
}

// Хук для выполнения функции
add_action('wpmeta_delete_old_posts_daily', 'wpmeta_delete_old_posts');

Шаг 3. Реализация функции удаления старых постов

Теперь напишем функцию, которая будет находить и удалять посты, которым больше 30 дней. Удалим только записи с типом post и статусом publish.

function wpmeta_delete_old_posts() {
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            // Безопасное удаление с перемещением в корзину
            wp_trash_post($post_id);
        }
    }
}

Как протестировать плагин и проверить его работу

Для тестирования можно временно изменить интервал WP-Cron на, например, минуту, чтобы не ждать сутки. Для этого замените 'daily' на 'hourly' в функции планирования:

wp_schedule_event(time(), 'hourly', 'wpmeta_delete_old_posts_daily');

Или вызовите функцию напрямую для проверки:

wpmeta_delete_old_posts();

Для отладки можно добавить логирование, например, с помощью error_log:

function wpmeta_delete_old_posts() {
    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_trash_post($post_id);
            error_log("WPMeta: Пост с ID $post_id перемещён в корзину.");
        }
    } else {
        error_log('WPMeta: Нет постов для удаления');
    }
}

Дополнительные настройки и улучшения

Удаление постов по определённой категории

Если нужно удалять посты только из определённой категории, можно добавить параметр category_name в запрос:

$args = [
    // остальные параметры
    'category_name' => 'news', // заменить на нужную категорию
];

Удаление не только постов, но и пользовательских типов записей

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

Использование плагина Clearfy Pro для оптимизации

Если у вас установлен Clearfy Pro, вы можете дополнительно включить функции оптимизации и очистки базы данных, что хорошо сочетается с автоматическим удалением постов.

Заключение

Создание собственного плагина для автоматического удаления старого контента — задача, которую реально решить за час-два, и она значительно облегчает поддержку сайта. Важно тестировать работу WP-Cron и убедиться, что задачи действительно запускаются, особенно на хостингах с ограничениями.

Если нужен более продвинутый функционал (например, управление через панель администратора, логи или выборочные правила), можно развивать этот базовый плагин дальше.

Как создать автоматический импорт постов с внешнего источника в WordPress
26.01.2026
Как добавить владельца поста в REST API WordPress
30.01.2026
Как избежать проблем с сериализацией в WordPress meta полях
05.01.2026
WordPress авторизация по телефону без пароля: настройка и лучшие плагины
16.03.2026
Как настроить автоматический rollback обновлений в WordPress
19.03.2026

Совсем скоро здесь откроется ресурс о вордпресс.