Почему важно удалять старые записи и как избежать проблем
Ведение большого количества записей в WordPress без контроля может привести к замедлению работы сайта, увеличению размера базы данных и снижению удобства администрирования. Особенно это актуально для блогов и новостных порталов, где ежедневно появляются новые публикации. Однако удаление старых записей требует аккуратности, чтобы не потерять важный контент или не нарушить структуру сайта.
В этой статье мы разберём, как безопасно и автоматически удалять устаревшие записи, учитывая необходимость резервного копирования и минимизации рисков. Также рассмотрим, какие плагины облегчат процесс, и приведём примеры собственных функций для кастомизации.
Автоматизация удаления старых записей с помощью WP-Cron
WordPress имеет встроенную систему планировщика задач — WP-Cron, которая позволяет запускать определённые действия по расписанию. Мы можем использовать её, чтобы регулярно удалять записи старше заданного срока.
Ниже — пример функции, которая удаляет записи типа post, опубликованные более 180 дней назад. Функция запускается раз в сутки.
function wpfactory_delete_old_posts() {
global $wpdb;
$days = 180;
$date_limit = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID постов старше $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_limit
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удалять без перемещения в корзину
}
}
}
if (!wp_next_scheduled('wpfactory_cron_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpfactory_cron_delete_old_posts');
}
add_action('wpfactory_cron_delete_old_posts', 'wpfactory_delete_old_posts');Эта функция использует прямой запрос к базе для получения ID, после чего удаляет записи без возможности восстановления из корзины. Важно использовать wp_delete_post для корректного удаления с учётом всех связанных данных.
Рекомендации по безопасности и тестированию
Перед использованием такой автоматизации обязательно сделайте резервную копию сайта и базы данных. Можно сначала не удалять записи, а просто логировать, какие посты попадают под критерий, чтобы убедиться в правильности работы кода.
Для этого замените wp_delete_post($post_id, true); на error_log('Old post for deletion: ' . $post_id); и просмотрите логи.
Использование плагинов для автоматического удаления старого контента
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- Auto Delete Posts — позволяет настраивать правила удаления постов по дате и категории. Есть возможность исключать важные записи.
- Post Expirator — плагин для автоматического изменения статуса поста по истечении срока, можно настроить удаление или перевод в черновик.
- Clearfy Pro (https://wpshop.ru/clearfy-pro/?utm_source=wpfactory.ru&utm_medium=article&utm_campaign=kak-avtomatizirovat-udaleniye-staryh-zapisej-v-wordpress-bez-riska) — содержит модуль оптимизации базы и управления контентом, включая автоматическое удаление старых записей с расширенными настройками.
Плагины упрощают задачу, но всегда внимательно проверяйте настройки, чтобы не потерять нужные данные.
Как исключить из удаления важные записи и кастомные типы записей
В реальных проектах часто требуется удалять не все старые записи, а только определённые категории или типы постов. Для этого в коде можно добавить дополнительные условия.
function wpfactory_delete_old_posts_filtered() {
$days = 180;
$date_limit = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'before' => $date_limit,
'inclusive' => true,
],
],
'category__not_in' => [1, 2], // ID категорий, которые исключаем
'posts_per_page' => -1,
'fields' => 'ids',
];
$old_posts = get_posts($args);
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
add_action('wpfactory_cron_delete_old_posts', 'wpfactory_delete_old_posts_filtered');Здесь мы исключаем категории с ID 1 и 2 из удаления. Аналогично можно фильтровать по меткам, типам записей и любым другим параметрам.
Удаление кастомных типов записей
Для удаления кастомных типов записей достаточно заменить параметр post_type на нужный:
'post_type' => 'my_custom_post_type'Это позволит настроить автоматическое удаление именно нужных типов контента.
Мониторинг и логирование удалений
Для контроля работы автоматического удаления полезно вести логи. Это можно сделать, например, записывая ID удалённых записей в отдельный файл или отправляя уведомления на email администратора.
function wpfactory_log_deleted_post($post_id) {
$log_file = WP_CONTENT_DIR . '/wpfactory_deleted_posts.log';
$message = date('Y-m-d H:i:s') . " - Deleted post ID: " . $post_id . "\n";
file_put_contents($log_file, $message, FILE_APPEND);
}
function wpfactory_delete_old_posts_with_log() {
$days = 180;
$date_limit = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = get_posts([
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [[
'before' => $date_limit,
'inclusive' => true,
]],
'posts_per_page' => -1,
'fields' => 'ids',
]);
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
wpfactory_log_deleted_post($post_id);
}
}
add_action('wpfactory_cron_delete_old_posts', 'wpfactory_delete_old_posts_with_log');Такой лог поможет отслеживать, что именно было удалено, и при необходимости быстро восстановить данные из резервной копии.
Выводы и лучшие практики
Автоматизация удаления старых записей — полезный инструмент для поддержания производительности и чистоты WordPress-сайта. Однако важно соблюдать осторожность:
- Всегда делайте резервные копии перед внедрением автоматического удаления.
- Тестируйте код на тестовом сайте или с логированием перед удалением.
- Используйте WP-Cron для планирования задач без нагрузки на сервер.
- Подключайте фильтры, чтобы исключать важный контент из удаления.
- Рассмотрите использование плагинов с проверенной репутацией для упрощения процесса.
Если нужна расширенная оптимизация и контроль, обратите внимание на Clearfy Pro, который объединяет функции оптимизации базы и управления контентом, включая автоматизацию удаления устаревших записей.