Как сделать подписку на сайте
Опытные специалисты по повышению посещаемости сайта знают, что подписка на обновления сайта - это очень хороший инструмент для увеличения постоянной аудитории сайта. Однако, не все знают, как такое реализовать. Поэтому в этой статье я расскажу, как сделать подписку на сайте.
Для того, чтобы сделать подписку на обновления сайта, надо воспользоваться одним из двух вариантов:
- Воспользоваться каким-нибудь сторонним сервисом. Могу порекомендовать feedburner.google.com. Это наиболее простой способ, но, правда, Вы будете зависеть от стороннего сервиса, вдобавок, в каждое письмо будут вставляться чужие ссылки, что не очень хорошо.
- Сделать собственную подписку на сайте. Этот способ более трудоёмкий, но зато абсолютно всё под Вашим контролем. Что отправлять, как отправлять, куда отправлять - всё решаете Вы. Вот об этом способе я и расскажу ниже немного подробнее.
Сразу отмечу, что первый способ значительно популярнее, поскольку он простой и надёжный. А второй будет достаточно тяжёлым в реализации и достаточно крупным, поэтому кратко буду описывать основные проблемы и алгоритм работы.
Самая главная проблема, который возникнет - это ограничение хостингов на количество отсылаемых писем. Вывод из этого простой: нельзя отправлять сразу всем подписчикам письма. И нужно каждую рассылку разбивать на несколько этапов. Например, отправлять каждые 10 минут по 10 писем.
Теперь давайте создадим таблицу подписчиков со следующими полями:
- id - уникальный идентификатор подписчика.
- name - имя подписчика.
Безусловно, это почти самый минимум (можно и без имени). В реальности же можно добавить ещё дату подписки, список разделов, на которые подписывается пользователь и прочее.
И теперь необходимо создать таблицу, которая позволит решить проблему с ограничением количества отправляемых писем:
- id - уникальный идентификатор последней рассылки.
- post_id - уникальный идентификатор статьи (или поста) на сайте, о котором рассылается уведомление.
- subscriber_id - уникальный идентификатор последнего подписчика, которому был отправлен выпуск.
- end - закончена рассылка или нет.
Думаю, что с формой подписки и её обраткой Вы справитесь (если нет, то используйте 1-й вариант подписки на обновления, либо изучайте основы PHP).
А вот с самой рассылкой чуть посложнее, поэтому напишу шаблон кода скрипта, который Вам необходимо будет поставить на автозапуск в Cron (например, запуск через каждые 10 минут).
<?php
$db = new mysqli("localhost", "root", "", "mydb"); // Подключаемся к базе данных
$result_set = $db->query("SELECT * FROM `subscribe` WHERE `end`='0' LIMIT 1"); // Получаем 1 неоконченную рассылку
$last_subscribe = $result_set->fetch_assoc(); // Преобразуем result_set в массив
/* Если все рассылки уже отправлены, то смотрим: нет ли новых статей на сайте */
if ($result_set->num_rows == 0) {
$result_set = $db->query("SELECT * FROM `posts` WHERE `id`>'".$last_subscribe["post_id"]."' LIMIT 1");
if ($result_set->num_rows == 0) exit; // Если ничего нового нет, то просто выходим
$post = $result_set->fetch_assoc(); // Получаем данные о новой статье
$db->query("INSERT INTO `subscribe` (`post_id`, `subscriber_id`, `end`) VALUES ('".$post["id"]."', '0', '0')"); // Добавляем в очередь новую рассылку
exit; // Выходим, а через 10 минут данный скрипт будет снова запущен, и уже пойдёт непосредственно рассылка писем
}
$last_id = $last_subscribe["subscriber_id"]; // Получаем id подписчика, которому было отправлено письмо в последний раз
$result_set = $db->query("SELECT * FROM `subscribers` WHERE `id`>$last_id");
$count = 0;
while (($row = $result_set->fetch_assoc()) !== false) {
$subscriber_id = $row["id"];
/* Здесь код для отправки письма через функцию mail() */
$count++;
if ($count == 10) {
$db->query("UPDATE `subscribe` SET `subscriber_id`='$subscriber_id' WHERE `id`='".$last_subscribe["id"]."'"); // Обновляем информацию о последнем подписчике, которому было отправлено письмо
break; // Выходим после 10-ти отправлений
}
}
if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`=''".$last_subscribe["id"]."''"); // Всё отправлено
?>
Данный скрипт достаточно сложный, но реализует он очень простую вещь, которую кратко можно записать так: отправляем письма не более 10-ти подписчикам, а если всё разослано, то при наличии новых статей на сайте, добавляем их в очередь рассылки.
Ещё раз повторяю, что данный способ рассчитан уже не новичков в PHP и MySQL, поэтому если Вам просто нужна самая обычная подписка на сайте, то используйте сторонние сервисы. А если у Вас уже есть нормальный опыт, и Вы хотите полностью контролировать все процессы рассылки обновлений сайта, то используйте 2-й варинт.
-
- Михаил Русаков
Комментарии (24):
Михаил спасибо , как раз создаю скрипт рассылки, будет где подглядеть :))))!
Ответить
НУ и как получилось?
Ответить
ссылку поправьте на http://feedburner.google.com/ не правильно работает.
Ответить
Исправил. Спасибо!
Ответить
Михаил а, вот ты говорите чтоб не загружать работой сервер, или у хостера есть ограничение на рассылку сообщений(типа лимита) ... Нельзя ли поставить в конце цикла функцию sleep(); ? Будет ли это выходом при том что хостер слабенький?
Ответить
sleep(), в принципе, выход, но это всё-таки работа скрипта. А если будет много сообщений, то скрипт будет вынужденно непрерывно работать часами, либо вообще вечно. И если случайно будет сбой, то Вы об этом нескоро узнаете, поскольку скрипт не запустится без Вас.
Ответить
Я не понимаю а как сделать так сделать форму подписки и куда указывать ссылку на кнопке подписаться. И как мне статью каторую я разместил поставить на очередь рассылки.
Ответить
Ответ один на все данные вопросы: изучайте PHP, другого выхода нет.
Ответить
а как мне называть таблицу ?
Ответить
Это не важно, как угодно. Если придумаете совсем не подходящее имя, phpmyadmin Вам об этом сообщит.
Ответить
Исправьте опечатку, вы забыли восклицателтный знак, или мне кажется? ( if ($result_set->num_rows == 0) { $result_set = $db->query("SELECT * FROM `posts` WHERE `id`>'".$last_subscribe["post_id"]."' LIMIT 1"); )
Ответить
Здесь всё правильно, если всё уже было отправлено (то есть количество записей равно 0), то ищем новые статьи.
Ответить
Михаил, здравствуйте! А как сделать так, чтобы подписчикам отправлялась не вся статья (как происходит с моей подпиской, сделанной через Smartresponder), а только её анонс? Спасибо.
Ответить
Отправлять только анонс, как бы очевидно это не звучало.
Ответить
Ни как не могу понять данную строчку, может вы мне подробнее объясните? if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$last_id'"); // Всё отправлено
Ответить
Каждый раз отправляется по 10 сообщений, и если в выборке было только 10 сообщений или меньше, то, значит, письма все отправлены, и ставится флаг в базе, чтобы больше к этой рассылке скрипт не возвращался.
Ответить
Спасибо.
Ответить
Кто уже реализовал у себя рассылку пожалуйста отзовитесь. Расскажите какие подводные камни при создании и эксплуатации, и всё остальное... Я очень прошу, отзовитесь.
Ответить
Михаил, а как составить правило в крон чтобы запускалось каждые 10 минут?
Ответить
http://myrusakov.ru/use-cron.html
Ответить
Не получается, он добавил первую запись, и всё. В цикле сделал отправку письма с ссылкой на статью но не приходит, а если поставить просто отправку для теста то приходит, не пойму в чём прикол...
Ответить
И вот ещё ошибка с переменной, как может быть айди рассылки равной айди подписчика? if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$last_id'"); // Всё отправлено А нужно так if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$id'"); // Всё отправлено А в переменную $id поставить значение: $id = $last_subscribe['id'];
Ответить
Спасибо, исправил!
Ответить
Спасибо, Михаил, все работает. Только у меня возникла сложность при рассылке подписчикам по категории. Можете хоть на словах объяснить как это реализовать? (У меня статья может быть в нескольких категориях и пользователь может подписаться на несколько категорий). Пробовал вот такой запрос - $result_set = $db->query("SELECT * FROM `shop_users` WHERE `id`>'$last_id' AND `podpiska_cat` IN( SELECT `cat_id` FROM `shop_art_cat` WHERE `art_id` = ".$last_subscribe['art_id'].")"); но отправляет письмо только тому подписчику у которого id категории стоит на первом месте(в столбце `podpiska_cat`). Что-то я не могу сообразить!
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.