WordPress со временем накапливает множество неактуальных данных: удалённые записи, ревизии, временные данные и прочий мусор, который замедляет работу сайта и нагружает базу данных. Особенно часто встречается проблема с несуществующими записями, которые остаются в базе из-за некорректных удалений, ошибок плагинов или некорректных миграций. В этой статье мы подробно разберём, как настроить автоматическую очистку базы данных WordPress от таких записей с помощью плагинов и собственных функций.
Почему важно удалять несуществующие записи из базы данных WordPress
В базе данных WordPress записи хранятся в таблице wp_posts, а связанная с ними метаинформация — в wp_postmeta. Иногда записи удаляются некорректно — например, при ошибках в плагинах или при неудачных миграциях, что приводит к появлению «мертвых» ссылок на записи, которые физически отсутствуют. Это не только увеличивает размер базы, но и создаёт ошибки в работе сайта, например, пустые страницы, неправильную работу виджетов, ошибок в REST API или избыточные запросы к базе.
Регулярная автоочистка таких данных помогает:
- Уменьшить размер базы данных;
- Ускорить выполнение SQL-запросов;
- Предотвратить ошибки «404» и некорректное отображение страниц;
- Поддерживать стабильную и быструю работу сайта.
Автоматизация очистки базы: обзор плагинов
Для решения задачи автоочистки существуют плагины, которые можно настроить на автоматический запуск по расписанию. Рассмотрим несколько популярных вариантов:
1. WP-Optimize
Очень популярный плагин для оптимизации базы данных. Он позволяет удалять ревизии, спам-комментарии, временные опции и мусорные данные. В настройках можно включить автоматическую очистку с выбором периодичности.
Преимущества:
- Простота использования;
- Поддержка автоматического запуска;
- Можно настроить очистку определённых типов данных.
2. Advanced Database Cleaner
Плагин с расширенными возможностями очистки, включая удаление неактуальных записей, ревизий, транзиентов, а также очистку таблиц от неиспользуемых данных. Есть возможность настроить расписание и выбрать категории для очистки.
3. Clearfy Pro
Если у вас есть лицензия Clearfy Pro, в ней есть модуль оптимизации базы данных с автоматической очисткой мусорных данных и оставшихся записей. Это удобное решение для комплексной оптимизации сайта.
Пример кода для автоматической очистки несуществующих записей в WordPress
Если вы хотите добавить собственный функционал очистки, можно реализовать задачу через wp_cron — встроенный планировщик задач WordPress. Ниже пример функции, которая ищет записи в wp_postmeta, у которых нет связанной записи в wp_posts, и удаляет такие метаданные.
function wpsetup_remove_orphan_postmeta() {
global $wpdb;
// Получаем ID записей, отсутствующих в wp_posts
$orphan_postmeta_ids = $wpdb->get_col(
"SELECT pm.meta_id FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE p.ID IS NULL"
);
if (!empty($orphan_postmeta_ids)) {
$ids_string = implode(',', array_map('intval', $orphan_postmeta_ids));
$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE meta_id IN ($ids_string)");
}
}
// Планируем ежедневную очистку
if (!wp_next_scheduled('wpsetup_daily_orphan_postmeta_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpsetup_daily_orphan_postmeta_cleanup');
}
// Хук на выполнение задачи
add_action('wpsetup_daily_orphan_postmeta_cleanup', 'wpsetup_remove_orphan_postmeta');
Этот код очищает таблицу метаданных от записей, которые уже не связаны с существующими постами. Аналогично можно написать функции для очистки других типов мусора.
Очистка ревизий и автосохранений: примеры и рекомендации
Ревизии записей и автосохранения часто занимают много места. Их количество можно контролировать и очищать.
Ограничение количества ревизий
Чтобы ограничить количество ревизий, добавьте в wp-config.php:
define('WP_POST_REVISIONS', 5); // Хранить максимум 5 ревизий на запись
Автоматическая очистка старых ревизий
Для удаления старых ревизий можно использовать следующий скрипт, который удалит все ревизии старше 30 дней:
function wpsetup_delete_old_revisions() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
$date_threshold
));
if (!empty($revisions)) {
foreach ($revisions as $revision_id) {
wp_delete_post($revision_id, true);
}
}
}
// Планируем еженедельную очистку ревизий
if (!wp_next_scheduled('wpsetup_weekly_revision_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpsetup_weekly_revision_cleanup');
}
add_action('wpsetup_weekly_revision_cleanup', 'wpsetup_delete_old_revisions');
Удаление транзиентов и временных опций
Транзиенты — это временные кешированные данные, которые могут накапливаться и занимать место. Их удаление помогает оптимизировать базу.
Для удаления устаревших транзиентов используйте следующий SQL-запрос (через PHPMyAdmin или плагин):
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%';
Или же можно автоматизировать через плагин WP-Optimize или Advanced Database Cleaner.
Практические советы по безопасности и резервному копированию перед очисткой
Перед запуском очистки базы обязательно сделайте полную резервную копию. Используйте проверенные плагины, например My Popup, чтобы уведомить администраторов или пользователей о технических работах.
Также советуем тестировать очистку на копии сайта, чтобы избежать случайного удаления важных данных.
Выводы и рекомендации
Автоматическая очистка базы данных WordPress от несуществующих записей и мусора — важная практика поддержки производительности и стабильности сайта. Используйте для этого специализированные плагины или создавайте собственные функции с wp_cron. Обязательно делайте резервные копии и тестируйте изменения.
Для комплексной оптимизации можно использовать Clearfy Pro – он объединяет автоматическую очистку базы, ускорение и улучшение безопасности.