В процессе работы с WordPress часто возникает необходимость очистить базу данных от удалённых записей (постов, страниц, пользовательских типов записей), которые по умолчанию сохраняются в корзине. Если корзина не очищается вручную, эти записи продолжают занимать место в базе данных и могут замедлять работу сайта. В этой статье подробно рассмотрим, как удалить все удалённые записи из базы данных WordPress автоматически и безопасно с помощью кода и плагинов.
Почему важно удалять записи из корзины в WordPress
Когда вы удаляете запись через админку WordPress, она не удаляется навсегда, а помещается в корзину (trash). Корзина — это временное хранилище удалённых материалов, откуда их можно восстановить или окончательно удалить. Если корзина не очищается регулярно, в базе данных накапливается большое количество записей со статусом trash.
Это приводит к нескольким проблемам:
- Увеличение размера базы данных, что негативно сказывается на скорости запросов.
- Дополнительная нагрузка на сервер при выполнении запросов, особенно если есть сложные выборки по постам.
- Визуальный мусор в админке, если корзина содержит много записей.
Поэтому важно периодически очищать корзину, особенно на сайтах с большим объёмом контента.
Как вручную очистить корзину через админку
Самый простой способ — зайти в раздел «Записи» или «Страницы», перейти в корзину и нажать кнопку «Очистить корзину». Однако для сайтов с большим количеством записей это неудобно и занимает много времени.
Кроме того, записи пользовательских типов (custom post types) могут иметь собственные корзины, которые нужно очищать отдельно.
Автоматическое удаление удалённых записей с помощью кода
Чтобы автоматически очищать корзину, можно добавить специальный код в файл functions.php вашей темы или в кастомный плагин. Ниже приведён пример функции wpupdate_clear_trash_posts(), которая удаляет все записи со статусом trash для всех типов постов.
function wpupdate_clear_trash_posts() {
global $wpdb;
// Получаем все типы записей, у которых есть поддержка статуса trash
$post_types = get_post_types(array('public' => true), 'names');
foreach ($post_types as $post_type) {
// Получаем ID записей с статусом trash для текущего типа
$trash_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_status = %s AND post_type = %s",
'trash', $post_type
));
if (!empty($trash_ids)) {
foreach ($trash_ids as $id) {
// Удаляем запись окончательно
wp_delete_post($id, true);
}
}
}
}
// Запуск функции при активации темы или плагина
// wpupdate_clear_trash_posts();
Этот скрипт перебирает все публичные типы записей, находит записи в корзине и удаляет их окончательно.
Как запускать удаление по расписанию
Чтобы не запускать функцию вручную, можно настроить WP-Cron, который будет регулярно вызывать очистку корзины. Добавьте следующий код в functions.php:
if (!wp_next_scheduled('wpupdate_cron_clear_trash')) {
wp_schedule_event(time(), 'daily', 'wpupdate_cron_clear_trash');
}
add_action('wpupdate_cron_clear_trash', 'wpupdate_clear_trash_posts');
Этот код создаст ежедневное событие, которое будет вызывать функцию очистки корзины. Вы можете изменить интервал на 'hourly', 'twicedaily' или свой кастомный.
Использование плагинов для автоматической очистки корзины
Если вы предпочитаете не использовать код, можно воспользоваться готовыми плагинами для управления корзиной и автоматической очистки. Рекомендуем обратить внимание на:
- Empty Trash — плагин, который автоматически очищает корзину по расписанию.
- Auto Delete Trash — простой плагин с настройками интервала очистки.
Только помните, что использование плагинов увеличивает нагрузку на сайт, поэтому для опытных пользователей предпочтительнее использовать кастомный код.
Ускорение удаления при большом количестве записей в корзине
Если на сайте очень много удалённых записей, удаление по одной может занимать много времени и даже привести к тайм-аутам сервера. В этом случае можно воспользоваться прямыми SQL-запросами для массового удаления.
function wpupdate_fast_clear_trash() {
global $wpdb;
// Удаляем все записи из корзины из таблицы posts
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_status = 'trash'");
// Удаляем связанные метаданные
$wpdb->query("DELETE pm FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON pm.post_id = p.ID WHERE p.ID IS NULL");
// Удаляем связанные термы (категории, метки)
$wpdb->query("DELETE tr FROM {$wpdb->term_relationships} tr LEFT JOIN {$wpdb->posts} p ON tr.object_id = p.ID WHERE p.ID IS NULL");
}
Этот код удалит записи с статусом trash и связанные с ними метаданные и таксономии. Однако будьте осторожны с прямыми запросами к базе — рекомендуется создавать резервную копию перед выполнением.
Резервное копирование перед удалением
Перед массовым удалением любых данных из базы обязательно создайте резервную копию сайта и базы данных. Это поможет восстановить данные в случае ошибки.
Для автоматизации резервного копирования можно использовать плагин Backup WordPress от WPShop, который позволяет планировать резервное копирование и хранить бэкапы в облаке.
Выводы по удалению записей из корзины
Регулярное удаление записей из корзины — важная задача для поддержания производительности WordPress-сайта. Вы можете:
- Очищать корзину вручную через админку.
- Добавить кастомный код для автоматической очистки всех типов записей.
- Настроить WP-Cron для периодического запуска очистки.
- Использовать готовые плагины для автоматизации.
- При большом объёме данных применять прямые SQL-запросы с осторожностью.
Используйте представленные примеры и рекомендации, чтобы держать базу данных WordPress в чистоте и обеспечить быструю работу сайта.