diff --git a/lib/Config/Env.php b/lib/Config/Env.php index 4d26ab21af..4ce1ca1428 100644 --- a/lib/Config/Env.php +++ b/lib/Config/Env.php @@ -27,6 +27,7 @@ class Env { static $db_password; static $db_charset; static $db_timezone_offset; + static $subscribers_limit = 2000; static function init($file, $version) { global $wpdb; diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 56005890a7..d8f181b7e5 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -34,6 +34,16 @@ class Menu { ); } + function checkSubscribersLimit() { + $subscribers_count = Subscriber::getTotalSubscribers(); + if($subscribers_count > Env::$subscribers_limit) { + echo $this->renderer->render('limit.html', array( + 'limit' => Env::$subscribers_limit + )); + exit; + } + } + function setup() { $main_page_slug = 'mailpoet-newsletters'; @@ -242,6 +252,8 @@ class Menu { } function settings() { + $this->checkSubscribersLimit(); + $settings = Setting::getAll(); $flags = $this->_getFlags(); @@ -314,12 +326,16 @@ class Menu { } function segments() { + $this->checkSubscribersLimit(); + $data = array(); $data['items_per_page'] = $this->getLimitPerPage('segments'); echo $this->renderer->render('segments.html', $data); } function forms() { + $this->checkSubscribersLimit(); + $data = array(); $data['items_per_page'] = $this->getLimitPerPage('forms'); @@ -329,6 +345,8 @@ class Menu { } function newsletters() { + $this->checkSubscribersLimit(); + global $wp_roles; $data = array(); diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index f759b1bf84..d0e18128a9 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -624,6 +624,13 @@ class Subscriber extends Model { ); } + static function getTotalSubscribers() { + return self::whereIn('status', array( + self::STATUS_SUBSCRIBED, + self::STATUS_UNCONFIRMED + ))->count(); + } + static function bulkTrash($orm) { $count = parent::bulkAction($orm, function($subscriber_ids) { self::rawExecute(join(' ', array( diff --git a/tests/unit/Models/SubscriberTest.php b/tests/unit/Models/SubscriberTest.php index 3dddebaac8..d8461ae1cf 100644 --- a/tests/unit/Models/SubscriberTest.php +++ b/tests/unit/Models/SubscriberTest.php @@ -438,6 +438,36 @@ class SubscriberTest extends MailPoetTest { expect($subscriber)->notEquals(false); } + function testItCanTheTotalNumberOfSubscribers() { + // remove all subscribers + Subscriber::deleteMany(); + + $subscriber_1 = Subscriber::createOrUpdate(array( + 'email' => 'subscriber_1@mailpoet.com', + 'status' => Subscriber::STATUS_SUBSCRIBED + )); + + $subscriber_2 = Subscriber::createOrUpdate(array( + 'email' => 'subscriber_2@mailpoet.com', + 'status' => Subscriber::STATUS_UNCONFIRMED + )); + + $subscriber_3 = Subscriber::createOrUpdate(array( + 'email' => 'subscriber_3@mailpoet.com', + 'status' => Subscriber::STATUS_UNSUBSCRIBED + )); + + // counts only subscribed & unconfirmed users + $total = Subscriber::getTotalSubscribers(); + expect($total)->equals(2); + + $subscriber_1->status = Subscriber::STATUS_UNSUBSCRIBED; + $subscriber_1->save(); + + $total = Subscriber::getTotalSubscribers(); + expect($total)->equals(1); + } + function _after() { ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); ORM::raw_execute('TRUNCATE ' . Segment::$_table); diff --git a/views/limit.html b/views/limit.html new file mode 100644 index 0000000000..059d17f0eb --- /dev/null +++ b/views/limit.html @@ -0,0 +1,28 @@ +<% extends 'layout.html' %> + +<% block content %> + +
+ <%= __("MailPoet 3 is currently limited to %d subscribers.") | format(limit) %> +
+ +<%= __("By sharing your data anonymously with us, you can help us understand how people use MailPoet and what sort of features they like and don't like.") %> <%= __('Find out more') %> →