Диагностика проблемы: зачем удалять старые голоса
Накопление большого количества голосов в опросах WordPress может привести к замедлению загрузки страниц и увеличению размера базы данных. Особенно это заметно при использовании плагинов, которые не оптимизируют хранение результатов. Удаление устаревших голосов помогает поддерживать производительность сайта и уменьшить нагрузку на сервер.
Пошаговое решение: как настроить автоматическое удаление голосов
1. Определение критерия устаревших голосов
Для начала необходимо определить, какие голоса считать старыми. Обычно выбирают порог в днях, например, удалить все голоса старше 180 дней.
2. Создание кастомной функции удаления
Пример кода для удаления голосов старше 180 дней из таблицы wp_poll_votes. Предполагается, что база данных содержит дату голосования в поле vote_date формата DATETIME:
function wppolls_delete_old_votes() {
global $wpdb;
$days = 180; // порог в днях
$table = $wpdb->prefix . 'poll_votes';
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM {$table} WHERE vote_date < %s",
$date_threshold
)
);
if ($deleted !== false) {
error_log("[WPPolls] Deleted {$deleted} old votes older than {$days} days.");
}
}3. Настройка Cron-задачи для регулярного запуска удаления
Добавьте в functions.php регистрацию собственного Cron и его запуск:
if (!wp_next_scheduled('wppolls_delete_old_votes_cron')) {
wp_schedule_event(time(), 'daily', 'wppolls_delete_old_votes_cron');
}
add_action('wppolls_delete_old_votes_cron', 'wppolls_delete_old_votes');Этот код запустит очистку голосов раз в сутки.
Проверка результата после внедрения
- Просмотрите логи сайта (например, error_log), чтобы увидеть записи о количестве удалённых голосов.
- Проверьте размер таблицы
wp_poll_votesв базе данных до и после внедрения. - Убедитесь, что свежие голоса не удаляются — сделайте тестовое голосование и проверьте, что оно сохранено.
Частые ошибки и как исправить
- Неправильное имя таблицы: В разных плагинах и версиях может использоваться своя таблица для голосов. Проверьте точное имя в базе данных или используйте
$wpdb->prefixдля корректной подстановки. - Отсутствие поля с датой голосования: Если плагин не хранит дату голосования, автоматизировать удаление по времени нельзя без доработок.
- Дублирование Cron-задач: Если не проверить наличие задачи перед регистрацией, Cron может запуститься несколько раз в день. Используйте
wp_next_scheduled. - Проблемы с правами базы данных: Убедитесь, что пользователь БД имеет права на удаление записей.
Практические советы по безопасности и производительности
- Перед внедрением сделайте резервную копию базы данных.
- Запускайте удаление в ночное время, чтобы снизить нагрузку на сайт.
- Добавьте логирование с ограничением объёма, чтобы не переполнять логи.
- Если таблица очень большая, рассмотрите удаление по частям с помощью
LIMITи повторного запуска задачи. - Для плагинов с нестандартными структурами данных изучите их API или обратитесь к документации перед удалением.
Сравнение подходов к удалению старых голосов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через phpMyAdmin | Быстро, без кода | Риск ошибок, не автоматизировано |
| Кастомный Cron с SQL-запросом | Автоматизация, гибкость | Требует навыков, риск неправильного удаления |
| Использование плагинов оптимизации | Упрощает работу, дополнительные функции безопасности | Может не поддерживать специфические таблицы опросов |