Почему важно удалять старые записи в WordPress
За длительную работу сайта на WordPress в базе данных накапливается большое количество устаревших записей, таких как старые посты, черновики, ревизии или записи определённого типа, которые уже не актуальны. Это не только занимает место в базе, но и может замедлять работу сайта, увеличивать время резервного копирования и затруднять администрирование. Автоматизация удаления таких записей помогает поддерживать чистоту базы данных и оптимизировать производительность.
Особенно это актуально для новостных сайтов, блогов с частым обновлением, сайтов с событиями или акциями, где информация быстро теряет актуальность. Вместо того, чтобы вручную искать и удалять устаревший контент, лучше настроить автоматический процесс.
В этой статье рассмотрим, как реализовать автоматическое удаление записей по дате с помощью собственного кода и популярных плагинов, а также как правильно настроить безопасность и резервное копирование перед удалением.
Автоматическое удаление записей по дате с помощью WPUpdate функции
Создание кастомной функции удаления
Для автоматического удаления записей старше определённого периода можно использовать WP Cron — встроенный в WordPress механизм планировщика задач. Пример кода ниже демонстрирует, как создать функцию, которая будет удалять записи старше 180 дней.
function wpupdate_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_date < %s AND post_status = 'publish' AND post_type = 'post'",
$date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — без перемещения в корзину
}
}
}
// Регистрируем cron событие, если оно ещё не создано
if (!wp_next_scheduled('wpupdate_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpupdate_daily_delete_old_posts');
}
// Хук для выполнения функции
add_action('wpupdate_daily_delete_old_posts', 'wpupdate_delete_old_posts');Этот код добавляет в WordPress ежедневное событие, которое автоматически удаляет все опубликованные записи старше 180 дней. Вы можете изменить период хранения, подставив другое число в переменную $days.
Безопасность и тестирование
Перед внедрением такой функции на боевой сайт настоятельно рекомендуется:
- Сделать полную резервную копию базы данных.
- Проверить работу функции на тестовом или локальном сайте.
- Добавить логирование удалённых записей для контроля.
Для логирования можно добавить простой вывод в файл:
function wpupdate_log_deleted_post($post_id) {
$logfile = WP_CONTENT_DIR . '/wpupdate_deleted_posts.log';
$msg = date('Y-m-d H:i:s') . " - Deleted post ID: " . $post_id . "\n";
file_put_contents($logfile, $msg, FILE_APPEND);
}
// В функции удаления внутри цикла вызвать:
// wpupdate_log_deleted_post($post_id);Использование плагинов для автоматизации удаления старого контента
Плагин WP-Crontrol для управления задачами
Плагин WP-Crontrol позволяет удобно управлять задачами WP Cron из админки. С его помощью можно создавать, редактировать и удалять запланированные задачи, а также запускать их вручную для теста.
Используйте WP-Crontrol, чтобы проверить, что задача wpupdate_daily_delete_old_posts правильно запланирована и работает без ошибок.
Плагин Advanced Database Cleaner
Для более комплексной очистки базы данных подойдёт Advanced Database Cleaner. Он позволяет удалять устаревшие ревизии, черновики, спам-комментарии и другие ненужные данные, а также имеет настройку автоматического планирования очисток.
Хотя этот плагин не удаляет записи по дате публикации, его можно сочетать с кастомным кодом для поддержания базы в идеальном состоянии.
Удаление записей по дате для кастомных типов и таксономий
Как изменить код для кастомных типов постов
Если на вашем сайте используются кастомные типы записей, например, для событий, акций или портфолио, необходимо скорректировать запрос в функции удаления:
function wpupdate_delete_old_custom_posts() {
global $wpdb;
$days = 90; // Например, 90 дней для кастомного типа
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$post_type = 'event'; // Ваш кастомный тип
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish' AND post_type = %s",
$date_threshold, $post_type
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
add_action('wpupdate_daily_delete_old_custom_posts', 'wpupdate_delete_old_custom_posts');Не забудьте также зарегистрировать wp_cron событие для этой функции, аналогично примеру для стандартных постов.
Удаление записей с определёнными таксономиями
Для удаления записей, принадлежащих определённой категории или метке, можно добавить дополнительный SQL JOIN с таблицей таксономий:
function wpupdate_delete_old_posts_by_category() {
global $wpdb;
$days = 365;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$category_slug = 'news';
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->term_relationships} tr ON (p.ID = tr.object_id)
INNER JOIN {$wpdb->term_taxonomy} tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN {$wpdb->terms} t ON (tt.term_id = t.term_id)
WHERE p.post_date < %s
AND p.post_status = 'publish'
AND p.post_type = 'post'
AND tt.taxonomy = 'category'
AND t.slug = %s",
$date_threshold, $category_slug
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
add_action('wpupdate_daily_delete_old_posts_news_category', 'wpupdate_delete_old_posts_by_category');Рекомендации по безопасности и резервному копированию
Удаление данных — необратимая операция. Чтобы избежать потери важной информации, соблюдайте следующие рекомендации:
- Регулярно создавайте резервные копии базы данных с помощью плагинов, например, Backup Master или аналогичных.
- Настройте уведомления на email о выполнении автоматического удаления.
- Перед удалением больших объёмов данных тестируйте код на отдельном сайте.
- Отключайте функцию, если замечаете ошибки или нежелательные удаления.
Для уведомлений можно расширить функцию, добавив отправку письма с количеством удалённых записей.
Выводы и полезные советы
Автоматизация удаления старого контента в WordPress помогает поддерживать базу данных в порядке, улучшает скорость сайта и упрощает администрирование. Используйте встроенный WP Cron для запуска кастомных функций удаления по расписанию, комбинируйте с плагинами для комплексной очистки и обязательно делайте резервные копии.
Если вы используете на сайте продукты WPShop, например, Clearfy Pro, обратите внимание, что в них уже есть модули для оптимизации базы данных, которые можно настроить под свои задачи.
Автоматизация — это не только экономия времени, но и баланс между чистотой данных и безопасностью. Настраивайте процессы аккуратно и контролируйте результаты.