暫無描述

GATracking.php 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace MailPoet\Statistics;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Models\Newsletter;
  5. use MailPoet\Newsletter\Links\Links as NewsletterLinks;
  6. use MailPoet\Util\Helpers;
  7. use MailPoet\Util\SecondLevelDomainNames;
  8. class GATracking {
  9. /** @var SecondLevelDomainNames */
  10. private $secondLevelDomainNames;
  11. /** @var NewsletterLinks */
  12. private $newsletterLinks;
  13. public function __construct(
  14. NewsletterLinks $newsletterLinks
  15. ) {
  16. $this->secondLevelDomainNames = new SecondLevelDomainNames();
  17. $this->newsletterLinks = $newsletterLinks;
  18. }
  19. public function applyGATracking($renderedNewsletter, $newsletter, $internalHost = null) {
  20. if ($newsletter instanceof Newsletter && $newsletter->type == Newsletter::TYPE_NOTIFICATION_HISTORY) {
  21. $parentNewsletter = $newsletter->parent()->findOne();
  22. $field = $parentNewsletter->gaCampaign;
  23. } else {
  24. $field = $newsletter->gaCampaign;
  25. }
  26. if (!empty($field)) {
  27. $renderedNewsletter = $this->addGAParamsToLinks($renderedNewsletter, $field, $internalHost);
  28. }
  29. return $renderedNewsletter;
  30. }
  31. private function addGAParamsToLinks($renderedNewsletter, $gaCampaign, $internalHost = null) {
  32. // join HTML and TEXT rendered body into a text string
  33. $content = Helpers::joinObject($renderedNewsletter);
  34. $extractedLinks = $this->newsletterLinks->extract($content);
  35. $processedLinks = $this->addParams($extractedLinks, $gaCampaign, $internalHost);
  36. list($content, $links) = $this->newsletterLinks->replace($content, $processedLinks);
  37. // split the processed body with hashed links back to HTML and TEXT
  38. list($renderedNewsletter['html'], $renderedNewsletter['text'])
  39. = Helpers::splitObject($content);
  40. return $renderedNewsletter;
  41. }
  42. private function addParams($extractedLinks, $gaCampaign, $internalHost = null) {
  43. $processedLinks = [];
  44. $params = 'utm_source=mailpoet&utm_medium=email&utm_campaign=' . urlencode($gaCampaign);
  45. $internalHost = $internalHost ?: parse_url(home_url(), PHP_URL_HOST);
  46. $internalHost = $this->secondLevelDomainNames->get($internalHost);
  47. foreach ($extractedLinks as $extractedLink) {
  48. if ($extractedLink['type'] !== NewsletterLinks::LINK_TYPE_URL) {
  49. continue;
  50. } elseif (strpos((string)parse_url($extractedLink['link'], PHP_URL_HOST), $internalHost) === false) {
  51. // Process only internal links (i.e. pointing to current site)
  52. continue;
  53. }
  54. list($path, $search, $hash) = $this->splitLink($extractedLink['link']);
  55. $search = empty($search) ? $params : $search . '&' . $params;
  56. $processedLink = $path . '?' . $search . ($hash ? '#' . $hash : '');
  57. $link = $extractedLink['link'];
  58. $processedLinks[$link] = [
  59. 'type' => $extractedLink['type'],
  60. 'link' => $link,
  61. 'processed_link' => $processedLink,
  62. ];
  63. }
  64. return $processedLinks;
  65. }
  66. private function splitLink($link) {
  67. $parts = explode('#', $link);
  68. $hash = implode('#', array_slice($parts, 1));
  69. $parts = explode('?', $parts[0]);
  70. $path = $parts[0];
  71. $search = implode('?', array_slice($parts, 1));
  72. return [$path, $search, $hash];
  73. }
  74. }