Управление большим объёмом контента на сайте WordPress — задача, с которой рано или поздно сталкивается каждый владелец. Часто возникает необходимость автоматически удалять устаревшие записи, чтобы не захламлять базу данных и улучшить производительность сайта. В этой статье мы подробно разберём, как настроить автоматическое удаление старого контента с помощью WP-Cron и кастомного кода. Также рассмотрим полезные плагины, которые могут упростить эту задачу.
Что такое WP-Cron и зачем он нужен для автоматизации задач
WP-Cron — встроенная в WordPress система планировщика задач. Она позволяет запускать определённые функции через заданные интервалы времени. Это идеальный инструмент для автоматизации рутинных процессов, включая удаление старого контента.
В отличие от системного cron на сервере, WP-Cron запускается при загрузке страниц, что иногда может приводить к задержкам или пропускам задач. Но для большинства сайтов его возможностей достаточно.
Ключевое преимущество WP-Cron — простота использования и интеграция с ядром WordPress, позволяющая писать собственные функции и вызывать их по расписанию.
Как написать функцию для удаления старых записей в WordPress
Для начала создадим функцию, которая будет удалять записи старше определённого количества дней. В нашем примере — 180 дней. Чтобы избежать случайного удаления важных данных, функция будет искать записи со статусом publish и типом post.
function wpteam_delete_old_posts() {
global $wpdb;
$days = 180; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} 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 — принудительное удаление без корзины
}
}
}
Эта функция выбирает все опубликованные записи, дата которых старше 180 дней, и удаляет их без возможности восстановления из корзины.
Подключение функции к WP-Cron
Чтобы функция запускалась автоматически, её нужно повесить на событие WP-Cron. Добавим задачу, которая будет срабатывать раз в сутки.
function wpteam_schedule_delete_old_posts() {
if (!wp_next_scheduled('wpteam_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpteam_daily_delete_old_posts');
}
}
add_action('wp', 'wpteam_schedule_delete_old_posts');
add_action('wpteam_daily_delete_old_posts', 'wpteam_delete_old_posts');
Код выше проверяет, запланировано ли событие, и если нет — ставит его в очередь. Затем в нужное время вызывается функция удаления.
Как остановить задачу, если нужно
Если потребуется отменить автоматическое удаление, используйте следующий код в functions.php или в плагине:
function wpteam_clear_schedule_delete_old_posts() {
$timestamp = wp_next_scheduled('wpteam_daily_delete_old_posts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpteam_daily_delete_old_posts');
}
}
// Вызовите эту функцию вручную или через админ-панель для удаления задачи.
Применение плагинов для автоматического удаления контента
Если вы не хотите писать код, существуют плагины, которые облегчают задачу удаления старого контента:
- Clearfy Pro — расширенный инструмент для оптимизации и автоматизации WordPress, включая управление старым контентом.
- WP-Cron Control — плагин для контроля и создания задач WP-Cron.
- Auto Delete Posts — специализированный плагин для планового удаления постов по дате.
Эти плагины предоставляют удобный интерфейс для настройки правил удаления, что особенно полезно для пользователей без опыта программирования.
Лучшие практики при автоматическом удалении контента
Автоматическое удаление записей — ответственная операция, которая требует осторожного подхода:
- Резервное копирование: Всегда делайте бэкап базы данных перед настройкой автоматических удалений.
- Тестирование: Запустите функцию на тестовом сайте или с ограниченным количеством записей.
- Исключения: Добавьте фильтры для исключения из удаления важных записей, например, с определёнными метками или категориями.
- Логи: Ведите лог удалённых записей для контроля изменений.
Пример расширения функции с исключениями
Допустим, не хотим удалять записи из категории «Новости». Добавим проверку:
function wpteam_delete_old_posts_with_exceptions() {
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'category__not_in' => [ get_cat_ID('Новости') ],
'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);
}
}
}
Такой подход даёт гибкость и предотвращает удаление критичных материалов.
Итоги и рекомендации
Автоматизация удаления старого контента с помощью WP-Cron и собственного кода — эффективный способ поддерживать базу данных WordPress в порядке. Это снижает нагрузку, улучшает производительность и упрощает администрирование сайта.
Если вы новичок, попробуйте сначала плагины, например, Clearfy Pro, а затем переходите к кастомным решениям для максимальной гибкости.
Настраивайте задачи WP-Cron с учётом особенностей вашего хостинга и нагрузки сайта, чтобы избежать пропусков выполнения.