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 @@

+ + + +