diff --git a/lib/Statistics/GATracking.php b/lib/Statistics/GATracking.php index 8418263393..ee5c629545 100644 --- a/lib/Statistics/GATracking.php +++ b/lib/Statistics/GATracking.php @@ -44,11 +44,7 @@ class GATracking { private function addParams($extracted_links, $ga_campaign, $internal_host = null) { $processed_links = []; - $params = [ - 'utm_source' => 'mailpoet', - 'utm_medium' => 'email', - 'utm_campaign' => urlencode($ga_campaign), - ]; + $params = 'utm_source=mailpoet&utm_medium=email&utm_campaign=' . urlencode($ga_campaign); $internal_host = $internal_host ?: parse_url(home_url(), PHP_URL_HOST); $internal_host = $this->secondLevelDomainNames->get($internal_host); foreach ($extracted_links as $extracted_link) { @@ -58,7 +54,9 @@ class GATracking { // Process only internal links (i.e. pointing to current site) continue; } - $processed_link = WPFunctions::get()->addQueryArg($params, $extracted_link['link']); + list($path, $search, $hash) = $this->splitLink($extracted_link['link']); + $search = empty($search) ? $params : $search . '&' . $params; + $processed_link = $path . '?' . $search . ($hash ? '#' . $hash : ''); $link = $extracted_link['link']; $processed_links[$link] = [ 'type' => $extracted_link['type'], @@ -68,4 +66,13 @@ class GATracking { } return $processed_links; } + + private function splitLink($link) { + $parts = explode('#', $link); + $hash = implode('#', array_slice($parts, 1)); + $parts = explode('?', $parts[0]); + $path = $parts[0]; + $search = implode('?', array_slice($parts, 1)); + return [$path, $search, $hash]; + } } diff --git a/tests/integration/Statistics/GATrackingTest.php b/tests/integration/Statistics/GATrackingTest.php index 9c74d224db..843d6c63dc 100644 --- a/tests/integration/Statistics/GATrackingTest.php +++ b/tests/integration/Statistics/GATrackingTest.php @@ -23,8 +23,8 @@ class GATrackingTest extends \MailPoetTest { $this->ga_campaign = 'Spring email'; $this->link = add_query_arg(['foo' => 'bar', 'baz' => 'xyz'], 'http://www.mailpoet.com/'); $this->rendered_newsletter = [ - 'html' => '
Click here. Do not process this [link:some_link_shortcode]
', - 'text' => '[Click here](' . $this->link . '). [Do not process this](http://somehost.com/fff/?abc=123) [link:some_link_shortcode]', + 'html' => 'Click here. Do not process this [link:some_link_shortcode]
', + 'text' => '[Click here](' . $this->link . '). [Do not process this](http://somehost.com/fff/?abc=123&email=[subscriber:email]) [link:some_link_shortcode]', ]; } @@ -69,6 +69,16 @@ class GATrackingTest extends \MailPoetTest { expect($result['html'])->contains('utm_campaign=' . urlencode($this->ga_campaign)); } + function testItKeepsShorcodes() { + $tracking = new GATracking(); + $newsletter = Newsletter::createOrUpdate([ + 'ga_campaign' => $this->ga_campaign, + ]); + $result = $tracking->applyGATracking($this->rendered_newsletter, $newsletter, $this->internal_host); + expect($result['text'])->contains('email=[subscriber:email]'); + expect($result['html'])->contains('email=[subscriber:email]'); + } + function _after() { \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); }