Во многих проектах на WordPress возникает необходимость регулярно очищать сайт от устаревшего контента — старых записей, которые потеряли актуальность. Это важно для поддержания актуальности сайта, оптимизации базы данных и улучшения производительности. В этой статье рассмотрим, как автоматизировать удаление старых постов с помощью встроенного планировщика задач WP-Cron и собственного PHP-кода без привлечения сторонних плагинов.
Почему стоит автоматизировать удаление старого контента
Ручное удаление старых записей неудобно и требует постоянного контроля. Автоматизация позволяет:
- Поддерживать порядок и актуальность контента;
- Сократить размер базы данных, ускорить запросы;
- Избежать накопления мусорных или устаревших данных;
- Обеспечить регулярное выполнение задачи без участия администратора.
Некоторые плагины предлагают такую функциональность, но нередко они избыточны и замедляют сайт. Поэтому разберём, как сделать это самостоятельно.
Как работает WP-Cron в WordPress
WP-Cron — это система планировщика задач, которая запускается при посещении сайта и позволяет выполнить определённую функцию в нужное время. Благодаря ей можно настроить регулярное выполнение очистки.
Основные шаги:
- Создать функцию, которая удаляет посты старше заданного срока;
- Зарегистрировать новую задачу в WP-Cron с нужным интервалом;
- Привязать нашу функцию к этой задаче.
Далее приведём подробный пример с кодом.
Пример кода: автоматическое удаление постов старше 180 дней
Добавьте следующий код в файл functions.php вашей активной темы или в отдельный плагин:
// Регистрируем интервал для еженедельного запуска
add_filter('cron_schedules', 'wptest_add_weekly_cron_schedule');
function wptest_add_weekly_cron_schedule($schedules) {
$schedules['weekly'] = array(
'interval' => 7 * 24 * 60 * 60, // 7 дней в секундах
'display' => __('Once Weekly')
);
return $schedules;
}
// Регистрируем событие при активации темы/плагина
function wptest_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wptest_delete_old_posts_hook')) {
wp_schedule_event(time(), 'weekly', 'wptest_delete_old_posts_hook');
}
}
add_action('wp', 'wptest_schedule_old_posts_deletion');
// Хук выполнения задачи
add_action('wptest_delete_old_posts_hook', 'wptest_delete_old_posts_function');
// Функция удаления старых постов
function wptest_delete_old_posts_function() {
global $wpdb;
// Определяем дату 180 дней назад
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
// Получаем ID постов старше 180 дней
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
'post', 'publish', $date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — безвозвратное удаление
}
}
}
// Удаляем задачу при деактивации темы/плагина
function wptest_clear_scheduled_event() {
$timestamp = wp_next_scheduled('wptest_delete_old_posts_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptest_delete_old_posts_hook');
}
}
register_deactivation_hook(__FILE__, 'wptest_clear_scheduled_event');
Объяснение кода
Мы добавляем свой интервал в WP-Cron — еженедельный запуск. При инициализации сайта проверяем, запланирована ли уже задача, и если нет — создаём её. Функция wptest_delete_old_posts_function получает ID всех опубликованных постов старше 180 дней и удаляет их безвозвратно.
Такой подход безопасен и не требует сторонних плагинов. Для изменения периода удаления просто измените параметр в strtotime('-180 days') на нужный.
Дополнительные советы по безопасности и оптимизации
Перед удалением данных рекомендуем:
- Создавать резервные копии сайта и базы данных;
- Добавить логирование удалённых постов для контроля;
- Тестировать код в среде разработки;
- Рассмотреть возможность использования пользовательских типов записей (CPT), если нужно очищать не только стандартные посты.
Пример логирования удалённых ID:
function wptest_delete_old_posts_function() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
'post', 'publish', $date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
error_log('WPTest: удалён пост ID ' . $post_id);
}
}
}
Использование плагинов для автоматизации удаления (альтернативный вариант)
Если вы предпочитаете использовать проверенные решения, рассмотрите плагины, которые предоставляют гибкий функционал автоматического удаления контента. Например:
- Auto Delete Posts — простой плагин для удаления постов по времени;
- Clearfy Pro — расширенный плагин оптимизации с функцией удаления устаревшего контента;
- WP Remote Post для более сложных сценариев работы с постами.
Однако если ваша задача проста — собственный код на WP-Cron будет более лёгким и быстрым решением.