Подписка на рассылку — важный инструмент для вовлечения аудитории и поддержания связи с посетителями сайта. Многие владельцы WordPress-сайтов предпочитают использовать готовые плагины, такие как MailPoet, Newsletter или другие. Однако в некоторых случаях хочется сделать минималистичный и лёгкий функционал подписки своими силами, без лишних плагинов, чтобы избежать перегрузки сайта и повысить безопасность.
Почему стоит создавать подписку без плагинов
Использование плагинов — удобный способ, но он имеет свои недостатки:
- Плагины могут конфликтовать с другими компонентами сайта.
- Некоторые плагины нагружают сайт дополнительными запросами и скриптами.
- Ограниченная гибкость в настройке и стилизации.
- Иногда плагины требуют платных подписок за расширенные функции.
Создавая подписку самостоятельно, вы получаете полный контроль над процессом, минимальный код и возможность интегрировать рассылку с любыми сервисами по своему выбору.
Основные этапы создания подписки на рассылку
Разобьём задачу на несколько ключевых шагов:
- Создание формы подписки на фронтенде.
- Обработка данных формы и валидация.
- Сохранение подписчиков в базе данных.
- Отправка письма подтверждения (опционально).
- Интеграция с почтовым сервисом или экспорт подписчиков.
Создание формы подписки на фронтенде
Для начала создадим простой шорткод, который выведет форму подписки в любом месте сайта. Используем для этого хук add_shortcode. В файле functions.php вашей темы или в отдельном плагине добавьте следующий код:
function wpurok_subscribe_form_shortcode() {
ob_start();
?>
<form action="" method="post" id="wpurok-subscribe-form">
<label for="wpurok-email">Введите ваш email:</label><br>
<input type="email" name="wpurok_email" id="wpurok-email" required>
<button type="submit" name="wpurok_subscribe">Подписаться</button>
</form>
<?php
return ob_get_clean();
}
add_shortcode('wpurok_subscribe_form', 'wpurok_subscribe_form_shortcode');Теперь вы можете вставить шорткод [wpurok_subscribe_form] в любую страницу или запись, и форма появится.
Обработка данных формы и валидация
Чтобы форма работала, нужно обработать отправленные данные, проверить email и сохранить его. Добавим обработчик в functions.php:
function wpurok_handle_subscribe_form() {
if ( isset($_POST['wpurok_subscribe']) ) {
$email = sanitize_email($_POST['wpurok_email']);
if ( !is_email($email) ) {
echo '<div style="color:red;">Ошибка: введён некорректный email.</div>';
return;
}
global $wpdb;
$table = $wpdb->prefix . 'wpurok_subscribers';
// Проверяем, есть ли уже такой email
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table WHERE email = %s", $email));
if ( $exists ) {
echo '<div style="color:orange;">Вы уже подписаны на рассылку.</div>';
return;
}
// Вставляем email
$inserted = $wpdb->insert($table, [
'email' => $email,
'date_subscribed' => current_time('mysql')
]);
if ( $inserted ) {
echo '<div style="color:green;">Спасибо за подписку!</div>';
} else {
echo '<div style="color:red;">Ошибка при сохранении данных.</div>';
}
}
}
add_action('wp', 'wpurok_handle_subscribe_form');Данный код обрабатывает POST-запрос, проверяет корректность email и сохраняет его в отдельную таблицу базы данных.
Создание таблицы для подписчиков
Чтобы сохранить подписчиков, нам нужна таблица в базе данных. Добавьте функцию для создания таблицы при активации темы или плагина:
function wpurok_create_subscribers_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpurok_subscribers';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
date_subscribed datetime DEFAULT '0000-00-00 00:00:00' 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__, 'wpurok_create_subscribers_table' );Если вы добавляете код в functions.php, временно вызовите wpurok_create_subscribers_table() вручную для создания таблицы.
Отправка письма подтверждения подписки
Чтобы улучшить взаимодействие с пользователем и избежать фальшивых подписок, полезно отправлять письмо с подтверждением. Для этого добавим функцию отправки email с помощью встроенной wp_mail():
function wpurok_send_confirmation_email($email) {
$subject = 'Подтверждение подписки на рассылку';
$message = "Здравствуйте!\nСпасибо за подписку на нашу рассылку.
Если вы не подписывались, просто проигнорируйте это письмо.";
$headers = ['Content-Type: text/plain; charset=UTF-8'];
wp_mail($email, $subject, $message, $headers);
}Вызовите эту функцию после успешного добавления email в базу:
if ( $inserted ) {
wpurok_send_confirmation_email($email);
echo '<div style="color:green;">Спасибо за подписку! Проверьте вашу почту для подтверждения.</div>';
} else {
echo '<div style="color:red;">Ошибка при сохранении данных.</div>';
}Интеграция с почтовыми сервисами
Для массовой рассылки и автоматизации рекомендуется выгружать подписчиков из базы и импортировать их в сервисы MailChimp, SendPulse, UniSender и другие. Ваша таблица wpurok_subscribers содержит все необходимые данные.
Чтобы выгрузить подписчиков, создайте простой экспорт в CSV:
function wpurok_export_subscribers_csv() {
if ( !current_user_can('manage_options') ) {
return;
}
global $wpdb;
$table = $wpdb->prefix . 'wpurok_subscribers';
$subscribers = $wpdb->get_results("SELECT email,date_subscribed FROM $table", ARRAY_A);
if ( empty($subscribers) ) {
echo '<p>Подписчиков нет.</p>';
return;
}
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="subscribers.csv"');
$output = fopen('php://output', 'w');
fputcsv($output, ['Email', 'Дата подписки']);
foreach ($subscribers as $subscriber) {
fputcsv($output, $subscriber);
}
fclose($output);
exit;
}
// Вы можете вызвать эту функцию через кастомный админ-пункт или вручную
Дополнительные советы по безопасности и улучшению
Используйте nonce для защиты формы
Чтобы защитить форму от CSRF-атак, добавьте nonce:
function wpurok_subscribe_form_shortcode() {
ob_start();
?>
<form action="" method="post" id="wpurok-subscribe-form">
<?php wp_nonce_field('wpurok_subscribe_action', 'wpurok_subscribe_nonce'); ?>
<label for="wpurok-email">Введите ваш email:</label><br>
<input type="email" name="wpurok_email" id="wpurok-email" required>
<button type="submit" name="wpurok_subscribe">Подписаться</button>
</form>
<?php
return ob_get_clean();
}
function wpurok_handle_subscribe_form() {
if ( isset($_POST['wpurok_subscribe']) ) {
if ( !isset($_POST['wpurok_subscribe_nonce']) || !wp_verify_nonce($_POST['wpurok_subscribe_nonce'], 'wpurok_subscribe_action') ) {
echo '<div style="color:red;">Ошибка безопасности. Попробуйте снова.</div>';
return;
}
// Остальной код обработки формы
}
}
add_action('wp', 'wpurok_handle_subscribe_form');Добавьте AJAX-обработку для удобства
Чтобы улучшить UX, можно реализовать отправку формы без перезагрузки страницы через AJAX. Для этого подключите скрипт и создайте обработчик в PHP. Это более сложный этап, но значительно повысит интерактивность.
Используйте WP Cron для регулярных рассылок
Если хотите автоматизировать отправку писем подписчикам, изучите WP Cron — встроенный планировщик задач. С его помощью можно запускать рассылки по расписанию.
Итоги и полезные ссылки
Создание подписки на рассылку без плагинов — несложная задача, которая позволяет получить лёгкий и гибкий функционал. Важно обеспечить безопасность, корректную валидацию и хранение данных. При необходимости подключайте почтовые сервисы для массовой рассылки.
Если хотите расширить функционал, обратите внимание на плагин WPRemark — он поможет управлять комментариями и подписками с расширенными возможностями.