В процессе работы с WordPress часто возникает необходимость автоматически удалять устаревшие записи, которые помечены определёнными мета-ключами. Это полезно для поддержания базы данных в актуальном состоянии и уменьшения её размера, что положительно сказывается на производительности сайта. В этой статье мы подробно рассмотрим, как реализовать автоматическое удаление старых записей по метаключам с помощью встроенных возможностей WordPress, а также с помощью плагинов и кастомного кода.
Почему важно удалять старые записи по метаключам
Если на сайте периодически создаются записи с определёнными метаданными, например, временные задачи, устаревшие события или результаты тестов, они со временем накапливаются. Это ведёт к росту размера базы данных, замедлению запросов и ухудшению работы сайта. Автоматическое удаление таких записей позволяет сэкономить ресурсы и не тратить время на ручную очистку.
В частности, если вы используете специализированные плагины для управления задачами или событиями, например, WPTasks, наличие большого числа неактуальных задач может замедлять работу и усложнять интерфейс.
Способы автоматического удаления записей по метаключам
Удаление через WP-Cron и кастомный PHP код
Самый гибкий способ — написать функцию, которая будет искать записи с нужным мета-ключом и датой создания/обновления, и удалять их. Далее эту функцию можно запускать регулярно через WP-Cron.
Пример функции для удаления записей с мета-ключом _wptasks_due_date, у которых дата меньше текущей:
function wptasks_ru_delete_old_tasks() {
$today = date('Y-m-d');
$args = [
'post_type' => 'task',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_wptasks_due_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
],
],
'fields' => 'ids',
];
$old_tasks = get_posts($args);
if (!empty($old_tasks)) {
foreach ($old_tasks as $task_id) {
wp_delete_post($task_id, true); // true — удаление без корзины
}
}
}
// Регистрируем событие, если оно ещё не запущено
if (!wp_next_scheduled('wptasks_ru_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptasks_ru_daily_cleanup');
}
// Хук на выполнение очистки
add_action('wptasks_ru_daily_cleanup', 'wptasks_ru_delete_old_tasks');
Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. Он будет ежедневно удалять все задачи с просроченной датой.
Использование плагинов для автоматизации очистки
Если вы не хотите писать код, можно использовать плагины для автоматического удаления записей, например:
- WP Bulk Delete — позволяет создавать правила для массового удаления записей по мета-ключам, датам, категориям и другим параметрам.
- Advanced Database Cleaner — помогает удалять устаревшие записи и оптимизировать базу данных.
Настроив WP Bulk Delete для удаление записей с нужным мета-ключом и условием даты, вы получите удобный интерфейс и гибкие возможности без программирования.
Как избежать ошибок и сохранить данные
При автоматическом удалении важно удостовериться, что вы не удаляете нужные данные. Рекомендуется:
- Делать резервные копии базы данных перед настройкой очистки.
- Проверять условия выборки постов — использовать
posts_per_pageи вывод ID, чтобы убедиться в правильности. - Если нужно, вместо
wp_delete_post($id, true)использоватьwp_trash_post($id)для перемещения в корзину. - Логировать удалённые записи для отладки и контроля.
Пример расширения функции с логированием и безопасным удалением
Добавим логирование в файл wp-content/uploads/deleted_tasks.log и используем корзину:
function wptasks_ru_delete_old_tasks_with_log() {
$today = date('Y-m-d');
$args = [
'post_type' => 'task',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_wptasks_due_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
],
],
'fields' => 'ids',
];
$old_tasks = get_posts($args);
$log_file = WP_CONTENT_DIR . '/uploads/deleted_tasks.log';
$date_time = date('Y-m-d H:i:s');
if (!empty($old_tasks)) {
foreach ($old_tasks as $task_id) {
if (wp_trash_post($task_id)) {
file_put_contents($log_file, "[$date_time] Task ID $task_id moved to trash\n", FILE_APPEND);
} else {
file_put_contents($log_file, "[$date_time] Failed to trash Task ID $task_id\n", FILE_APPEND);
}
}
}
}
// Регистрация и запуск события аналогично предыдущему примеру
if (!wp_next_scheduled('wptasks_ru_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptasks_ru_daily_cleanup');
}
add_action('wptasks_ru_daily_cleanup', 'wptasks_ru_delete_old_tasks_with_log');
Заключение
Автоматическое удаление старых записей по метаключам — важная задача для поддержания чистоты и производительности сайта на WordPress. Используя WP-Cron и кастомные функции, вы получаете гибкий и мощный инструмент, который можно адаптировать под любые нужды. Если хотите упростить настройку — используйте специализированные плагины, такие как WP Bulk Delete.
Для пользователей WPTasks и подобных плагинов правильная настройка автоматической очистки позволит избежать накопления «мусорных» задач и сохранить базу данных в оптимальном состоянии.
Полезные ссылки: