Как добавить подписку на опросы WordPress с помощью кода

Задача: уведомлять пользователей о новых опросах по email

В стандартных плагинах для опросов WordPress часто отсутствует функция подписки на новые опросы. Решение — реализовать подписку вручную, чтобы пользователи могли получать рассылку при публикации новых опросов.

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

Проверяем, есть ли в используемом плагине для опросов (например, WP-Polls, YOP Polls) возможность подписки. Чаще всего её нет. При этом стандартные подписки WordPress (через блог) не привязаны к опросам.

Если пользователь хочет подписаться именно на опросы, понадобится собственное решение с хранением email и триггером рассылки при публикации опроса.

Пошаговое решение

1. Создаем таблицу для подписчиков

Добавим таблицу в базу данных при активации темы или плагина:

function wppolls_create_subscribers_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'poll_subscribers';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
      id mediumint(9) NOT NULL AUTO_INCREMENT,
      email varchar(100) NOT NULL,
      subscribed_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
      PRIMARY KEY  (id),
      UNIQUE KEY email (email)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'wppolls_create_subscribers_table');

2. Форма подписки на сайте

Добавим шорткод для вывода формы подписки:

function wppolls_subscribe_form() {
    if (isset($_POST['wppolls_subscribe_email'])) {
        wppolls_handle_subscription($_POST['wppolls_subscribe_email']);
    }
    return '<form method="post">
            <input type="email" name="wppolls_subscribe_email" placeholder="Ваш email" required>
            <input type="submit" value="Подписаться">
            </form>';
}
add_shortcode('wppolls_subscribe', 'wppolls_subscribe_form');

3. Обработка подписки

function wppolls_handle_subscription($email) {
    global $wpdb;
    $table = $wpdb->prefix . 'poll_subscribers';
    $email = sanitize_email($email);
    if (!is_email($email)) {
        echo '<p style="color:red;">Некорректный email.</p>';
        return;
    }
    $exists = $wpdb->get_var($wpdb->prepare("SELECT id FROM $table WHERE email = %s", $email));
    if ($exists) {
        echo '<p>Вы уже подписаны.</p>';
        return;
    }
    $wpdb->insert($table, ['email' => $email]);
    echo '<p style="color:green;">Подписка оформлена.</p>';
}

4. Отправка уведомлений при публикации нового опроса

Подключаемся к хуку публикации поста с типом опроса (например, 'poll') и рассылаем email:

function wppolls_notify_subscribers($post_ID, $post) {
    if ($post->post_type !== 'poll') return;
    global $wpdb;
    $table = $wpdb->prefix . 'poll_subscribers';
    $subscribers = $wpdb->get_col("SELECT email FROM $table");
    if (empty($subscribers)) return;

    $subject = 'Новый опрос на сайте';
    $message = 'Появился новый опрос: ' . get_permalink($post_ID) . '\nПройдите опрос и поделитесь мнением.';
    foreach ($subscribers as $email) {
        wp_mail($email, $subject, $message);
    }
}
add_action('publish_poll', 'wppolls_notify_subscribers', 10, 2);

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

  • Добавьте на страницу шорткод [wppolls_subscribe], заполните форму email и убедитесь, что появляется сообщение об успешной подписке или ошибке.
  • Опубликуйте новый опрос (пост типа 'poll') и проверьте, что на указанные email приходят уведомления.
  • Проверьте таблицу wp_poll_subscribers через phpMyAdmin — должны сохраняться новые адреса подписчиков.

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

  • Почта не отправляется: Проверьте настройки SMTP на сайте, используйте плагин WP Mail SMTP.
  • Повторная подписка не блокируется: Проверьте уникальный индекс на email в базе и корректность запроса проверки существования.
  • Хук публикации не срабатывает: Убедитесь, что тип поста опроса действительно poll или замените на свой.
  • Форма не отображается: Проверьте, что шорткод добавлен правильно и не конфликтует с другими плагинами.

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

  • При сохранении email используйте sanitize_email() и проверку is_email().
  • Для рассылки большого количества писем используйте отложенную очередь (wp_cron) и SMTP-серверы, чтобы не попасть в спам.
  • Ограничьте частоту подписок с одного IP, чтобы избежать спама.
  • Добавьте капчу (например, Google reCAPTCHA) в форму подписки для защиты от ботов.
  • Храните email в отдельной таблице, чтобы не нагружать основную базу данных WordPress.

Сравнение вариантов реализации подписки на опросы

МетодПлюсыМинусы
Плагин подписки (MailPoet, Newsletter)Готовые решения, удобный интерфейсМогут быть избыточными, не специализированы под опросы
Кодовая реализация (как в статье)Точный контроль, легкая кастомизацияНужно писать и поддерживать код, требует знаний PHP
Использование внешних сервисов (Mailchimp, SendPulse)Мощные маркетинговые инструментыСложнее интегрировать с опросами WordPress, зависит от сторонних сервисов
Как удалить опросы и голоса в WordPress за один шаг
15.05.2026
Как автоматизировать удалённую модерацию опросов в WordPress
06.03.2026
Как создать опрос с ветвлением в WordPress
21.02.2026
Как удалить голосование из данных опросов в WordPress без потери данных
20.05.2026
Как добавить опросы в WordPress через REST API с примерами кода
13.03.2026