Автоматическое удаление старых голосований в опросах WordPress: практическое руководство

Диагностика проблемы с накоплением голосов в опросах WordPress

При длительной работе сайта с опросами WordPress база данных голосов постепенно растёт. Это может замедлить работу сайта и увеличить нагрузку на сервер. Часто пользователи не знают, как безопасно и регулярно очищать старые голосования по времени, не потеряв актуальные данные.

Основные признаки проблемы:

  • Замедленная загрузка страниц с опросами
  • Увеличение размера таблиц базы данных, отвечающих за опросы
  • Отсутствие механизма очистки старых голосов в используемом плагине

Как определить, что конкретно нужно удалять

Для начала нужно понять, где хранятся данные голосований. Обычно плагины для опросов используют кастомные таблицы в базе данных или метаданные записей. Для примера возьмём плагин WP-Polls — один из популярных.

В базе данных WP-Polls голоса хранятся в таблице wp_polls_votes, где есть поля poll_id, vote_date и vote_ip.

Проверка количества и возраста голосов

SELECT COUNT(*) AS total_votes, MIN(vote_date) AS oldest_vote, MAX(vote_date) AS newest_vote FROM wp_polls_votes;

Эта команда покажет общее количество голосов и диапазон дат. Если старые голоса не нужны, их можно удалить.

Пошаговое решение: автоматизация удаления старых голосов

1. Создание функции удаления в functions.php

Добавим функцию, которая удаляет голоса старше заданного количества дней, например 180 дней (6 месяцев):

function wppolls_delete_old_votes() {
    global $wpdb;
    $table = $wpdb->prefix . 'polls_votes';
    $days = 180;
    $cutoff_date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$table} WHERE vote_date < %s",
            $cutoff_date
        )
    );

    if ( false !== $deleted ) {
        error_log("WP-Polls: Deleted {$deleted} old votes older than {$cutoff_date}");
    }
}

2. Запуск удаления по расписанию с помощью WP-Cron

Добавим событие, которое будет запускать очистку раз в неделю:

function wppolls_schedule_old_votes_cleanup() {
    if ( ! wp_next_scheduled( 'wppolls_weekly_cleanup' ) ) {
        wp_schedule_event( time(), 'weekly', 'wppolls_weekly_cleanup' );
    }
}
add_action( 'wp', 'wppolls_schedule_old_votes_cleanup' );

add_action( 'wppolls_weekly_cleanup', 'wppolls_delete_old_votes' );

3. Очистка расписания при отключении темы или плагина

function wppolls_clear_cleanup_schedule() {
    $timestamp = wp_next_scheduled( 'wppolls_weekly_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wppolls_weekly_cleanup' );
    }
}
register_deactivation_hook( __FILE__, 'wppolls_clear_cleanup_schedule' );

Проверка результата после внедрения

  • Запустите функцию вручную через wppolls_delete_old_votes() в консоли WP-CLI или временно вызовите в шаблоне.
  • Проверьте логи ошибок PHP, в них появится сообщение с количеством удалённых голосов.
  • Снова выполните SQL-запрос для проверки количества голосов и убедитесь, что старые были удалены.
  • Отследите нагрузку на базу данных и время загрузки страниц с опросами — они должны улучшиться.

Частые ошибки и как их исправить

  • Не работает автоматический запуск WP-Cron: Проверьте, что на сайте есть активный посетитель, так как WP-Cron запускается только при обращении к сайту. Для надёжности настройте системный cronjob на сервере с вызовом wp cron event run --due-now.
  • Неправильное имя таблицы: Убедитесь, что в коде используется правильный префикс $wpdb->prefix и имя таблицы соответствует вашей базе.
  • Удаляются не те данные: Проверьте условие в запросе удаления, чтобы не затронуть нужные голоса.
  • Ошибка при деактивации: Убедитесь, что register_deactivation_hook подключён в файле плагина, а не темы, или используйте альтернативный способ очистки расписаний.

Практические советы по безопасности и производительности

  • Всегда делайте резервную копию базы перед автоматической очисткой.
  • Используйте ограничение по времени удаления, чтобы не перегружать базу за один запрос (например, удалять по частям).
  • Добавляйте логирование действий для мониторинга работы скрипта.
  • Если опросов много, можно расширить функцию, чтобы удалять голоса выборочно по опросам.
  • Проверяйте права пользователя, если функция вызывается из админки, чтобы избежать несанкционированного удаления.

Сравнение решений удаления старых голосов в опросах WordPress

МетодПлюсыМинусыРекомендуется для
Ручное удаление через SQLПростота, полный контрольРиск ошибок, требует знаний SQLАдминистраторы с опытом
Автоматизация с WP-Cron и PHPАвтоматический процесс, можно планироватьЗависит от WP-Cron, сложнее настроитьРазработчики и продвинутые пользователи
Плагины очистки базыУдобный интерфейс, универсальностьМогут влиять на производительность, не всегда подходят под конкретный плагин опросовНовички, универсальные сайты
Как добавить опросы в блок Gutenberg WordPress
09.03.2026
Как создать оценку настроения в опросе WordPress с примерами и кодом
07.02.2026
Автоматическое удаление старых голосов в опросах WordPress: пошаговое руководство
09.06.2026
Как создать выставку результатов опроса в WordPress с фильтрацией и сортировкой
30.03.2026
Как добавить вывод опросов во всплывающее окно в WordPress
26.05.2026