From 84294b7ee6b1716ba22eaf3df63a1cfdaaea68c6 Mon Sep 17 00:00:00 2001
From: Vlad
Date: Wed, 13 Apr 2016 22:00:13 -0400
Subject: [PATCH] - Adds subsription tracking option to Settings->Advanced -
Updates sending queue worker to not replace links if tracking is disabled
Closes #417
---
lib/Cron/Workers/SendingQueue.php | 35 +++++++++++--------
.../Shortcodes/Categories/Subscription.php | 30 +++++++++++++---
lib/Newsletter/Shortcodes/Shortcodes.php | 17 +++++----
lib/Statistics/Track/Clicks.php | 26 ++++++++++++--
views/settings/advanced.html | 33 +++++++++++++++++
5 files changed, 112 insertions(+), 29 deletions(-)
diff --git a/lib/Cron/Workers/SendingQueue.php b/lib/Cron/Workers/SendingQueue.php
index 6700e6a17e..38f1a9d51a 100644
--- a/lib/Cron/Workers/SendingQueue.php
+++ b/lib/Cron/Workers/SendingQueue.php
@@ -76,14 +76,19 @@ class SendingQueue {
if($queue->newsletter_rendered_body === null) {
// render newsletter
$rendered_newsletter = $this->renderNewsletter($newsletter);
- // extract and replace links
- $processed_newsletter = $this->processLinks(
- $this->joinObject($rendered_newsletter),
- $newsletter['id'],
- $queue->id
- );
- list($newsletter['body']['html'], $newsletter['body']['text']) =
- $this->splitObject($processed_newsletter);
+ if((int) Setting::getValue('tracking.enabled') === 1) {
+ // extract and replace links
+ $processed_newsletter = $this->processLinks(
+ $this->joinObject($rendered_newsletter),
+ $newsletter['id'],
+ $queue->id
+ );
+ list($newsletter['body']['html'], $newsletter['body']['text']) =
+ $this->splitObject($processed_newsletter);
+ }
+ else {
+ $newsletter['body'] = $rendered_newsletter;
+ }
$queue->newsletter_rendered_body = json_encode($newsletter['body']);
$queue->newsletter_rendered_body_hash = md5($newsletter['body']['text']);
$queue->save();
@@ -200,12 +205,14 @@ class SendingQueue {
$subscriber,
$this->joinObject($data_for_shortcodes)
);
- $processed_newsletter = $this->replaceLinks(
- $newsletter['id'],
- $subscriber['id'],
- $queue->id,
- $processed_newsletter
- );
+ if((int) Setting::getValue('tracking.enabled') === 1) {
+ $processed_newsletter = $this->replaceLinks(
+ $newsletter['id'],
+ $subscriber['id'],
+ $queue->id,
+ $processed_newsletter
+ );
+ }
list($newsletter['subject'],
$newsletter['body']['html'],
$newsletter['body']['text']
diff --git a/lib/Newsletter/Shortcodes/Categories/Subscription.php b/lib/Newsletter/Shortcodes/Categories/Subscription.php
index ed3a10e959..143f9e56e3 100644
--- a/lib/Newsletter/Shortcodes/Categories/Subscription.php
+++ b/lib/Newsletter/Shortcodes/Categories/Subscription.php
@@ -1,5 +1,6 @@
'.__('Unsubscribe').'';
break;
case 'unsubscribe_url':
- return SubscriptionUrl::getUnsubscribeUrl($subscriber);
+ return self::processUrl(
+ $action,
+ SubscriptionUrl::getUnsubscribeUrl($subscriber)
+ );
break;
case 'manage':
return ''.__('Manage subscription').'';
break;
case 'manage_url':
- return SubscriptionUrl::getManageUrl($subscriber);
+ return self::processUrl(
+ $action,
+ SubscriptionUrl::getManageUrl($subscriber)
+ );
break;
default:
@@ -45,4 +58,11 @@ class Subscription {
break;
}
}
+
+ static function processUrl($action, $url) {
+ if((int) Setting::getValue('tracking.enabled') === 1) {
+ return sprintf('[subscription:%s]', $action);
+ }
+ return $url;
+ }
}
\ No newline at end of file
diff --git a/lib/Newsletter/Shortcodes/Shortcodes.php b/lib/Newsletter/Shortcodes/Shortcodes.php
index 67ad4f2177..4d6ffa64dc 100644
--- a/lib/Newsletter/Shortcodes/Shortcodes.php
+++ b/lib/Newsletter/Shortcodes/Shortcodes.php
@@ -18,18 +18,21 @@ class Shortcodes {
return array_unique($shortcodes[0]);
}
+ function match($shortcode) {
+ preg_match(
+ '/\[(?P\w+):(?P\w+)(?:.*?default:(?P.*?))?\]/',
+ $shortcode,
+ $match
+ );
+ return $match;
+ }
+
function process($shortcodes, $text) {
$processed_shortcodes = array_map(
function($shortcode) use($text) {
- preg_match(
- '/\[(?P\w+):(?P\w+)(?:.*?default:(?P.*?))?\]/',
- $shortcode,
- $shortcode_details
- );
+ $shortcode_details = $this->match($shortcode);
$shortcode_type = ucfirst($shortcode_details['type']);
$shortcode_action = $shortcode_details['action'];
- // do not process subscription management links
- if ($shortcode_type === 'Subscription') return $shortcode;
$shortcode_class =
__NAMESPACE__ . '\\Categories\\' . $shortcode_type;
$shortcode_default_value = isset($shortcode_details['default'])
diff --git a/lib/Statistics/Track/Clicks.php b/lib/Statistics/Track/Clicks.php
index 3c207e2a5b..7e654ff5f9 100644
--- a/lib/Statistics/Track/Clicks.php
+++ b/lib/Statistics/Track/Clicks.php
@@ -3,6 +3,8 @@ namespace MailPoet\Statistics\Track;
use MailPoet\Models\NewsletterLink;
use MailPoet\Models\StatisticsClicks;
+use MailPoet\Models\Subscriber;
+use MailPoet\Subscription\Url as SubscriptionUrl;
if(!defined('ABSPATH')) exit;
@@ -17,8 +19,10 @@ class Clicks {
$url = ($url) ? $url : $this->url;
if(!preg_match('/\d+-\d+-\d+-[a-zA-Z0-9]/', $url)) $this->abort();
list ($newsletter_id, $subscriber_id, $queue_id, $hash) = explode('-', $url);
- $link = NewsletterLink::where('hash', $hash)->findOne();
- if(!$link) $this->abort();
+ $subscriber = Subscriber::findOne($subscriber_id);
+ $link = NewsletterLink::where('hash', $hash)
+ ->findOne();
+ if(!$link || !$subscriber) $this->abort();
$statistics = StatisticsClicks::where('link_id', $link->id)
->where('subscriber_id', $subscriber_id)
->where('newsletter_id', $newsletter_id)
@@ -36,7 +40,23 @@ class Clicks {
$statistics->count = (int) $statistics->count++;
$statistics->save();
}
- header('Location: ' . $link->url, true, 301);
+ $url = (preg_match('/\[subscription:.*?\]/', $link->url)) ?
+ $this->processSubscriptionUrl($link->url, $subscriber) :
+ $link->url;
+ header('Location: ' . $url, true, 302);
+ }
+
+ function processSubscriptionUrl($url, $subscriber) {
+ preg_match('/\[subscription:(.*?)\]/', $url, $match);
+ $action = $match[1];
+ if(preg_match('/unsubscribe/', $action)) {
+ $url = SubscriptionUrl::getUnsubscribeUrl($subscriber);
+ }
+ if(preg_match('/manage/', $action)) {
+ $url = SubscriptionUrl::getManageUrl($subscriber);
+ }
+ !ddd($url);
+ return $url;
}
private function abort() {
diff --git a/views/settings/advanced.html b/views/settings/advanced.html
index 0c1c836b2a..e2995d3604 100644
--- a/views/settings/advanced.html
+++ b/views/settings/advanced.html
@@ -61,6 +61,39 @@
+
+
+
+ |
+
+
+
+
+
+
+ |
+
|