Подписка на новости — важный элемент любого сайта, который помогает удерживать аудиторию и регулярно информировать пользователей о новых материалах, акциях и событиях. В этой статье разберём, как самостоятельно создать простой и эффективный функционал подписки на новости в WordPress без использования громоздких плагинов, а также рассмотрим примеры интеграции с внешними сервисами и отправки писем через SMTP.
Почему стоит создавать собственный функционал подписки на новости в WordPress
Несмотря на большое количество готовых плагинов для подписки (MailChimp, Newsletter, MailPoet и др.), иногда хочется иметь полный контроль над процессом, избежать зависимости от сторонних сервисов и минимизировать нагрузку на сайт. Такой подход особенно полезен при узких задачах или уникальных требованиях.
Собственный функционал позволит:
- Управлять списком подписчиков в базе данных WordPress;
- Настраивать дизайн формы подписки под стиль сайта;
- Гибко настраивать отправку писем (например, через SMTP);
- Интегрировать подписку с другими функциями сайта, например, с заказами или пользовательскими данными.
Далее мы пошагово разберём, как реализовать такую систему.
Создание кастомного плагина для подписки на новости в WordPress
Начнём с создания простого плагина, который добавит форму подписки и сохранит email адреса в отдельной таблице базы данных.
Шаг 1: Создаём структуру плагина
Создайте папку wporders-newsletter в директории wp-content/plugins. В ней создайте файл wporders-newsletter.php с содержимым:
<?php
/**
* Plugin Name: WPOrders Newsletter
* Description: Простая подписка на новости с сохранением адресов в базе.
* Version: 1.0
* Author: WPOrders
*/
// Защита от прямого доступа
if (!defined('ABSPATH')) {
exit;
}
// Функция активации плагина — создаёт таблицу подписчиков
function wporders_newsletter_activate() {
global $wpdb;
$table_name = $wpdb->prefix . 'wporders_subscribers';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $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__, 'wporders_newsletter_activate');
Этот код создаст таблицу для хранения email адресов подписчиков при активации плагина.
Шаг 2: Добавляем форму подписки через шорткод
Чтобы встраивать форму подписки в записи, страницы и виджеты, реализуем шорткод.
// Функция вывода формы подписки
function wporders_newsletter_form() {
$html = '<form method="post" action="">'
. '<input type="email" name="wporders_email" placeholder="Введите ваш email" required>'
. '<input type="submit" name="wporders_subscribe" value="Подписаться">'
. '</form>';
// Обработка отправки формы
if (isset($_POST['wporders_subscribe'])) {
$email = sanitize_email($_POST['wporders_email']);
if (is_email($email)) {
global $wpdb;
$table = $wpdb->prefix . 'wporders_subscribers';
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table WHERE email = %s", $email));
if ($exists) {
$html .= '<p>Этот email уже подписан.</p>';
} else {
$wpdb->insert($table, ['email' => $email]);
$html .= '<p>Спасибо за подписку!</p>';
}
} else {
$html .= '<p>Введите корректный email.</p>';
}
}
return $html;
}
add_shortcode('wporders_newsletter', 'wporders_newsletter_form');
Теперь вы можете добавить форму в любом месте сайта, вставив шорткод [wporders_newsletter].
Шаг 3: Отправка приветственного письма подписчику
Чтобы улучшить пользовательский опыт, после подписки отправим письмо с подтверждением.
// Отправка письма после добавления подписчика
function wporders_newsletter_send_email($email) {
$subject = 'Спасибо за подписку на новости!';
$message = 'Вы успешно подписались на новости нашего сайта. Ожидайте интересные обновления.';
$headers = ['Content-Type: text/html; charset=UTF-8'];
wp_mail($email, $subject, $message, $headers);
}
// Вызовем функцию после вставки email в базу
if (isset($_POST['wporders_subscribe'])) {
$email = sanitize_email($_POST['wporders_email']);
if (is_email($email)) {
global $wpdb;
$table = $wpdb->prefix . 'wporders_subscribers';
$exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table WHERE email = %s", $email));
if (!$exists) {
$wpdb->insert($table, ['email' => $email]);
wporders_newsletter_send_email($email);
echo '<p>Спасибо за подписку!</p>';
} else {
echo '<p>Этот email уже подписан.</p>';
}
} else {
echo '<p>Введите корректный email.</p>';
}
}
Обратите внимание, что для корректной отправки писем желательно настроить SMTP сервер, например, через плагин WP Mail SMTP.
Интеграция с внешними почтовыми сервисами
Если вы хотите расширить функционал и добавить массовую рассылку, стоит подключить популярные сервисы, например MailChimp или Sendinblue.
Чаще всего это делается через их API. Для примера рассмотрим интеграцию с MailChimp с помощью PHP и wp_remote_post.
function wporders_newsletter_subscribe_mailchimp($email) {
$api_key = 'ВАШ_API_КЛЮЧ';
$list_id = 'ID_СПИСКА';
$data_center = substr($api_key,strpos($api_key,'-')+1);
$url = 'https://' . $data_center . '.api.mailchimp.com/3.0/lists/' . $list_id . '/members/';
$json = json_encode([
'email_address' => $email,
'status' => 'subscribed'
]);
$response = wp_remote_post($url, [
'method' => 'POST',
'headers' => [
'Authorization' => 'apikey ' . $api_key,
'Content-Type' => 'application/json'
],
'body' => $json
]);
if (is_wp_error($response)) {
return false;
}
$code = wp_remote_retrieve_response_code($response);
return $code == 200 || $code == 204;
}
<Вызовите эту функцию после валидации и сохранения email, чтобы автоматически добавлять подписчика в MailChimp.
Обработка отписки и GDPR
Важно предусмотреть возможность легкой отписки пользователей и соответствие требованиям законодательства о защите данных (например, GDPR).
Для этого:
- Добавьте в письма ссылку для отписки, которая будет вести на страницу с формой удаления email из базы;
- Реализуйте отдельный шорткод и обработчик, который удаляет email из таблицы подписчиков;
- Сохраняйте только необходимые данные и не передавайте их третьим лицам без согласия.
Пример обработки отписки:
// Шорткод для отписки
function wporders_newsletter_unsubscribe_form() {
$html = '<form method="post" action="">'
. '<input type="email" name="wporders_unsub_email" placeholder="Введите ваш email" required>'
. '<input type="submit" name="wporders_unsubscribe" value="Отписаться">'
. '</form>';
if (isset($_POST['wporders_unsubscribe'])) {
$email = sanitize_email($_POST['wporders_unsub_email']);
if (is_email($email)) {
global $wpdb;
$table = $wpdb->prefix . 'wporders_subscribers';
$deleted = $wpdb->delete($table, ['email' => $email]);
if ($deleted) {
$html .= '<p>Вы успешно отписаны.</p>';
} else {
$html .= '<p>Этот email не найден в списке подписчиков.</p>';
}
} else {
$html .= '<p>Введите корректный email.</p>';
}
}
return $html;
}
add_shortcode('wporders_unsubscribe', 'wporders_newsletter_unsubscribe_form');
Заключение и рекомендации по развитию функционала подписки
Создание собственного функционала подписки — отличный способ получить гибкость, минимизировать зависимости и углубиться в разработку под WordPress. В дальнейшем можно добавить:
- Двойную подписку (double opt-in) с подтверждением по email;
- Интеграцию с WooCommerce для подписки покупателей;
- Расширенную статистику и отчёты;
- Использование AJAX для отправки формы без перезагрузки страницы;
- Шаблоны писем и персонализацию.
Все эти улучшения помогут создать удобную и надёжную систему взаимодействия с аудиторией вашего сайта, повысить лояльность и увеличить вовлечённость.