Ведение сайта на WordPress часто сопровождается накоплением большого количества записей, которые со временем теряют актуальность. Это может замедлить работу сайта и усложнить управление контентом. В этой статье мы рассмотрим, как добавить автоматическое удаление старых записей в WordPress по дате публикации с помощью кода и плагинов, а также как сделать это безопасно и гибко.
Почему важно удалять старые записи в WordPress
Удаление устаревших записей помогает поддерживать базу данных в чистоте, снижать нагрузку на сервер и облегчает навигацию для пользователей. Особенно это актуально для сайтов с новостями, блогами и каталогами, где контент быстро устаревает.
Кроме того, чистая база данных снижает время резервного копирования и ускоряет работу административной панели.
Перед автоматическим удалением обязательно создавайте резервные копии, чтобы избежать потери важных данных.
Способы автоматического удаления старых записей
Удаление через wp-cron и пользовательскую функцию
Самый гибкий способ — написать собственный код, который будет запускаться по расписанию и удалять записи старше определённого срока. Для этого создадим функцию и привяжем её к событию wp-cron.
function wpstuff_delete_old_posts() {
global $wpdb;
$days = 180; // Удалять записи старше 180 дней
$date = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish' AND post_type = 'post'",
$date
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true); // true - удаление без корзины
}
}
}
// Регистрируем событие, если оно ещё не зарегистрировано
if (!wp_next_scheduled('wpstuff_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpstuff_daily_delete_old_posts');
}
add_action('wpstuff_daily_delete_old_posts', 'wpstuff_delete_old_posts');Этот код удалит все опубликованные записи старше 180 дней. Вы можете изменить значение переменной $days под свои задачи.
Использование плагинов для автоматизации
Если нет желания писать код, можно воспользоваться плагинами с похожим функционалом. Например:
- Clearfy Pro — имеет функции оптимизации и очистки базы данных, включая удаление старого контента;
- WPRemark — инструмент для управления комментариями и спамом, может помочь с автоматизацией удаления;
Однако специализированного плагина именно для массового удаления старых записей мало, поэтому собственный скрипт — оптимальное решение.
Как сделать удаление безопасным и гибким
Добавление фильтра по категориям и типам записей
Часто нужно удалять записи не всех типов, а только определённые категории или типы. В коде выше можно добавить фильтр:
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish' AND post_type = 'post' AND ID IN (
SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = %d
)",
$date, $category_id
));Здесь $category_id — ID категории, записи из которой подлежат удалению.
Использование статуса "В корзине" перед окончательным удалением
Чтобы избежать случайной потери данных, можно сначала переводить записи в корзину, а потом удалять их окончательно через некоторое время.
Для этого замените wp_delete_post($post_id, true); на wp_trash_post($post_id);. Далее можно настроить отдельный скрипт, который будет очищать корзину.
Логирование удалённых записей
Для контроля полезно вести лог удалённых записей. Пример записи в файл:
function wpstuff_log_deleted_post($post_id) {
$log_file = WP_CONTENT_DIR . '/wpstuff_deleted_posts.log';
$post = get_post($post_id);
$log_entry = date('Y-m-d H:i:s') . " - Deleted post ID: {$post_id}, Title: {$post->post_title}\n";
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
// Вызов логирования внутри цикла удаления
foreach ($post_ids as $post_id) {
wp_delete_post($post_id, true);
wpstuff_log_deleted_post($post_id);
}Дополнительные советы по управлению устаревшим контентом
Архивирование вместо удаления
Если вы не хотите полностью удалять записи, можно рассмотреть перенос их в отдельный архивный тип записей или в закрытый раздел сайта. Это возможно реализовать с помощью кастомных типов записей и плагинов типа WPCommunity для управления контентом.
Оптимизация базы данных после удаления
После удаления большого количества записей полезно оптимизировать базу данных. Для этого можно использовать Clearfy Pro или написать собственный SQL-запрос для оптимизации таблиц.
Автоматизация с помощью WP CLI
Для опытных пользователей удобен WP CLI — командная строка для управления WordPress. Команда для удаления постов по дате:
wp post delete $(wp post list --post_type=post --post_status=publish --date_query='before=180 days ago' --field=ID) --forceЭто можно запускать из cron на сервере для регулярного удаления записей.
Выводы и лучшие практики
Автоматическое удаление старых записей — мощный инструмент для поддержания здоровья сайта, но его нужно использовать с осторожностью. Всегда делайте резервные копии, тестируйте на тестовом сайте и применяйте фильтры для точного контроля.
Лучше всего комбинировать собственные скрипты с профессиональными плагинами, такими как Clearfy Pro, для комплексной оптимизации и управления контентом.