В ряде случаев владельцам сайтов на WordPress требуется автоматически удалять устаревший контент, например, записи старше определённого срока. Это актуально для новостных сайтов, сайтов со временными акциями, или просто для поддержания базы данных в порядке и экономии места на сервере. В этой статье подробно разберём, как реализовать автоматическое удаление записей по дате публикации с помощью собственного кода и популярных плагинов, а также как избежать типичных ошибок.
Зачем нужно автоматическое удаление старых записей в WordPress
С течением времени на сайте накапливается много устаревших публикаций, которые уже не актуальны. Они могут:
- Загромождать базу данных и влиять на производительность;
- Создавать путаницу для пользователей, показывая устаревшую информацию;
- Отрицательно сказываться на SEO, если страницы не обновляются и содержат устаревшие данные.
Автоматизация удаления помогает держать сайт в актуальном состоянии без постоянного ручного контроля.
Как настроить автоматическое удаление записей по дате с помощью WP-Cron
WP-Cron — встроенный механизм WordPress для планирования задач. Мы можем использовать его, чтобы регулярно запускать функцию удаления старых записей.
Шаг 1. Создание функции удаления
Напишем функцию, которая будет искать и удалять записи старше определённого количества дней. Для примера удалим записи старше 180 дней:
function wponline_delete_old_posts() {
global $wpdb;
$days_old = 180; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
// Получаем ID записей старше даты
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true - принудительное удаление без корзины
}
}
}
Эта функция получает ID всех опубликованных записей старше 180 дней и удаляет их без перемещения в корзину.
Шаг 2. Регистрация задачи WP-Cron
Чтобы функция запускалась автоматически, зарегистрируем еженедельное событие:
function wponline_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wponline_delete_old_posts_cron')) {
wp_schedule_event(time(), 'weekly', 'wponline_delete_old_posts_cron');
}
}
add_action('wp', 'wponline_schedule_old_posts_deletion');
add_action('wponline_delete_old_posts_cron', 'wponline_delete_old_posts');
Эти хуки создают событие, которое будет запускаться еженедельно и вызывать функцию удаления.
Шаг 3. Очистка задачи при деактивации плагина или темы
Чтобы не оставлять мусор, нужно отменить расписание при деактивации:
function wponline_clear_old_posts_deletion_schedule() {
$timestamp = wp_next_scheduled('wponline_delete_old_posts_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wponline_delete_old_posts_cron');
}
}
register_deactivation_hook(__FILE__, 'wponline_clear_old_posts_deletion_schedule');
Использование плагинов для удаления старого контента
Если вы не хотите писать код, есть плагины, которые помогут автоматически удалять старые записи.
Плагин "Auto Delete Posts"
- Позволяет настроить удаление записей по типу, статусу и возрасту;
- Работает по расписанию через WP-Cron;
- Имеет простой интерфейс в админке.
Вы можете скачать и установить плагин с официального репозитория WordPress, а также посмотреть подробности на wpshop.ru.
Clearfy Pro — универсальная оптимизация с функцией удаления
Если вы используете Clearfy Pro, в нём есть расширенные возможности по автоматической очистке базы данных, включая удаление старых постов, ревизий, черновиков и мусорных комментариев.
Особенности и советы при автоматическом удалении контента
Выбор правильного периода удаления
Определите, какой срок действительно устарел для вашего сайта. Для новостей — это может быть 30-60 дней, для блогов — 1-2 года. Помните, что слишком агрессивное удаление может привести к потере ценных материалов.
Резервное копирование перед удалением
Обязательно настраивайте автоматическое создание резервных копий сайта. Например, с помощью плагина My Popup можно настроить уведомления о новых бэкапах или интегрировать с внешними сервисами.
Логирование удалений
Для контроля действий добавьте логирование в функцию удаления, чтобы видеть, какие записи и когда были удалены. Например:
function wponline_delete_old_posts() {
global $wpdb;
$days_old = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
error_log("[wponline] Deleted post ID: {$post_id}");
}
}
}
Расширение функционала: удаление по меткам и категориям
Иногда нужно удалять не просто по дате, а с дополнительными условиями, например, только записи в определённой категории или с меткой.
Пример расширенного запроса для удаления постов старше 90 дней из категории с ID 5:
function wponline_delete_old_category_posts() {
$days_old = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 5,
),
),
'fields' => 'ids',
'post_status' => 'publish',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
error_log("[wponline] Deleted post ID in category 5: {$post_id}");
}
}
}
Такой подход позволяет гибко управлять удалением и не затрагивать нужный контент.