В 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 и убедиться, что задачи действительно запускаются, особенно на хостингах с ограничениями.
Если нужен более продвинутый функционал (например, управление через панель администратора, логи или выборочные правила), можно развивать этот базовый плагин дальше.