Для многих сайтов на WordPress важна функция сбора подписчиков через форму подписки на email. Чаще всего для этого используют популярные плагины, такие как Mailchimp for WordPress, Newsletter или Contact Form 7 с дополнениями. Однако, если вы хотите минимизировать количество плагинов, сохранить высокую скорость загрузки и иметь полный контроль над процессом, можно сделать подписку на email самостоятельно, используя стандартные возможности WordPress и немного PHP-кода.
Почему стоит создавать форму подписки без плагинов
Плагины удобны, но добавляют нагрузку на сайт, могут конфликтовать с темами и другими расширениями, а также порой предлагают избыточный функционал. Создавая форму подписки вручную, вы получаете:
- легкий и быстрый код без лишних зависимостей;
- гибкость настройки под свои задачи;
- улучшенную безопасность за счет минимального количества кода;
- лучшее понимание работы системы подписки.
Далее мы рассмотрим, как реализовать простую форму подписки, обрабатывать данные и хранить их в базе данных WordPress.
Создаем HTML-форму подписки на email
Начнем с создания простой формы в любом месте темы — например, в footer.php или в пользовательском шаблоне. Вот базовый пример формы:
<form method="post" action="" id="wpreboot-subscribe-form">
<label for="wpreboot-email">Подпишитесь на рассылку:</label>
<input type="email" id="wpreboot-email" name="wpreboot_email" required placeholder="Ваш email" />
<input type="submit" name="wpreboot_subscribe_submit" value="Подписаться" />
</form>Форма отправляет данные методом POST на ту же страницу. Поле email обязательное и валидируется браузером.
Обработка данных формы в functions.php
Теперь нужно добавить обработчик, который будет ловить отправку формы, проверять email и сохранять его в базу данных. Рекомендуется использовать хук init для обработки POST-запроса.
function wpreboot_handle_email_subscription() {
if ( isset($_POST['wpreboot_subscribe_submit']) && !empty($_POST['wpreboot_email']) ) {
$email = sanitize_email($_POST['wpreboot_email']);
if ( !is_email($email) ) {
// Email невалидный
wp_die('Ошибка: введён некорректный email.');
}
global $wpdb;
$table_name = $wpdb->prefix . 'wpreboot_subscribers';
// Проверяем, существует ли таблица
if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name ) {
// Создаем таблицу, если её нет
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
email varchar(100) NOT NULL,
subscribed 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);
}
// Проверяем, нет ли уже такого email
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE email = %s", $email));
if ( $exists ) {
wp_die('Вы уже подписаны на рассылку.');
}
// Вставляем email в таблицу
$inserted = $wpdb->insert($table_name, [
'email' => $email
]);
if ( $inserted ) {
wp_redirect(add_query_arg('wpreboot_subscribe', 'success', wp_get_referer()));
exit;
} else {
wp_die('Ошибка при сохранении email. Попробуйте позже.');
}
}
}
add_action('init', 'wpreboot_handle_email_subscription');Обратите внимание, что мы создаём собственную таблицу wp_wpreboot_subscribers для хранения подписчиков. Это удобнее, чем использовать опции или мета, так как список может расти.
Вывод сообщений об успешной подписке или ошибках
Чтобы информировать пользователя, что подписка прошла успешно, можно в шаблоне добавить вывод сообщений, проверяя GET-параметры:
if ( isset($_GET['wpreboot_subscribe']) && $_GET['wpreboot_subscribe'] === 'success' ) {
echo '<p>Спасибо за подписку!</p>';
}Также рекомендуется добавить обработку ошибок в саму форму, но для простоты примера мы используем wp_die().
Отправка письма подтверждения подписчику
Чтобы повысить доверие пользователей, полезно отправлять письмо с подтверждением. В функцию обработки добавим отправку письма:
function wpreboot_handle_email_subscription() {
// ... предыдущий код ...
if ( $inserted ) {
// Отправляем письмо
$subject = 'Подтверждение подписки на рассылку';
$message = "Здравствуйте!\n\nВы успешно подписались на рассылку нашего сайта wpreboot.ru. Спасибо!";
wp_mail($email, $subject, $message);
wp_redirect(add_query_arg('wpreboot_subscribe', 'success', wp_get_referer()));
exit;
}
// ...
}Не забудьте настроить отправку почты на сервере, иначе письма могут не доходить.
Как подключить форму подписки в шаблоне темы
Для удобства можно вынести форму в отдельную функцию и выводить в нужном месте темы:
function wpreboot_show_subscription_form() {
?>
<form method="post" action="" id="wpreboot-subscribe-form">
<label for="wpreboot-email">Подпишитесь на рассылку:</label>
<input type="email" id="wpreboot-email" name="wpreboot_email" required placeholder="Ваш email" />
<input type="submit" name="wpreboot_subscribe_submit" value="Подписаться" />
</form>
<?php
}
// В нужном месте темы вызовите:
wpreboot_show_subscription_form();Дополнительные советы по безопасности и улучшению
1. Добавьте проверку nonce для защиты от CSRF-атак.
2. Реализуйте двойную подписку (double opt-in) с подтверждением через email.
3. Используйте AJAX для отправки формы без перезагрузки страницы для лучшего UX.
4. Подключите интеграцию с внешними сервисами рассылок, если нужна автоматизация.
5. Добавьте валидацию и фильтрацию данных на стороне сервера и клиента.
Заключение по созданию подписки на email без плагинов
Создание собственной подписки на email в WordPress — это отличный способ получить полный контроль над процессом и избежать излишних плагинов. Приведённый пример можно расширять, адаптировать под свои нужды и интегрировать с различными сервисами. Такой подход подходит для небольших проектов и тех, кто хочет изучить внутренние механизмы WordPress глубже.