Задача: уведомлять пользователей о новых опросах по 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, зависит от сторонних сервисов |