Когда на сайте WordPress накапливается много контента, особенно если есть разные типы записей (Custom Post Types), часто возникает необходимость автоматически удалять устаревший контент для освобождения места и поддержания актуальности данных. В этой статье мы подробно разберем, как настроить автоматическое удаление старого контента по типу записи. Это полезно для сайтов с большим объемом данных, новостных порталов, блогов и любых проектов, где часть контента теряет актуальность с течением времени.
Почему важно автоматизировать удаление старого контента
Ручное удаление устаревших записей – трудоемкий и ошибкоопасный процесс. Автоматизация позволяет:
- Сэкономить время администратора;
- Поддерживать базу данных в оптимальном состоянии;
- Избежать засорения сайта неактуальной информацией;
- Повысить скорость работы сайта и упростить администрирование.
Особенно это актуально для сайтов с большими объемами данных и не только для стандартных записей (posts), но и для кастомных типов записей, таких как события, объявления, товары и т.д.
Как работает автоматическое удаление по типу записи и дате
Основная идея — с помощью WP-Cron запускать регулярную задачу, которая будет искать все записи определенного типа, дата публикации которых старше заданного периода, и удалять их программно.
Это можно сделать, используя стандартные функции WordPress для запросов и удаления записей. Важно правильно настроить периодичность задачи и критерии отбора, чтобы не удалить нужный контент.
Основные шаги решения:
- Создаем функцию, которая выполняет поиск старых записей по типу и дате.
- Удаляем найденные записи с помощью wp_delete_post() с параметром
$force_delete = true, чтобы миновать корзину, если нужно. - Регистрируем хук для запуска этой функции по расписанию WP-Cron.
- Добавляем активацию и деактивацию расписания при включении и выключении плагина или темы.
Пример кода для автоматического удаления старых кастомных записей
Рассмотрим пример, где мы хотим автоматически удалять записи типа event, старше 90 дней.
function wpreset_delete_old_events() {
$days = 90; // количество дней для хранения записей
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'event',
'post_status' => 'publish',
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$old_events = get_posts($args);
if (!empty($old_events)) {
foreach ($old_events as $post_id) {
wp_delete_post($post_id, true); // true - удаляем без корзины
}
}
}
// Регистрируем задачу в WP-Cron
function wpreset_schedule_old_events_cleanup() {
if (!wp_next_scheduled('wpreset_old_events_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpreset_old_events_cleanup_hook');
}
}
add_action('wp', 'wpreset_schedule_old_events_cleanup');
// Привязываем функцию к событию
add_action('wpreset_old_events_cleanup_hook', 'wpreset_delete_old_events');
// Очищаем расписание при деактивации
function wpreset_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpreset_old_events_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpreset_old_events_cleanup_hook');
}
}
register_deactivation_hook(__FILE__, 'wpreset_deactivate_cleanup');
Подробное объяснение кода и настройка
Функция удаления записей
Функция wpreset_delete_old_events() формирует запрос с помощью get_posts(), где ищет все записи типа event с датой публикации старше 90 дней. Получает только ID записей для оптимизации.
Далее в цикле удаляет каждую запись через wp_delete_post() с параметром true, чтобы сразу удалять без помещения в корзину. Это гарантирует, что записи не останутся в базе.
Настройка WP-Cron
Функция wpreset_schedule_old_events_cleanup() проверяет, назначена ли уже задача на ежедневный запуск. Если нет — создает событие, которое выполняется раз в сутки.
Далее через add_action() привязывается наша функция удаления к этому событию.
Важно вызывать планирование события на хук wp, чтобы оно устанавливалось при загрузке сайта.
Удаление расписания при деактивации
Чтобы не оставлять ненужные задачи в WP-Cron после отключения плагина, используем register_deactivation_hook, чтобы удалить запланированное событие.
Как расширить или адаптировать решение под свои задачи
Вы можете легко изменить тип записей с event на любой другой или на стандартный post. Также достаточно поменять число дней в переменной $days, чтобы подстроиться под требования.
Для более сложных условий можно добавить дополнительные параметры в запрос $args, например, фильтр по таксономиям, мета-полям или статусам.
Если нужно не удалять записи безвозвратно, а только перемещать их в черновики или в корзину, измените параметр wp_delete_post($post_id, true) на false или вместо удаления использовать функцию wp_update_post() для смены статуса.
Рекомендации по безопасности и производительности
Перед применением такой автоматизации убедитесь, что у вас есть резервные копии сайта, чтобы избежать потери важных данных.
Если на сайте очень много записей, стоит ограничить количество удаляемых записей за один запуск, чтобы избежать перегрузки сервера. Для этого в параметре posts_per_page можно указать, например, 100, и запускать задачу чаще (каждые несколько часов).
Также полезно добавить логирование действий удаления для мониторинга работы скрипта, например, через запись в файл или использование плагина вроде Clearfy Pro, который помогает оптимизировать и контролировать процессы на сайте.
Другие плагины и инструменты для автоматизации очистки контента
Если вы не хотите самостоятельно писать код, можно использовать плагины, которые помогают управлять удалением или архивацией старого контента:
- WPReset — подходит для быстрой очистки сайта и восстановления после тестов, но не автоматизирует удаление контента по срокам.
- Clearfy Pro — расширяет возможности по оптимизации сайта, в том числе автоматизацию задач и очистку базы.
- Advanced Database Cleaner — помогает очищать базу от мусора, включая автоматизацию.
Для задач, специфичных под кастомные типы записей и сложную логику удаления, написание собственного кода, как описано выше, будет наиболее гибким и надежным решением.